89

我想加载彩色图像,将其转换为灰度,然后反转文件中的数据。

我需要的是:迭代 OpenCV 中的数组并使用此公式更改每个值(这可能是错误的,但对我来说似乎是合理的):

img[x,y] = abs(img[x,y] - 255)

但我不明白为什么它不起作用:

def inverte(imagem, name):
    imagem = abs(imagem - 255)
    cv2.imwrite(name, imagem)


def inverte2(imagem, name):
    for x in np.nditer(imagem, op_flags=['readwrite']):
        x = abs(x - 255)
    cv2.imwrite(name, imagem)


if __name__ == '__main__':
    nome = str(sys.argv[1])
    image = cv2.imread(nome)
    gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    inverte(gs_imagem, "invertida.png")
    inverte2(gs_imagem, "invertida2.png")

我不想做一个明确的循环(我想变得更像pythonic)。我可以看到,在一张具有白色背景的图像中,它变成了黑色,但仅此而已,其他颜色看起来并没有太大(如果有的话)变化。

4

4 回答 4

184

你几乎做到了。abs(imagem-255)由于您dtype是无符号整数,因此会给出错误的结果这一事实欺骗了您。您必须这样做(255-imagem)才能使整数保持无符号:

def inverte(imagem, name):
    imagem = (255-imagem)
    cv2.imwrite(name, imagem)

您还可以使用bitwise_notOpenCV 的功能反转图像:

imagem = cv2.bitwise_not(imagem)
于 2013-10-31T16:35:50.043 回答
70

bitwise_not或者,您可以使用OpenCV的功能反转图像:

imagem = cv2.bitwise_not(imagem)

我喜欢这个例子。

于 2016-12-04T00:36:56.643 回答
32

您可以使用“波浪号”运算符来执行此操作:

import cv2
image = cv2.imread("img.png")
image = ~image
cv2.imwrite("img_inv.png",image)

这是因为“波浪号”运算符(也称为一元运算符)根据对象的类型进行补码

例如对于整数,它的公式是:

x + (~x) = -1

但在这种情况下,opencv 对其图像使用“uint8 numpy 数组对象”,因此其范围是从 0 到 255

因此,如果我们将此运算符应用于“uint8 numpy 数组对象”,如下所示:

import numpy as np
x1 = np.array([25,255,10], np.uint8) #for example
x2 = ~x1
print (x2)

结果是:

[230 0 245]

因为它的公式是:

x2 = 255 - x1

这正是我们想要解决的问题。

于 2019-02-17T22:15:07.950 回答
1

你也可以用 numpy 来做。

import cv2
import numpy as np

image = cv2.imread('your_image', 0)
inverted = np.invert(image)

cv2.imwrite('inverted.jpg', inverted)
于 2021-08-17T19:42:37.227 回答