如果我需要访问底层数据,我应该为 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
,如果您使用imread
或VideoCapture
,就是这种情况。如果不是这样,则需要对以下信息进行相应的解释。
您的数组索引数学需要扩展以考虑数据的布局:
[(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 图像使用啥格式?的主要内容,如果未能解决你的问题,请参考以下文章