线简化图像处理

时间:2015-07-02 10:15:36

标签: algorithm matlab image-processing

我正在尝试使用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);

这是我原来的输入图像 - enter image description here

这是我应用1st算法的<{1}}组件 -

enter image description here

这是算法的结果 - enter image description here

Douglas-Peucker的代码可以在我上面提到的链接中找到。所以,我的问题是为什么整个组件没有发生简化?我该如何解决?

1 个答案:

答案 0 :(得分:2)

我相信您想要确定图像中有多少直线段。我做了一些类似于形态学命中的东西,并且能够分割这些线条,尽管不是它们的全长。

我准备了一个垂直线结构元素(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,可以最小化错误。 bonds

对于w = 9,这是检测所有段时可以采用的最低值,我得到26个组件。您可以过滤掉太小的组件。 bonds2