2017-09-26 143 views
0

我想修改图像的每个像素。但结果并不像我预料的那样。OpenCV修改图像像素

原图:

enter image description here

结果:

enter image description here

For循环修改每一个像素:

image = imread("image.png", CV_LOAD_IMAGE_COLOR) 
unsigned char value; 

for (int col = 0; col < image.cols; col++){ 
    for (int row = 0; row < image.rows; row++){ 
     value = image.at<unsigned char>(row,col); 
     value *= 0; 
     image.at<unsigned char>(row, col) = value; 
    } 
} 

所以我不知道在哪里的错误是,我想问你我如果你知道答案。

回答

5

对于3通道无符号字符图像,您需要在循环遍历行和列时使用Vec3b访问所有3个通道。

image = imread("image.png", CV_LOAD_IMAGE_COLOR) 
Vec3b value; 

for (int row = 0; row < image.rows; row++){ 
    for (int col = 0; col < image.cols; col++){ 
     //Vec3b as typename 
     value = image.at<Vec3b>(row,col); 
     value *= 0; 
     image.at<Vec3b>(row, col) = value; 
    } 
} 
+0

由于对所有像素都进行了相同的操作,我更喜欢矩阵表达式 - 更快更简洁。 |考虑到OP乘以0,一个简单的'setTo'或甚至只是一个标量分配就可以做到。 –

+0

@DanMašek是的,还有很多其他的方式(例如矩阵乘法,位运算,parallel_for等)来执行这个操作。但是,由于OP似乎是简历初学者,并且对访问每个像素感兴趣,因此我给出了相应的答案。 – zindarod