识别图像上的大线条

时间:2017-09-04 15:40:19

标签: c++ opencv

我的图像由植物线条组成(可能是也可能不是直线)。

我需要实现一种识别这些线的算法,并生成一个标记植被像素的二元掩模图像。此掩模可以是密集掩模(标记所有已识别的植被像素)或骨架掩模(标识植被通道中心的1像素宽线)。

以下是输入图像的示例:

Image 1

这是可能的预期产出之一:

Example output

到目前为止,我已经尝试了以下方法,导致以下问题:

  • Canny边缘检测器:由于阴影而产生大量误报
  • 图像阈值:由于地面植被而产生误报。

任何人都有更多的想法?

由于

2 个答案:

答案 0 :(得分:3)

如果使用RGB色彩空间对您没有帮助,请尝试使用其他色彩空间。对于给定的特定图像,我使用了HSV色彩空间。

1。 HSV图片:

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv.jpg', hsv)

enter image description here

2。提取饱和度通道会产生以下结果:

saturation_channel = hsv[:,:,1]
cv2.imshow('saturation_channel.jpg', saturation_channel)

enter image description here

3。在此图像上应用自适应阈值会产生以下结果:

median = np.median(saturation_channel)
std = np.std(saturation_channel)

ret,thresh1 = cv2.threshold(saturation_channel, int(median - (1.05 * std)), 255,cv2.THRESH_BINARY_INV)
cv2.imwrite('thresh1.jpg', thresh1)

enter image description here

4。现在,您可以应用一些形态操作并使用原始图像

进行遮罩

注意: 您还可以将图像转换为LAB色彩空间,并可视化不同的频道。

LAB颜色空间中的相同图像:

enter image description here

答案 1 :(得分:0)

您可以在应用Canny之前模糊图像,然后通过计算最佳阈值来移除Canny噪声。之后,您可以使用HoughLinesP或您选择的方法来检测线条。

cv::Mat src=imread("image.png",-1),dst;

cv::GaussianBlur(src, dst, Size(3,3), 1.0); //blur the source image

cv::cvtColor(dst,dst,cv::COLOR_BGR2GRAY); //convert to gray

cv::Scalar m = cv::mean(dst); //calculate mean

//Calculate lower and upper threshold based on mean
double sigma = 0.33;
double lower_thresh = int(std::max((double)0, ((1.0 - sigma) * m[0])));
double upper_thresh = int(std::min((double)255, ((1.0 + sigma) * m[0])));

cv::Canny(dst, dst, lower_thresh, upper_thresh, 3); //apply canny

图像模糊:

Blurred image

Canny:

Canny