使用OpenCV在Python中反转图像

时间:2013-10-25 02:25:46

标签: python arrays opencv numpy image-processing

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

我需要的是:在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)。我可以看到,在一张白色背景的图像中,它变成了黑色,但只有这一点看起来并不像其他颜色有很多(如果有的话)变化。

3 个答案:

答案 0 :(得分:86)

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

答案 1 :(得分:6)

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

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 = 256-x1

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

答案 2 :(得分:0)

A,此脚本搜索图像中的粉红色皮肤像素。

它创建了一个面具。

它将粉红色像素设置为白色,而不是将粉红色像素设置为黑色

B, 遵守 2 个条件 掩码>0 和掩码==0

import cv2
import numpy as np

# specify desired bgr for mask
desired_color_brg1 = (0,0, 0) #black
desired_color_brg2 = (255,255, 255) #white




# read image in bgr and convert to hsv
path_main_image="../data/person.png"
main_img = cv2.imread(path_main_image)
main_img_hsv=cv2.cvtColor(main_img,cv2.COLOR_BGR2HSV)



# Define lower and uppper limits of what we call "pink skin color"
pink_low=np.array([0,10,60])
pink_hig=np.array([20,150,255])


#create mask
mask=cv2.inRange(main_img_hsv,pink_low,pink_hig)


# Change image to white where we found pink skin
main_img[mask>0]=desired_color_brg1
cv2.imwrite("../data/result1.png",main_img)


# Change image toblack where we NOT found pink skin
main_img[mask==0]=desired_color_brg2
cv2.imwrite("../data/result2.png",main_img)