Bootstrap

OpenCV 图像边缘提取(一)—— Robert算子原理及纯算法实现(C#)

算法原理

Robert算子,又称Roberts边缘检测算子,是一种利用局部差分算子寻找边缘的算子, Robert算子是用于求解图像对角线方向的梯度来寻找边缘的,如下图:
在这里插入图片描述

梯度计算:
在这里插入图片描述

在这里插入图片描述

计算图示说明:
在这里插入图片描述
位于(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库

;