アルゴリズム原理
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);
}
追加の指示:
- この場合に使用される .NET の OpenCV ライブラリはOpenCvSharp4です。
- 画像全体のエッジ抽出は、左上から右下、右上から左下の方向に画像を加算することで得られます。