我制作了一个使用OpenCL创建图像的程序,在OpenCL代码中,我必须访问opencv图像的底层数据并直接修改它,但我不知道数据在内部是如何排列的。
我目前使用CV_8U
,因为它的表示非常简单,0黑255白,介于两者之间,但我想添加颜色,我不知道该使用什么格式。
这就是我当前修改图像A[y*width + x] = 255;
的方式。
由于A[y*width + x] = 255;
工作正常,因此底层图像数据A必须是大小为width*height的1D像素阵列,每个元素都是cv_8u
(8位无符号int(。
在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个通道分别为蓝色、绿色、红色(BGR(。
OpenCV有一个实现这一点的方法,cv2.cvtColor((,该方法获取一个输入图像(在本例中为您所拥有的单通道图像(和一个转换代码(请参阅此处了解更多信息(。
因此,代码如下所示:
color_image = cv2.cvtColor(source_image, cv2.COLOR_GRAY2BGR)
然后,您可以通过访问每个颜色通道来修改颜色,例如
color_image[y, x, 0] = 255 # this changes the first channel (Blue)