opencv矩阵多通道访问和填充

时间:2014-01-13 19:07:43

标签: c++ opencv matrix channels

我有一个包含3个通道的矩阵,我有一个问题是访问和更改元素的值。我有这段代码:

Mat m(4,4, CV_8UC3);   
Vec3b a;
a[0] = 255;
a[1] = 0;
a[2] = 0;
m.at<Vec3b>(0,0) = a;

当我打印矩阵m时,我有这个:

[255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

这很好,但是我用imwrite存储矩阵时得到的图像是这样的:

enter image description here

我不明白为什么它是蓝色的,为什么我有一个正方形的2x2蓝色,我应该只有第一个像素红色没有?

我在某个地方犯了错误吗?

2 个答案:

答案 0 :(得分:3)

  

我不明白为什么它是蓝色的......不是红色的?

在OpenCV中,图像格式是在创建图像时通过标志设置的,例如CV_8UC3表示8位像素,无符号,3种颜色通道。在彩色图像中,像素顺序为BGR,数据按行顺序存储。同样,BGRACV_8UC4。所以你设置的值是蓝色而不是红色,这就是为什么你变蓝了。

  

我应该只有第一个像素......?

原因在于,对于压缩图像类型,例如JPG,他们无法保证准确保留内容。尝试imwrite()对未压缩的例如BMP图片(通常)。您将获得如下图像:

enter image description here

答案 1 :(得分:0)

如前所述,高强度像素旁边的像素在JPG压缩后采用非零值,因为JPEG是一种有损算法。实际上,JPEG压缩会在具有强梯度的图像区域中精确地丢弃信息。

至于你的第二个问题:由于Opencv怪癖,你的像素是蓝色的:颜色通道不是以R,G,B顺序存储,而是以B,G,R顺序存储:

  

对于彩色图像,通道排序通常为蓝色,绿色,红色

来源:http://docs.opencv.org/modules/core/doc/drawing_functions.html?highlight=green

(这是让Opencv程序员生活痛苦的事情之一)