转换,首先我检测到 边缘 </跨度> 每一点然后 操作 </跨度> 扩张。选择合适的参数后,结果令人满意,如图3所示。
图3扩张后的图像
我在opencv中处理了 同样想要的图像?似乎没有类似的收缩功能。
这是我的发现代码 边缘 </跨度> 和扩张操作:
1- 找到所有的轮廓 在你的形象。
2-使用 瞬间 找到他们的群众中心。例:
/// Get moments vector<Moments> mu(contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } /// Get the mass centers: vector<Point2f> mc( contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }
3-创建零(黑色)图像并在其上写入所有中心点。
4-请注意,您将从边界轮廓中获得额外的一个或两个点。也许你可以根据需要应用一些预过滤 轮廓区域 因为边界是具有大面积的大连通轮廓。
它不是很快,但我实现了形态滤波算法 数字图像处理,第4版 作者:William K. Pratt。这应该是你正在寻找的。
该代码是MIT许可的,可在GitHub上获得 cgmb /收缩 。
具体来说,我已经定义了 cv::Mat cgmb::shrink_max(cv::Mat in) 收缩一个给定的 cv::Mat 的 CV_8UC1 键入直到不能进一步收缩。
cv::Mat cgmb::shrink_max(cv::Mat in)
cv::Mat
CV_8UC1
所以,如果我们编译 Shrink.cxx 使用您的程序并更改您的代码,如下所示:
#include "Shrink.h" // add this line ... dilate(src, dilation_dst, element); dilation_dst = cgmb::shrink_max(dilation_dst); // and this line imwrite("c:\\001a_dilate.bmp", dilation_dst);
我们得到这个:
顺便说一下,你的形象透露了 Octave Image中的一个错误 bwmorph收缩的实现。图2不应该是图3中收缩操作的结果,因为环不应该通过收缩操作来破坏。如果那个环在MATLAB中消失了,它可能也会遇到某种类似的错误。
目前,Octave和我的结果与MATLAB略有不同,但它们非常接近。