2015-09-20 108 views
2

我正在學習OpenCV。現在我變得混淆以下問題。如何判斷處理圖像的色彩空間?

下面是代碼:

Mat img = imread("..."); 
Mat imgHSV; 
Mat imgThresholded; 

cvtColor(img, imgHSV, COLOR_BGR2HSV); 
inRange(imgHSV, Scalar(150, 50, 75), Scalar(179, 255, 255), imgThresholded); 

現在,我得到了處理後的圖像imgThresholded。這是imgThresolded在RGB色彩空間或HSV色彩空間?

回答

0

它是1個具有0或255值的單通道圖像。 如果你想回到你原來的RGB空間只是做到以下幾點:

cv::Mat FinalRGB; 
cv::cvtColor(imgThresholded, imgThresholded, CV_GRAY2BGR); 
cv::bitwise_and(imgThresholded, img, FinalRGB); 

編輯: 作爲@Micka說:

cv::Mat imgMasked; 
img.copyTo(imgMasked, imgThresholded); 

會做同樣的想法,但速度更快。

+0

無法將imgThresholded從HVS再次轉換爲RGB?我嘗試了代碼,但似乎有些不妥。 – Leo

+0

非常感謝,我得到了非常滿意的答案! – Leo

+2

而不是你可以:cv :: Mat imgMasked; img.copyTo(imgMasked,imgThresholded);可能會更快。 – Micka

1

作爲每documentation

空隙INRANGE(InputArray SRC,InputArray lowerb,InputArray upperb, OutputArray DST)

DST - 相同大小的輸出陣列如src和CV_8U型

這意味着對於3通道輸入圖像,輸出將是單通道圖像,在閾值的情況下,輸出是隻有白色(255)和黑色(0)像素的二進制圖像,格式僅爲CV_8U。

0

inRange()將給出二進制圖像。不是HSV或RGB。但是,是的,它將考慮用HSV圖像進行計算,因爲您已將imHSV作爲輸入圖像。

函數INRANGE()的工作方式如下:

imThresholded(I)被設置爲255(所有1個-Bits)如果imHSV(I)是 指定1D,2D,3D內,...否則爲0。

當下邊界參數和/或上邊界參數是標量時,應忽略上式中lowerb和upperb處的索引(I)。

+0

它就像正常的二進制閾值。如果圖像的相應H,S和V值在該範圍內(按照您給出的比例),那麼該像素將是255,如果它不在該範圍內,則該特定像素值將爲零。希望這可以幫助! –