Python OpenCV : inverting colors in a numpy image array

标签 python image opencv image-processing numpy

我一直在尝试操纵一个非常简单的 8 x 8 图像(变量 "abc")的颜色(BGR 值),但是当我尝试使用反转颜色查看新图像时(变量“目标”),我得到的只是一张黑色图片。有人可以帮我吗?

我什至在更改代码后尝试检查两个数组是否完全匹配,以便尝试一次复制一个像素,并且条件等于 True 但图像保持黑色。

我已经发布了以下代码:

import cv2
import numpy as np    

abc = cv2.imread("new.png")

(x1, y1) = abc.shape[:2]

a1 = []
a2 = []
a3 = []

for i in range(x1):
    for d in range(y1):
        for g in range(3):
            if g == 0:
                a1.append(abc[i, d, g])
            elif g == 1:
                a2.append(abc[i, d, g])
            elif g == 2:
                a3.append(abc[i, d, g])

u = 0

target = np.empty(shape=(x1, y1, 3), dtype="int32")
for i in range(x1):
    for d in range(y1):
              target[i, d, 1] = a2[u]
              target[i, d, 2] = a3[u]
              target[i, d, 0] = a1[u]
              u = u + 1

if (abc == target).all():
    print "equal/match"

cv2.imshow('target', target)
cv2.waitKey(0)
cv2.destroyAllWindows()

最佳答案

我想向您指出cv2.imshow的文档:http://docs.opencv.org/modules/highgui/doc/user_interface.html#imshow

阅读注释中有关您尝试显示的图像类型的说明:

  • 如果图像是 8 位无符号图像,则按原样显示。
  • 如果图像是16位无符号或32位整数,则像素除以256。即,值范围[0,255*256]映射到[0,255 ]
  • 如果图像是 32 位浮点型,则像素值会乘以 255。即,值范围 [0,1] 映射到 [0,255]

你的情况是第二点。您所做的是,输入图像一开始很可能是无符号 8 位整数。因为您创建了 int 类型的输出图像(实际上是 int32),所以这相当于 32 位整数类型的图像,所以发生的情况是所有这些值被除以 256。对于 8 位无符号整数类型,所有值都在 0 到 255 之间,因此除以 256 会使所有像素黑色(即 [ 0,255]/256 --> [0,0] 假设整数除法)。

要解决此问题,您需要为输出正确创建正确的图像类型。在您的情况下,我将假设您的输入数据类型是 uint8,鉴于我所看到的情况,这是最有意义的,因此只需更改 target 即可dtypeuint8:

target = np.empty(shape=(x1, y1, 3), dtype=np.uint8)

小注释

通过切片进入三维,您可以非常有效地完成您想要的任务。

因此,target 可以非常简单地如下所示,无需使用 for 循环或临时列表来复制空间坐标元组:

target = abc[:,:,[1,2,0]]

额外的好处是,target 将保持与 abc 所采用的相同数据类型。在此处阅读 numpy 索引和切片:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

关于Python OpenCV : inverting colors in a numpy image array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314156/

相关文章:

css - 带有 UL 的奇怪的 IE9 Bug 和 CSS 中的悬停图像

python - 为什么使用 Smooth 会导致 Python 崩溃?

python - 多处理 Python 与 RPYC "ValueError: pickling is disabled"

python - Pandas 数据框中的 FutureWarning

java - 将图像存储到 netbeans 的文件夹中

java - 启用通过resteasy将图像作为Fileoutputstream发送

opencv - 为摄影测量应用程序创建目标

python - ReprojectImageTo3D 对应图像中的像素(立体视觉)

python - 使用 Python 识别 Mac OS X 中的包目录

python - 为什么 python 'in' 运算符根据元组大小表现不同?