在OpenCV中手动实施Sobel算子

时间:2017-06-28 17:40:55

标签: c++ opencv image-processing

我试图通过迭代图像并对周围像素应用蒙版来应用sobel算子。

目前,我正在尝试应用蒙版的垂直部分,即:

-1 0 1
-2 0 2
-1 0 1

在我的实现中,我按如下方式遍历行和列:

for (int i = 1; i < image.rows-1; i++){
            for (int j = 1; j < image.cols-1; j++){
            int pixel1 = image.at<Vec3b>(i-1,j-1)[0] * -1;
            int pixel2 = image.at<Vec3b>(i,j-1)[0] * 0;
            int pixel3 = image.at<Vec3b>(i+1,j-1)[0] * 1;

            int pixel4 = image.at<Vec3b>(i-1,j)[0] * -2;
            int pixel5 = image.at<Vec3b>(i,j)[0] * 0;
            int pixel6 = image.at<Vec3b>(i+1,j)[0] * 2;

            int pixel7 = image.at<Vec3b>(i-1,j+1)[0] * -1;
            int pixel8 = image.at<Vec3b>(i,j+1)[0] * 0;
            int pixel9 = image.at<Vec3b>(i+1,j+1)[0] * 1;

            int sum = pixel1 + pixel2 + pixel3 + pixel4 + pixel5 + pixel6 + pixel7 + pixel8 + pixel9;
            verticalSobel.at<Vec3b>(i,j)[0] = sum;
            verticalSobel.at<Vec3b>(i,j)[1] = sum;
            verticalSobel.at<Vec3b>(i,j)[2] = sum;
        }
    }

像素标记为:

1 2 3
4 5 6
7 8 9

但是,生成的图像与它应该的样子相差甚远。

作为参考,生成的图像为enter image description here

它看起来应该类似于: enter image description here

我使用的指南是:https://www.tutorialspoint.com/dip/sobel_operator.htm

我不确定我是否只是错误地实现了操作符,或者只是错误地迭代了图像。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

你似乎遇到总和为负的问题。取sum的绝对值,并将其钳制为255(或者代替绝对值,将其钳制为0 - 取决于您想要达到的目标。“完整”的sobel算子通常使用2d距离公式,所以a仅水平/垂直变量应使用绝对值)