如果我需要访问底层数据,我应该为 Opencv 图像使用啥格式?

Posted

技术标签:

【中文标题】如果我需要访问底层数据,我应该为 Opencv 图像使用啥格式?【英文标题】:What format should I use for a Opencv image if I need to access the underlaying data?如果我需要访问底层数据,我应该为 Opencv 图像使用什么格式? 【发布时间】:2021-06-30 15:48:39 【问题描述】:

我制作了一个使用 OpenCL 创建图像的程序,在 OpenCL 代码中我必须访问 opencv-image 的底层数据并直接修改它,但我不知道数据在内部是如何排列的。

我目前正在使用CV_8U,因为表示非常简单,0 黑色 255 白色以及介于两者之间的所有内容,但我想添加颜色,但我不知道使用什么格式。

这就是我目前修改图像A[y*width + x] = 255;的方式。

【问题讨论】:

【参考方案1】:

由于您的A[y*width + x] = 255; 工作正常,那么底层图像数据 A 必须是大小为宽度 * 高度的一维像素数组,每个元素都是一个 cv_8u(8 位无符号整数)。

【讨论】:

但是我想加颜色不知道用什么其他格式 您最初的问题并不清楚。由于您使用的是 CV_8U,因此像素格式是 8 位无符号整数,只是简单的灰度。有 CV_8uc3 等,其中“c3”指定有三个通道,通常是 RGB。那么你的一维数组应该是 3 * 宽 * 高,A[y*width*3 + x * 3 + 0] 将是 R,A[y*width*3 + x * 3 + 1] G,A[y*width*3 + x * 3 + 1] B。可能有办法为此制作一个 2D 甚至 3D 数组,但在最后它通常只是一大块线性内存。 谢谢,这正是我所需要的 C3 正是我所需要的,现在我看到它非常直观。只有一件事如果我理解正确,每种颜色都是 0-255 的一个字节,还是每个像素有 3 个字节?我认为是后者。 提出新的问题或未提及的事情。 How to Ask. ***.com/questions/27183946/…【参考方案2】:

像素的颜色值,在 OpenCV 的情况下,将在内存中排列B G R。 RGB 顺序会更常见,但 OpenCV 喜欢 BGR。

您的数据应该是CV_8UC3,如果您使用imreadVideoCapture,就是这种情况。如果不是这样,则需要对以下信息进行相应的解释。

您的数组索引数学需要扩展以考虑数据的布局:

[(y*width + x)*3 + channel]

3 因为 3 个频道。 channel 是 0..2,x 和 y 如你所愿。

【讨论】:

【参考方案3】:

如其他答案中所述,您需要将此单通道图像转换为 3 通道图像才能具有颜色。 3 个通道是蓝色、绿色、红色 (BGR)。

OpenCV 有一个方法可以做到这一点,cv2.cvtColor(),这个方法接受一个输入图像(在这种情况下是你拥有的单通道图像)和一个转换代码(更多信息请参见here)。

所以代码如下:

color_image = cv2.cvtColor(source_image, cv2.COLOR_GRAY2BGR)

然后您可以通过访问每个颜色通道来修改颜色,例如

color_image[y, x, 0] = 255 # this changes the first channel (Blue)

【讨论】:

OP 声明他们使用 OpenCL 并暗示他们编写自己的 OpenCL 内核。 OpenCL 不支持该索引语法。 @ChristophRackwitz 你可能是对的。这个答案是为了帮助指出要做什么并提供一个大致的方向。由于问题上有一个“opencv”标签,我继续使用 OpenCV 语法。祝你有美好的一天。

以上是关于如果我需要访问底层数据,我应该为 Opencv 图像使用啥格式?的主要内容,如果未能解决你的问题,请参考以下文章

《OpenCV:访问Mat图像中每个像素值》

OpenCV 访问 MAT 对象中的 RGB 值

SVM 与 openCV,对数据进行分类

如何清除openCV中的窗口内容

python opencv身份证灰度图二值化应该怎么处理

OpenCV2.1,地图功能?访问每个像素?