我试图使用douglas-peucker
算法来简化连接组件。我使用bwlabel
获取连接组件并将其发送到douglas
算法。下面是我正在使用的算法的链接-
Douglas-Peucker Algorithm matlab
这是我的密码-
clc;
image=imread('mmm1.jpg');
image = im2bw(image);
[imx imy]=size(image);
n1=zeros(imx,imy);
I=zeros(imx,imy);
L = bwlabel(image,8) ;%Calculating connected components
[r,c] = find(L==1); %Using 1st connected component
n1=zeros(imx,imy);
rc = [r c];
[ps mm] = dpsimplify(rc,1); %Douglas-Peucker algorithm
%To display original component
%___________________________________________________________________
[sx sy]=size(rc);
for j=1:sx
x1=rc(j,1);
y1=rc(j,2);
n1(x1,y1)=1;
end
figure,imshow(n1);
%___________________________________________________________________
%To display component after simplification
n1=zeros(imx,imy);
[sx sy]=size(mm);
for j=1:sx
x1=rc(j,1);
y1=rc(j,2);
n1(x1,y1)=1;
end
figure,imshow(n1);
这是我的原始输入图像-
这是我应用
1st
算法的Douglas-Peucker
组件-这是算法的结果-
Douglas Peucker的代码可以在我上面提到的链接中找到,所以,我的问题是为什么整个组件没有进行简化?我该怎么解决?
最佳答案
我相信你想确定图像中有多少直线段。我做了一些类似于形态打击的事情,能够分割出这些线,虽然不是完整的长度。
我准备了一个垂直线结构元素(se),然后通过围绕其中心旋转60度和120度来创建另外两个se。我用这些ses腐蚀了原始图像,然后得到了连接的组件。
im = imread('IWVlt.jpg');
bw = im2bw(im, graythresh(im));
% SEs
w = 15;
line = zeros(w);
line(:, round(w/2)) = 1;
bw1 = zeros(size(bw));
for i = 1:3
bw1 = bw1 + imerode(bw, line);
line = imrotate(line, 60, 'nearest');
end
[lbl, n] = bwlabel(bw1, 8);
figure, imshow(bw1)
figure, imshow(label2rgb(lbl))
结果我得到了25个组件。通过改变代码中的w,可以使错误最小化。
对于w=9,这是w在检测所有段时可以取的最小值,我得到26个分量你可以过滤掉太小的组件。