2016-05-13 105 views
5

我正在opencv(2.4.11)python(2.7)中工作,並正在玩弄灰色圖像。當在灰度模式下加載圖像並將圖像從BGR轉換爲灰色時,我發現了一種不尋常的行爲。以下是我的實驗代碼:Opencv - 灰度模式vs灰色轉換

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

當我看到差分圖像,可以看我的冷落像素,而不是深黑色圖像。你能提出任何理由嗎?什麼是使用灰色圖像的正確方法。

P.S.當我在SIFT中使用這兩個圖像時,關鍵點不同,這可能會導致不同的結果,特別是在處理質量較差的圖像時。

+1

可能重複的[OpenCV圖像轉換從RGB到灰度使用imread給結果不佳](http://stackoverflow.com/questions/7461075/opencv-image-conversion-from-rgb使用imread-giving-poor結果) –

+1

**請注意,這不是一個重複的**,因爲OP知道'cv2.imread'中的圖像是BGR格式的(不像建議重複的問題,假設它是RGB,因此提供的答案只針對th在問題 – bakkal

回答

2

注:這是不是重複,因爲OP知道,從cv2.imread圖像是BGR格式(不像假定它是RGB因此提供的答案只有解決這一問題的建議重複的問題)

爲了說明這一點,我已經打開了這個相同的顏色JPEG圖像:

enter image description here

一次使用轉換

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

,另一個在灰度模式下加載它

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

就像你證明,這兩個圖像之間的差異是不完全爲0,我可以看到差異像素向左和底部

enter image description here

我已經總結出了差異也看到

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

我嘗試了所有cv2.imread()模式

在所有IMREAD_模式爲cv2.imread(),只有IMREAD_COLORIMREAD_ANYCOLOR可以使用COLOR_BGR2GRAY轉換,兩者的給了我同樣DIFF反對IMREAD_GRAYSCALE

圖像開

差異似乎並不大。我的猜測來自兩種方法中數值計算的差異(加載灰度與轉換爲灰度)

當然,您想要避免的是在特定版本的圖像上微調代碼,以找出它對來自不同來源的圖像來說是不理想的。

簡而言之,讓我們不要混合處理管道中的版本和類型。

所以我會保持圖像來源同質,例如,如果你從BGR的攝像機捕獲圖像,那麼我會使用BGR作爲源,並做BGR灰度轉換cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

反之亦然,如果我的最終來源是灰度,那麼我會打開文件並在灰度的視頻捕獲cv2.imread(path, cv2.IMREAD_GRAYSCALE)

+0

謝謝你的努力bakkal,這解釋了很多。我將根據圖像源使用該方法。 –