【问题标题】:Line Simplification image processing线简化图像处理
【发布时间】:2015-07-02 10:15:35
【问题描述】:

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

这是我的原始输入图像-

这是我应用了Douglas-Peucker 算法的1st 组件-

这是算法的结果-

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

【问题讨论】:

  • 我猜是因为您需要描述“线”的点或线,而不是像素。尝试先获取图像的骨架。 uk.mathworks.com/help/images/ref/bwmorph.html
  • PD:您为什么要简化这些行?你能指望什么?它们尽可能简单。
  • @AnderBiguri 这是因为当我运行corner detection algorithm 时,这张图片中的许多倾斜线没有得到足够的简化,它们给出了错误的结果。角检测无法在这些图像中运行,因为它也检测到了方式许多角点
  • 那你要的是你图像的形态骨架! (我认为)
  • 嗨!我为我们做了一个聊天室,这样我们就可以讨论与 MATLAB 相关的事情,这些事情可能离题,或者跨越的时间超过了 cmets 框中的内容。有时间就来看看吧! chat.stackoverflow.com/rooms/81987/matlab

标签: algorithm matlab image-processing


【解决方案1】:

我相信您想确定图像中有多少直线段。我做了一些类似于形态命中的事情,并且能够分割这些线条,虽然不是全长。

我准备了一个垂直线结构元素 (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 个分量。您可以过滤掉太小的组件。

【讨论】:

  • 嗨!我为我们做了一个聊天室,这样我们就可以讨论与 MATLAB 相关的事情,这些事情可能离题,或者跨越的时间超过了 cmets 框中的内容。有时间就过来看看吧! chat.stackoverflow.com/rooms/81987/matlab
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2020-01-09
  • 2014-04-14
  • 1970-01-01
  • 2016-11-04
  • 2020-12-27
相关资源
最近更新 更多