使用OpenCV在Python中反转图像
image-processing
numpy
opencv
python
6
0

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

我需要的是:遍历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)。我可以看到,在一张具有白色背景的图像中,它变成了黑色,但是仅此而已,看起来其他颜色却没有太大变化(如果有)。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

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

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

收藏
评论

您几乎做到了。您被abs(imagem-255)给出错误结果的事实所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)
收藏
评论

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

imagem = cv2.bitwise_not(imagem)

我喜欢以下示例: https : //www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号