设置彩色像素的Opencv最终会模糊相邻像素

我试图在OpenCV中设置CV_8UC3类型图像的像素值。 我知道如何用单通道图像CV_8UC1来做到这CV_8UC1 ,但是当对三通道图像做同样的事情时,即使像素值没有改变,像素值也会模糊到相邻像素。

这是我如何使用单个通道图像来完成的:

Mat tmp(5, 5, CV_8UC1, Scalar(0));
uchar *tmp_p = tmp.ptr();
tmp_p[0] = (uchar)255;
imwrite("tmp.jpg", tmp);

由此产生的图像就像您期望的那样,只是第一个像素从黑色变为白色,而其他所有像素都保持独立。

以下是我期望通过三通道图像进行处理的方式:

Mat tmp(5, 5, CV_8UC3, Scalar(0));
uchar *tmp_p = tmp.ptr();
tmp_p[0] = (uchar)255;
imwrite("tmp.jpg", tmp);

该过程的预期结果应该在图像的左上角产生一个蓝色像素。 然而,相邻的3个像素似乎与我设置的像素值“模糊”。

如果有人知道为什么会出现这种像素模糊现象,我非常感谢能够获得的任何帮助。


事实证明,问题出现在图像文件格式中。 我正在输出图像作为修改像素的.jpg 。 将文件类型更改为.png此问题已得到纠正。

这是我现在的代码,在输出到文件之前以及在输出的文件中重新读取之后,打印到原始图像的控制台。

// create a small black image and
// change the color of the first pixel to blue
Mat tmp(5, 5, CV_8UC3, Scalar(0));
uchar *tmp_p = tmp.ptr();
tmp_p[0] = (uchar)255;

// output values to the console
cout << tmp << endl << endl;

// write out image to a file then re-read back in
#define CORRECTMETHOD // comment out this line to see what was wrong before
#ifdef CORRECTMETHOD
    imwrite("tmp.png", tmp);
    tmp = imread("tmp.png");
#else
    imwrite("tmp.jpg", tmp);
    tmp = imread("tmp.jpg");
#endif

// print out values to console (these values
// should match the original image created above)
cout << tmp << endl;
链接地址: http://www.djcxy.com/p/15879.html

上一篇: Opencv setting a color pixel ends up blurring to neighboring pixels

下一篇: Opencv C++ Error, unable to obtain pixel intensity value for certain pixels