Opencv只处理图像的各个部分

时间:2017-12-04 12:40:45

标签: c++ opencv

我想对图像进行负面转换,这是一个非常简单的程序。

但是当我运行该程序时。我想要转换图像中的所有像素,但只处理1/3部分像素。我不确定哪里出错了。我跟着这本书的所有代码。但结果却不同。

我认为列有问题,但是当我用negativeImage函数中的I.cols值改变image的实际值时。输出仍保持不变。只处理1/3部分图像。如果我是I.cols的3倍,则可以处理iamge中的所有像素。

vector<uchar> getNegativeLUT() {
vector<uchar> LUT(256, 0);
for (int i = 0; i < 256; ++i)
    LUT[i] = (uchar)(255 - i);
return LUT;
}

void negativeImage(Mat& I) {
vector<uchar> LUT = getNegativeLUT();
for (int i = 0; i < I.rows; ++i) {
    for (int j = 0; j <  I.cols; ++j) {
        I.at<uchar>(i, j) = LUT[I.at<uchar>(i, j)];
        //stack overflow
    }   
  }
}

int main() {
Mat image = imread("1.png");
Mat processed_image2 = image.clone();
negativeImage(processed_image2);
printf("%d", image.cols);

imshow("Input Image", image);
imshow("Negative Image", processed_image2);
waitKey(0);

return 0;
}

Output Image

1 个答案:

答案 0 :(得分:1)

您需要使用C:\Users\yourUserName\AppData\Local\.meteor\运算符输入正确的类型。您的PNG图像必须转换为8UC1,然后使用at<>类型访问每个像素。我想你的图像有3个通道,所以你只迭代图像的1/3。另外,我建议你在行循环中使用uchar运算符,然后将像素作为数组访问。

ptr<>

编辑:您应该使用cv::LUT而不是自己动手。

Mat M;
cvtColor(I, M, CV_BGR2GRAY);

// M is CV_8UC1 type
for(int i = 0; i < M.rows; i++)
{
    uchar* p  = M.ptr<uchar>(i);
    for(int j = 0; j < I.cols; j++)
    {
        p[j] = LUT[p[j]];
    }
}