numpy 使用OpenCV在Python中反转图像

hwamh0ep  于 2023-01-30  发布在  Python
关注(0)|答案(7)|浏览(163)

我想加载彩色图像,将其转换为灰度图像,然后反转文件中的数据。
我需要什么:在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")

我不想做一个显式的循环(我想更像Python),我可以看到一个白色背景的图像变成了黑色,但只有这个看起来不像其他颜色有太多的变化(如果有的话)。

shyt4zoc

shyt4zoc1#

你差点就成功了,你被abs(imagem-255)的错误结果所欺骗,因为你的dtype是一个无符号整数,你必须执行(255-imagem)以保持整数无符号:

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

您也可以使用OpenCV的bitwise_not函数反转图像:

imagem = cv2.bitwise_not(imagem)
2ul0zpep

2ul0zpep2#

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

imagem = cv2.bitwise_not(imagem)

我喜欢this的例子。

pvabu6sv

pvabu6sv3#

您可以使用“波浪号”操作符来完成此操作:

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

这是因为“波浪号”运算符(也称为一元运算符)根据对象类型执行补码操作
例如,对于整数,其公式为:
x +(~x)= -1
但在本例中,opencv对其图像使用“uint 8 numpy数组对象”,因此其范围为0到255
因此,如果我们将此操作符应用于“uint 8 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
而这正是我们想要解决问题的方法。

j1dl9f46

j1dl9f464#

你也可以和numpy一起做。

import cv2
import numpy as np

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

cv2.imwrite('inverted.jpg', inverted)
7tofc5zh

7tofc5zh5#

在Python/OpenCV中,我认为您需要:

img = cv2.absDiff(img, 255)
fykwrbwg

fykwrbwg6#

为什么不在numpy中使用 * 问题的第一行 *?

inverted = np.abs(image - 255)

就这么简单。不需要迭代或任何其他函数。numpy会自动为我们完成:)

dced5bon

dced5bon7#

def invert(self, image=None):
        if image is None:
            image = self.image

        image = image.astype("uint8") # --> pay attention to the image type
        inverted = np.invert(image)
        (thresh, im_bw) = cv2.threshold(inverted, 0, 1, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        return im_bw

相关问题