OpenCV 學習筆記(提取影像中特定顏色區域)
我們經常需要提取影像中某種特殊顏色的區域,比如黃色或者紅色區域,如果只是提取特點的顏色,那么很簡單,直接做顏色比較就可以了,如果要選取某個顏色范圍,這個作業在 RGB 空間中就不是那么方便了,這時我們通常會選取 HSV 或類似的顏色空間,
關于 HSV 空間的介紹網上有很多,這里就不詳細寫了,但是可以認為 Hue 表示顏色,Saturation 表示顏色的飽和度,Brightness 是亮度,選取顏色范圍時我們通常用 Hue 和 Sat 兩個維度,下面是在網上找到的一個代碼片段,我覺得很實用,就放到這里了,
/**
* @brief detectHSColor 提取影像中具有特定顏色范圍的區域,影像是3 通道 BGR 影像
* @param image 輸入影像,要求是 3 通道 BGR 影像
* @param minHue Hue 的最小值,Hue 范圍 0-179 (Hue本質是個角度,在0-360之間,OpenCV 用 0-180 表示,0表示紅色,)
* @param maxHue Hue 的最大值,Hue 范圍 0-179
* @param minSat Sat 的最小值,Sat 范圍 0-255
* @param maxSat Sat 的最大值,Sat 范圍 0-255
* @param mask 提取出的區域
*/
void detectHSColor(const cv::Mat &image,
double minHue, double maxHue,
double minSat, double maxSat,
cv::Mat &mask)
{
cv::Mat hsv;
cv::cvtColor(image, hsv, CV_BGR2HSV);
std::vector<cv::Mat> channels;
cv::split(hsv, channels);
cv::Mat mask1, mask2, hueMask;
cv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);
cv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);
if(minHue < maxHue)
{
hueMask = mask1 & mask2;
}
else
{
hueMask = mask1 | mask2;
}
cv::Mat satMask;
cv::inRange(channels[1], minSat, maxSat, satMask);
mask = hueMask & satMask;
}
下面給一個簡單的例子:
cv::Mat image = cv::imread("D:\\向日葵.jpg");
cv::imshow("origin", image);
cv::Mat mask;
detectHSColor(image, 10, 40, 200, 255, mask);
cv::Mat out;
image.copyTo(out, mask);
cv::imshow("out", out);
下面是輸出結果:
可以看到提取的效果還蠻不錯的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294318.html
標籤:其他
