算法原理
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);
}
补充说明:
- 本案例在.NET使用的OpenCV库为OpenCvSharp4
- 对整个图像的边缘提取可将左上到右下及右上到左下方向的图片相加得到;