提取深色轮廓

时间:2019-02-19 08:27:53

标签: opencv

我想用opencv从图像中提取较暗的轮廓。我尝试使用下面的简单阈值(c ++)

cv::threshold(gray, output, threshold, 255, THRESH_BINARY_INV);

我可以迭代阈值,例如从50〜200 然后我可以在中间得到较暗的轮廓 用于具有明显区别的图像,例如

clear

这是阈值的结果

threshold

但是如果轮廓线靠近边界,则阈值将失败,因为像素几乎相同。 例如这样的图片。

not clear

我想问的是,opencv中有什么技术可以提取图像中间较暗的轮廓,即使轮廓到达边界并且像素与边界几乎相同?

(已更新)

在阈值变暗的中间轮廓与边界顶部重叠之后。 这使我无法提取诸如前两个“ SS”之类的字符。

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为您可以简单地添加一个保留边缘的平滑步骤来解决此问题:

// read input image
Mat inputImg = imread("test2.tif", IMREAD_GRAYSCALE);

Mat filteredImg;
bilateralFilter(inputImg, filteredImg, 5, 60, 20);

// compute laplacian
Mat laplaceImg;
Laplacian(filteredImg, laplaceImg, CV_16S, 1);

// threshold
Mat resImg;
threshold(laplaceImg, resImg, 10, 1, THRESH_BINARY);

// write result
imwrite("res2.tif", resImg);

这将为您提供以下结果:result

此致

答案 1 :(得分:0)

我认为使用laplacian可以部分解决您的问题:

// read input image
Mat inputImg = imread("test2.tif", IMREAD_GRAYSCALE);

// compute laplacian
Mat laplaceImg;
Laplacian(inputImg, laplaceImg, CV_16S, 1);

Mat resImg;
threshold(laplaceImg, resImg, 30, 1, THRESH_BINARY);

// write result
imwrite("res2.tif", resImg);

使用此代码,您应该获得类似以下内容: this result

然后可以使用最终阈值和拉普拉斯内核大小进行游戏。

在执行此操作后,您可能必须去除小工件。

致谢