2016-06-09 84 views
0

我想根据开放式cv中的颜色检测基于我的图像处理项目的斑点。但是在用于斑点检测的开放cv函数中,它们将输入的BGR图像转换为灰度,然后对图像进行阈值处理,导致颜色信息丢失。开放式cv中基于颜色的斑点检测

下面的代码来自blob检测库。

if (image.channels() == 3) 
     cvtColor(image, grayscaleImage, COLOR_BGR2GRAY); 
    else 
     grayscaleImage = image.getMat(); 

    if (grayscaleImage.type() != CV_8UC1) { 
     CV_Error(Error::StsUnsupportedFormat, "Blob detector only supports 8-bit images!"); 
    } 

是否有任何基于颜色的斑点检测方法?

回答

0

是的,您可以使用opencv cv::inRange方法轻松地分割出颜色斑点,该方法将为落入指定范围的像素生成单通道二进制掩膜。使用inRange的主要优势在于,您可以分割所有类型的垫,即grayScale, RGB, RGBA。它可以使用如下:

image = cv::imread("./sample.png"); #For reading the image in RGB format 
#image = cv::imread("./sample.png", -1) #For reading the image in existing format 
cv::Mat segmented_image; 
# For segmenting the image in RGB format. 
cv::inRange(image, cv::Scalar(100, 10, 60), cv::Scalar(120, 50, 70), segmented_image); 

# For segmenting the image in Gray format 
cv::inRange(image, cv::Scalar(110), cv::Scalar(150), segmented_image); 

# For segmenting the image in RGBA format 
cv::inRange(image, cv::Scalar(100, 10, 60, 10), cv::Scalar(120, 50, 70, 250), segmented_image); 
0

自己处理从彩色图像到灰度的转换。例如,如果您想要红色对象,请仅使用红色通道,并在那里搜索斑点。

通常,最好从RGB转换为HSV(色相,饱和度,值)。色调通道应该给你一个更好的颜色分离。 (见HSV and HSL

cv::cvtColor(image, imgHSV, cv::COLOR_BGR2HSV); 
cv::inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);