2013-10-25 23 views
21

Tôi muốn tải một hình ảnh màu, chuyển đổi nó thành màu xám và sau đó đảo ngược dữ liệu trong tệp.hình ảnh đảo ngược bằng Python với OpenCV

Những gì tôi cần: để lặp qua mảng trong OpenCV và thay đổi mỗi giá trị độc thân với công thức này (nó thể là sai nhưng có vẻ như hợp lý đối với tôi):

img[x,y] = abs(img[x,y] - 255) 

nhưng tôi không hiểu tại sao nó không hoạt động:

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") 

Tôi không muốn làm một vòng lặp rõ ràng (Tôi đang cố gắng để được thêm pythonic). Tôi có thể thấy rằng trong một hình ảnh có nền trắng chuyển sang màu đen, nhưng chỉ có nó không giống các màu khác đang thay đổi nhiều (nếu có).

Trả lời

42

Bạn gần như đã làm điều đó. Bạn đã bị lừa bởi thực tế là abs(imagem-255) sẽ cho kết quả sai do dtype của bạn là một số nguyên không dấu. Bạn phải làm (255-imagem) để giữ nguyên unsigned:

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

Theo đề xuất của một số ý kiến ​​ở đây, bạn có thể đảo ngược hình ảnh bằng cách sử dụng chức năng bitwise_not của OpenCV:

imagem = cv2.bitwise_not(imagem) 
+2

Cảm ơn bạn! Tôi không biết rằng trong python tiêu chuẩn sẽ được unsigned int ... – Mansueli

+3

Gọn gàng, không nghĩ rằng nó sẽ đơn giản này, cảm ơn. – Nit

+2

Không phát minh lại bánh xe trừ khi bạn thực sự phải; để đảo ngược dữ liệu, sử dụng [Not] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not) (aka 'bitwise_not') để thay thế. – vaxquis

Các vấn đề liên quan