我的图像由植物线条组成(可能是也可能不是直线)。
我需要实现一种识别这些线的算法,并生成一个标记植被像素的二元掩模图像。此掩模可以是密集掩模(标记所有已识别的植被像素)或骨架掩模(标识植被通道中心的1像素宽线)。
以下是输入图像的示例:
这是可能的预期产出之一:
到目前为止,我已经尝试了以下方法,导致以下问题:
任何人都有更多的想法?
由于
答案 0 :(得分:3)
如果使用RGB色彩空间对您没有帮助,请尝试使用其他色彩空间。对于给定的特定图像,我使用了HSV色彩空间。
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv.jpg', hsv)
saturation_channel = hsv[:,:,1]
cv2.imshow('saturation_channel.jpg', saturation_channel)
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)
注意: 您还可以将图像转换为LAB色彩空间,并可视化不同的频道。
LAB颜色空间中的相同图像:
答案 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
图像模糊:
Canny: