Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Sobel算子的实现_C++_Opencv_Vision - Fatal编程技术网

C++ Sobel算子的实现

C++ Sobel算子的实现,c++,opencv,vision,C++,Opencv,Vision,我试图在水平和垂直方向上实现一个sobel操作符。但不知何故,我得到了相反的输出。我在下面附上的代码。对于水平遮罩 char mask [3][3]= {{-1,-2,-1},{0,0,0},{1,2,1}}; void masking(Mat image){ Mat temImage= image.clone(); for (int i = 1; i < image.rows-1; i++) { for (int j = 1; j < image.cols-1; j+

我试图在水平和垂直方向上实现一个sobel操作符。但不知何故,我得到了相反的输出。我在下面附上的代码。对于水平遮罩

char mask [3][3]=  {{-1,-2,-1},{0,0,0},{1,2,1}};

void masking(Mat image){

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

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

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

            int sum = pixel1 + pixel2 + pixel3 + pixel4 + pixel5 + pixel6 + pixel7 + pixel8 + pixel9;
            if(sum < 0)
            {
                sum = 0;
            }

            if(sum > 255)
                sum = 255;

            temImage.at<Vec3b>(i,j)[k] = sum;


        }
    }
}
//printf("conter = %d",counter);
imshow( "Display", temImage );
imwrite("output1.png",temImage);
}

根据指南,我应该得到反向输出。有人能帮我吗

原始图像是


不,没有错,它谈论的是遮罩而不是渐变。该教程的弱点在于它没有提到我们正在使用他们所谓的垂直遮罩计算水平梯度。

你是对的,教程是错误的:)在
x
中,你应该看到垂直线,在
y
中,你应该看到水平线。在您的例子中,垂直方向是
y
,水平方向是
x
,请参见以了解我的意思(以符号表示)。同时检查此项以查看输出。您始终可以使用opencv比较结果,水平方向使用xorder=1(和yorder=0),垂直方向使用yorder=1(和xorder=0)。它们颠倒了顺序。看这里。或者他们的想法是,你们可以在垂直过滤器中看到垂直线,在水平过滤器中看到水平线。“那是不对的。”我认为教程中的图像是相反的。此外,opencv
at
函数采用(y,x)坐标,因此代码中的顺序是正确的。教程似乎以正确的方式解释了它,只是图像是错误的
char mask [3][3]=  {{-1,0,1},{-2,0,2},{-1,0,1}}; 

void masking(Mat image){

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

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

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

            int sum = pixel1 + pixel2 + pixel3 + pixel4 + pixel5 + pixel6 + pixel7 + pixel8 + pixel9;
            if(sum < 0)
            {
                sum = 0;
            }

            if(sum > 255)
                sum = 255;

            temImage.at<Vec3b>(i,j)[k] = sum;


        }
    }
}
//printf("conter = %d",counter);
imshow( "Display", temImage );
imwrite("output1.png",temImage);
int main( int argc, char** argv ){
Mat input_image = imread("sobel1.jpg",1);
masking(input_image);
waitKey(0);
return 0;