Opencv卷积矩阵给出了不寻常的结果

时间:2016-04-26 04:39:38

标签: c++ opencv matrix filter convolution

所以我有一个程序试图将简单的3x3卷积矩阵应用于图像。

这是正在开展工作的功能:

Mat process(Mat image) {

    int x = 2;
    int y = 2;
    Mat nimage(image); //just a new mat to put the resulting image on

    while (y < image.rows-2) {

        while (x < image.cols-2) {

            nimage.at<uchar>(y,x) = //apply matrix to pixel
            image.at<char>(y-1,x-1)*matrix[0]+
            image.at<char>(y-1,x)*matrix[1]+
            image.at<char>(y-1,x+1)*matrix[2]+
            image.at<char>(y,x-1)*matrix[3]+
            image.at<char>(y,x)*matrix[4]+
            image.at<char>(y,x+1)*matrix[5]+
            image.at<char>(y+1,x-1)*matrix[6]+
            image.at<char>(y+1,x)*matrix[7]+
            image.at<char>(y+1,x+1)*matrix[8];

            //if (total < 0) total = 0;
            //if (total > 255) total = 255;

            //cout << (int)total << ": " << x << "," << y << endl;

            x++;
        }

        x = 0;
        y++;
    }

    cout << "done" << endl;

    return nimage;

}

矩阵看起来像这样

double ar[9] = {-1,0,0,
                0,2,0,
                0,0,0};

用作输入的图像如下所示:

所需的输出(我在GIMP中的输入图像上运行相同的矩阵):

结果是......很奇怪:

我认为这与我在设置新图像的像素(nimage.at<uchar>(y,x) = ...)时使用的数据类型有关,因为每当我更改它时,我会得到一个不同但仍然不正确的结果。

1 个答案:

答案 0 :(得分:0)

关于m的复制构造函数的OpenCV文档,强调我的:

  

m - 将(作为整体或部分)分配给构造矩阵的数组。这些构造函数不会复制任何数据。相反,构造指向m数据或其子数组的标题并将其与之关联。参考计数器(如果有)递增。 因此,当您修改使用此类构造函数形成的矩阵时,还会修改Mat::clone()的相应元素。如果您想拥有子阵列的独立副本,请使用Mat nimage(image); //just a new mat to put the resulting image on

所以

Mat

实际上并没有创建新的矩阵;它会创建一个新的nimage.at(y,x)对象,但该对象仍然引用相同的矩阵。从那时起image.at(y,x)就像Mat nimage(image.clone()); //just a new mat to put the resulting image on 一样。

要复制图像,请使用

{{1}}