前言,帮助好友解决如何讲图片中断开的线圈连接起来的问题。首先的想法试利用线圈断裂处断点的8领域,断点的八领域不为0的像素点应该只有一个,利用这个方法将所有的断点找出来,再依次将相邻的断点连接起来。这个想法有个问题,在复杂一点的情况下,断点不能通过这个方法寻找,比如在线圈断裂处中间有个孤立的像素,这个像素的8领域的像素值全为0,所以这个断点通过8领域是找不出来的;于是我想到通过分水岭算法来拟合断开的线圈;代码如下:
clc;
clear all;
close all;
I=imread(['C:\Users\wlh\Desktop\png\4_5','.png']);
if size(I, 3) == 1
gray = I;
elseif size(I, 3) == 3
gray = rgb2gray(I);
else
gray = I(:, :, 1);
end
figure(1);imshow(gray);title('Original ');
se1 = strel('diamond',1); %定义腐蚀的操作的核;
bw = gray > 0; %黑白图片经测试tmp取80左右,红色图片经测试tmp取20~27左右
%将tmp中像素值大于50的置为1,小于50的点置0;(黑色为0,白色为1)
dist = 255 - bwdist(bw); %非零元素与其最靠近的零元素之间的距离
mask = imextendedmin(dist,6);
%BW = imextendedmin(I,h)计算扩展最小值变换,它是H-minima变换的区域最小值。
%区域最小值是连通像元的分量,具有恒定的强度值,并且其外部边界像素都具有较高的值。
%h是一个非负的标量。
dist2 = imimposemin(dist, mask);
%imimposemin(I,BW)使用形态重构来修改强度图像I,所以在BW不为零的地方只有区域最小值。
%BW是一个与I相同大小的二进制图像。
bd = watershed(dist2) == 0;
bd = bwareaopen(bd, 5);
bd = imdilate(bd, se1);
[m,n] = size(bd);
bd([1 m-1], :) = 0;%将分割后的图像与边界的链接处给删除;
bd(:, [1 n-1]) = 0;
bd = watershed(bd) == 0;
bd = double(bd);
figure(2);imshow(bd,[]);title('bd');
结果展示:(前后结果图是一样的,上传问题)
喜欢就点个赞吧 ! (* ^ _ ^ *) ! ! ! !