我想对图像进行负面转换,这是一个非常简单的程序。
但是当我运行该程序时。我想要转换图像中的所有像素,但只处理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;
}
答案 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]];
}
}