我试图使用douglas-peucker算法来简化我的连接组件,我使用bwlabel获取连接的组件,然后将它发送到douglas algorithm.Here是我正在使用的算法的链接- 道格拉斯-派克算法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的代码可以在我提到的above.So,的链接中找到,我的问题是为什么整个组件的简化没有发生,我如何解决这个问题?
发布于 2015-07-02 17:33:36
我相信你想要识别图像中有多少直线段。我做了一些类似的形态学击中,并能够分割这些品系,虽然不是在他们的全部长度。
我准备了一个垂直线结构元素(SE),然后通过围绕它的中心旋转60度和120度来创建另外两个SE。我用这些SE来腐蚀原始图像,然后得到连接的组件。
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个分量。您可以过滤掉太小的组件。

https://stackoverflow.com/questions/31181841
复制相似问题