2014-01-09 89 views
2

我試圖將bgr mat轉換爲hsv ma​​t進行一些檢測,但hsv圖像總是出現塊狀。這裏是我在C++中的代碼:在opencv中將bgr轉換爲hsv時出現塊狀行爲

int main() { 
    const int device = 1; 
    VideoCapture capture(device); 
    Mat input; 
    int key; 
    if(!capture.isOpened()) { 
     printf("No video recording device under device number %i found. Aborting program...\n", device); 
     return -1; 
    } 
    namedWindow("Isolation Test", CV_WINDOW_AUTOSIZE); 
    while(1) { 
     capture >> input; 
     cvtColor(input, input, CV_BGR2HSV); 
     imshow("Isolation Test", input); 
     key = static_cast<int>(waitKey(10)); 
     if(key == 27) 
      break; 
    } 
    destroyWindow("Isolation Test"); 
    return 0; 
} 

Here是輸出內容的快照。當我註釋掉cvtColor時,輸入不顯得塊狀。有什麼問題,我該怎麼做才能解決它?

+0

在轉換之前,圖像可能是塊狀的,但它很難檢測到。 JPEG/MPEG壓縮正在利用我們的「視覺管道」的不完善性,並因此產生許多難以檢測到的僞影。當您用假彩色(例如HSV通道)顯示圖像時,它們有時變得非常明顯。您可以將圖像保存爲無損格式(png/tiff),並使用顏色檢查器調查實際值。 –

+0

我甚至可以在3.0(主)中重現。也與不同的攝像頭型號/驅動程序。它只發生在網絡攝像頭捕獲,而不是imread()。不錯的謎題;) – berak

+0

@scribblemaniac,你可能想[在這裏提出問題](http://code.opencv.org/projects/opencv/issues) – berak

回答

2

我在評論部分提出了一個解釋,但決定實際驗證我的假設並解釋一些關於HSV色彩空間的內容。

代碼和OpenCV的cvtColor都沒有問題。 RGB圖片中存在「塊狀」工件,但不明顯。所有的JPEG家族壓縮算法產生這些工件。我們通常看不到它們的原因是這些算法「利用」了我們視覺系統中的弱點並壓縮了更多我們不太敏感的東西。

我使用OpenCV s cvtColor`將圖像轉換回RGB,並且神器消失(圖像在下面)。

HSV特別是色彩空間有幾個誇大這些工件的特徵。其中很重要的一個事實是,無論通道(值/亮度)的哪個位置非常低,通道都非常不穩定並且毫無意義。在極端:[128,255,0] == [0,0,0]

因此,在色彩空間的錯誤顏色的情況下,圖像黑暗區域中非常小且不明顯的壓縮僞影變得非常突出。

如果您想使用HSV色彩空間作爲色彩對比的特徵空間,請記住,如果V非常低,H & S是毫無意義的。對於非常低的S值也是如此,這使H值無意義([0,0,100] == [128,0,100])。

順便說一句。還要記住H通道是循環的,H == 0H == 255之間的差值只是一個灰度級別。

  • 假彩色「塊狀」 HSV圖像張貼在使用cvtColor Same image after conversion back to RGB
+0

感謝後續,它已經幫了我很多。我明白你的意思,我想我必須相應地調整我的範圍來彌補這一點。 – scribblemaniac

+0

沒問題,我可以簡單地使用RGB色彩空間(雖然它不是很流行),或者定義HSV中的距離函數,它對低V或S值是強健的。 –

0

我認爲這種情況發生,因爲imshow函數總是解釋圖像問題 HSV image posted by @scribblemaniac

  • 圖像轉換回RGB作爲一個簡單的RGB或BGR圖像。所以你需要在顯示圖像之前使用cvtColor(input,input,CV_HSV2BGR)將HSV改回BGR。