2016-05-13 12 views
5

Tôi đang làm việc trong python opencv (2.4.11) (2.7) và đang phát xung quanh với hình ảnh màu xám. Tôi đã tìm thấy một hành vi bất thường khi tải hình ảnh ở chế độ màu xám và chuyển đổi hình ảnh từ BGR sang GRAY. Sau đây là mã thử nghiệm của tôi:Opencv - Chế độ thang độ xám Vs hội tụ màu xám

import cv2 

path = 'some/path/to/color/image.jpg' 

# Load color image (BGR) and convert to gray 
img = cv2.imread(path) 
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

# Load in grayscale mode 
img_gray_mode = cv2.imread(path, 0) 

# diff = img_gray_mode - img_gray 
diff = cv2.bitwise_xor(img_gray,img_gray_mode) 

cv2.imshow('diff', diff) 
cv2.waitKey() 

Khi tôi xem hình ảnh khác biệt, tôi có thể nhìn thấy pixel bên trái thay vì hình ảnh phản lực đen. Bạn có thể đề nghị bất kỳ lý do? Cách làm việc chính xác với hình ảnh màu xám là gì.

P.S. Khi tôi sử dụng cả hai hình ảnh trong SIFT, các điểm chính khác nhau có thể dẫn đến kết quả khác nhau đặc biệt khi làm việc với hình ảnh chất lượng kém.

+1

Bản sao có thể có của [Chuyển đổi hình ảnh OpenCV từ RGB sang Grayscale bằng cách sử dụng tính năng đọc cho kết quả kém] (http://stackoverflow.com/questions/7461075/opencv-image-conversion-from-rgb -nói xám-sử dụng-imread-cho-nghèo-kết quả) –

+1

** Xin lưu ý rằng đây không phải là bản sao **, vì OP biết rằng hình ảnh từ 'cv2.imread' ở định dạng BGR (không giống như câu hỏi trùng lặp được đề xuất cho rằng đó là RGB do đó các câu trả lời được cung cấp chỉ có địa chỉ thứ tại số – bakkal

Trả lời

2

Lưu ý: Đây không phải là một bản sao, vì OP là nhận thức được rằng hình ảnh từ cv2.imread là ở định dạng BGR (không giống như các câu hỏi trùng lặp cho rằng giả định đó là RGB vì thế câu trả lời cung cấp duy nhất giải quyết vấn đề đó)

Để minh họa, tôi đã mở ra cùng một màu sắc hình ảnh này JPEG:

enter image description here

một lần bằng cách sử dụng chuyển đổi

img = cv2.imread(path) 
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

và khác bằng cách tải nó trong chế độ màu xám quy mô

img_gray_mode = cv2.imread(path, vs2.IMREAD_GRAYSCALE) 

Giống như bạn đã ghi nhận, các diff giữa hai hình ảnh không phải là hoàn hảo 0, tôi có thể nhìn thấy điểm ảnh khác về phía bên trái và đáy

enter image description here

tôi đã tóm tắt các diff quá để xem

import numpy as np 
np.sum(diff) 
# I got 6143, on a 494 x 750 image 

Tôi đã thử tất cả cv2.imread() chế độ

Trong số tất cả các IMREAD_ chế độ cho cv2.imread(), chỉ IMREAD_COLORIMREAD_ANYCOLOR thể được chuyển đổi sử dụng COLOR_BGR2GRAY, và cả trong số họ đã cho tôi diff cùng chống lại các hình ảnh mở trong IMREAD_GRAYSCALE

Sự khác biệt dường như không lớn. Dự đoán của tôi là xuất phát từ sự khác biệt về tính toán số trong hai phương pháp (tải thang độ xám so với chuyển đổi sang thang độ xám)

Tự nhiên điều bạn muốn tránh là tinh chỉnh mã của bạn trên một phiên bản cụ thể của hình ảnh để tìm hiểu được tối ưu hóa cho hình ảnh đến từ một nguồn khác nhau.

Tóm lại, không trộn các phiên bản và loại trong đường ống xử lý.

Vì vậy, tôi muốn giữ các nguồn hình ảnh đồng nhất, ví dụ:nếu bạn đã chụp hình ảnh từ một máy quay video trong BGR, thì tôi sẽ sử dụng BGR làm nguồn, và thực hiện BGR để chuyển đổi màu xám sang các màu xám và sau đó tôi sẽ mở các tệp và quay video ở quy mô màu xám cv2.imread(path, cv2.IMREAD_GRAYSCALE)

+0

Cảm ơn bakkal vì những nỗ lực của bạn, điều đó giải thích rất nhiều. Tôi sẽ sử dụng phương pháp này theo nguồn hình ảnh. –

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