我想基于开放式cv中的颜色检测基于图像处理的项目的blob。但是在用于斑点检测的开放式cv函数中,它们将输入BGR图像转换为灰度,然后对图像进行阈值处理,从而导致颜色信息丢失。
以下代码来自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!");
}
有没有基于颜色的blob检测方法?
答案 0 :(得分: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);
答案 1 :(得分:0)
自己处理从彩色图像到灰度的转换。例如,如果您想要红色对象,请仅使用红色通道,然后在那里搜索blob。
通常,最好从RGB移动到HSV(色调,饱和度,值)。色调通道应该为您提供更好的颜色分离。 (见HSV and HSL)
cv::cvtColor(image, imgHSV, cv::COLOR_BGR2HSV);
cv::inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);