OpenCV 画像エッジ抽出 (1) - Robert 演算子の原理と純粋なアルゴリズムの実装 (C#)

アルゴリズム原理

Robert 演算子 (別名 Roberts エッジ検出演算子) は、ローカル差分演算子を使用してエッジを見つける演算子です。以下に示すように、ロバート 演算子は画像の対角方向の勾配を解決してエッジを見つけるために使用されます。
ここに画像の説明を挿入します

勾配の計算:
ここに画像の説明を挿入します

ここに画像の説明を挿入します

計算の図:
ここに画像の説明を挿入します
(0, 0) のピクセルの最初の畳み込み計算結果は次のとおりです: |120×1+125×(-1)|=5

アルゴリズムの実装

コード実装 (純粋なアルゴリズム):

            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
    
    
                
                picFile = fileDialog.FileName;
                inputMat = Cv2.ImRead(picFile, ImreadModes.Grayscale);
                outMat = new Mat(new Size(inputMat.Cols, inputMat.Rows), inputMat.Type());

                for (int i = 0; i < inputMat.Rows - 1; i++)
                {
    
    

                    for (int j = 0; j < inputMat.Cols - 1; j++)
                    {
    
    
                        var left_up = inputMat.Get<byte>(i, j);
                        var right_down= inputMat.Get<byte>(i+1, j+1);
                        var result = Math.Abs(left_up - right_down);
                        outMat.Set<byte>(i, j, OpenCvSharp.Internal.Util.SaturateCast.ToByte(result));
                    }
                }
                picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
                picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(outMat);
            }

ここに画像の説明を挿入します

同様に、右上から左下方向のエッジを保持するために以下の演算子を定義します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

OpenCV APIの実装

          if (fileDialog.ShowDialog() == DialogResult.OK)
            {
    
    
                

                picFile = fileDialog.FileName;
                inputMat = Cv2.ImRead(picFile, ImreadModes.Grayscale);
                outMat = new Mat(new Size(inputMat.Cols, inputMat.Rows), inputMat.Type());

                //左上到右下方向滤波器
                InputArray kernel = InputArray.Create<int>(new int[2, 2] {
    
     {
    
     1, 0}, {
    
     0, -1 } });
                Cv2.Filter2D(inputMat, outMat, MatType.CV_16SC1, kernel);
                
                //矩阵取绝对值
                Cv2.ConvertScaleAbs(outMat, outMat);
                picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
                picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(outMat);
            }

ここに画像の説明を挿入します

追加の指示:

  1. この場合に使用される .NET の OpenCV ライブラリはOpenCvSharp4です。
  2. 画像全体のエッジ抽出は、左上から右下、右上から左下の方向に画像を加算することで得られます。

.NET環境用のOpenCvライブラリ

おすすめ

転載: blog.csdn.net/weixin_40671962/article/details/127002094