1

我有一个带有 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是这个:

在此处输入图像描述

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

我在某个地方做错了吗?

4

2 回答 2

3

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

在 OpenCV 中,图像格式由创建图像时的标志设置,例如CV_8UC3表示 8 位像素、无符号、3 个颜色通道。在彩色图像中,像素顺序为BGR,数据按行顺序存储。同样,BGRA对于CV_8UC4. 所以你设置的值是蓝色而不是红色,这就是你得到蓝色的原因。

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

原因是,对于压缩图像类型,例如JPG,它们不能保证精确地保留内容。尝试imwrite()使用未压缩的BMP图像(通常)。您将获得如下图像:

在此处输入图像描述

于 2014-01-13T19:15:12.780 回答
0

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

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

对于彩色图像,通道顺序通常是蓝、绿、红

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

(这是让 Opencv 程序员的生活变得悲惨的事情之一)

于 2014-01-13T22:42:00.253 回答