【问题标题】:inverting image in Python with OpenCV使用 OpenCV 在 Python 中反转图像
【发布时间】:2013-11-03 23:55:28
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays opencv numpy image-processing


    【解决方案1】:

    你几乎做到了。你被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)
    

    【讨论】:

      【解决方案2】:

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

      imagem = cv2.bitwise_not(imagem)
      

      我喜欢this 示例。

      【讨论】:

        【解决方案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

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

        【讨论】:

        • 我认为如果你能解释一下为什么会这样,你的答案会更好。
        • "255" 应替换 "x2 = 256 - x1" 中的 "256"。
        【解决方案4】:

        你也可以用 numpy 来做。

        import cv2
        import numpy as np
        
        image = cv2.imread('your_image', 0)
        inverted = np.invert(image)
        
        cv2.imwrite('inverted.jpg', inverted)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 2019-01-25
          • 2022-01-24
          • 2021-08-15
          • 1970-01-01
          • 2012-11-14
          相关资源
          最近更新 更多