图像处理问题解决师——求取每个颗粒到其他颗粒边缘的最近距离
问题描述
此图像处理实际问题来自工程中遇到的实际问题,针对上图中所示颗粒图片,需要求解取每个颗粒到其他颗粒边缘的最近距离。并用Matlab画线工具将最短距离可视化出来。
解决思路
图片读入并去掉小噪声 bwareaopen()
通过Matlab联通域函数bwareaopen()去除图像中小噪声颗粒的影响
matlab函数bwareaopen──删除小面积对象
格式:BW2 = bwareaopen(BW,P,conn)
作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
计算连通域边缘点 bwboundaries()
通过Matlab联通域函数bwareaopen()去除图像中小噪声颗粒的影响
格式:[B,L] = bwboundaries(BW,‘noholes’);
作用:获取二值图中连通域的轮廓。B是一个P×1的cell数组,P为连通域个数,每个cell是Q×2的矩阵,Q为对应连通域的边缘点个数,Q行对应于连通域轮廓的像素坐标。L是与原图大小一致的标签矩阵,存储着连通域的标签。
现在需要解决的问题:针对每一个颗粒,如何得到其他颗粒边缘到该颗粒边缘的最短距离。
双层for循环求解
第一层循环首先遍历[B,L] = bwboundaries(BW,‘noholes’)得到的P个颗粒连通域,第二层for循环遍历每个颗粒的Q×2cell,即每个颗粒的边缘点。
对于最内层循环,即每个颗粒的边缘点,遍历图像以寻找离该边缘点最近的其他颗粒边缘点,并不断更新最小距离。该处有一个优化操作是在遍历图像时并不需要遍历整张图像,而仅仅需要遍历当前颗粒附近取余的图像即可,这样可以大大提升效率,避免无用功。
最近边缘可视化
最后将计算结果通过Matlab中plot()函数可视化