2013-10-25 13 views
21

컬러 이미지를로드하고 그레이 스케일로 변환 한 다음 파일의 데이터를 반전시키고 싶습니다.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") 

나는 명시 적 루프를하고 싶지 않습니다. (나는 더 파이썬 적이 되려고합니다.) 나는 하나의 이미지에서 흰색 배경이 검은 색으로 변하는 것을 볼 수 있지만, 다른 색이 많이 (있는 경우) 변경하지 않는 것처럼 보입니다.

답변

42

거의 했어요. dtype이 부호없는 정수이기 때문에 abs(imagem-255)이 잘못된 결과를 제공한다는 속임수에 빠져 들었습니다. 당신은 부호없는 정수를 유지하기 위해 (255-imagem)을 할 필요가 : 당신이 수, 또는

imagem = cv2.bitwise_not(imagem) 
+2

고마워요! 파이썬에서 표준이 서명되지 않은 int임을 알지 못했습니다 ... – Mansueli

+3

깔끔하고 간단 할 것 같지 않았습니다. 감사합니다. – Nit

+2

정말로해야 할 때가 아니라면 휠을 재발 명하지 마십시오. 데이터를 반전하려면 대신 [Not] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not) (일명'bitwise_not')를 사용하십시오. – vaxquis

18

:

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

여기에 몇 가지 코멘트를 추천, 당신은 OpenCV의의 bitwise_not 기능을 사용하여 이미지를 반전 할 수

imagem = cv2.bitwise_not(imagem) 

에서 I는 예를 좋아 : OpenCV의 bitwise_not의 기능을 이용하여 이미지를 반전 https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/