2013-10-25 98 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