2013-10-25 71 views
21

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

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

回答

42

你几乎做到了。由于您的dtype是一个无符号整数,因此abs(imagem-255)将给出错误结果这一事实欺骗了您。你所要做的(255-imagem)以保持整数无符号:

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

所推荐的这里的一些意见,你可以使用的OpenCV的bitwise_not功能反转图像:

imagem = cv2.bitwise_not(imagem) 
+2

谢谢你! 我不知道,在Python中的标准将是无符号int ... – Mansueli

+3

整洁,没想到它会这么简单,谢谢。 – Nit

+2

除非你真的需要,否则不要重新发明轮子;要反转数据,请改用[Not](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not)(又名'bitwise_not')。 – vaxquis