在opencv2 C ++中创建3x3 sobel运算符

时间:2011-10-13 03:10:05

标签: opencv computer-vision

我试图根据我在下面的代码中的三个通道上的gx和gy矩阵创建我自己的sobel边缘检测。
    [[0,1,2],      [-1,0,1],       [-2,-1,0] 和

[-2,-1,0],
 [-1,0,1],
 [0,1,2]]

我在我的代码中进一步编辑了变量j和i,但它不起作用,我如何在这三个通道上创建sobel边缘检测

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void salt(cv::Mat &image, int n) {

int i,j;
for (int k=0; k<n; k++) {

    // rand() is the MFC random number generator
    i= rand()%image.cols;
    j= rand()%image.rows;


    if (image.channels() == 1) { // gray-level image

        image.at<uchar>(j,i)= 255; 

    } else if (image.channels() == 3) { // color image

        image.at<cv::Vec3b>(j,i)[0]= 255; 
        image.at<cv::Vec3b>(j-1,i-1)[1]= 255; 
        image.at<cv::Vec3b>(j,i-1)[2]= 255; 
    }
}
}

int main()
{
srand(cv::getTickCount()); // init random number generator

cv::Mat image= cv::imread("space.jpg",0);

salt(image,3000);

cv::namedWindow("Image");
cv::imshow("Image",image);

cv::imwrite("salted.bmp",image);

cv::waitKey(5000);

return 0;
}

1 个答案:

答案 0 :(得分:0)

我对这个问题感到有些困惑,因为这个问题与sobel滤镜有关,但是你提供的功能会给图像增加噪点。

首先,这里是Sobel函数,它将调用经典的sobel函数(将计算dx和dy渐变)。

其次,有更通用的filter2D可以让你应用任意内核(就像你在问题中创建的那样)。

最后,如果你想在每个通道或波段中应用不同的内核,你可以像filter2D文档所暗示的那样,在图像上调用split,然后在每个通道上调用filter2D,然后将值组合成一个使用矩阵运算符的单波段图像。

我认为你可以问的最复杂的事情是如何找到你添加到图像中的盐的位置,答案就是为每个乐队制作一个内核,如下所示:

乐队0:

[[ 0, 0, 0],
 [ 0, 1, 0],
 [ 0, 0, 0]]

乐队1:

[[ 1, 0, 0],
 [ 0, 0, 0],
 [ 0, 0, 0]]

乐队2:

[[ 0, 1, 0],
 [ 0, 0, 0],
 [ 0, 0, 0]]

确保将锚点放在内核(1,1)的中心。