-1

这是输入图像5.png

输入

这是我的代码:

clear all; close all; clc;
%Input Image
A = imread('C:\Users\efu\Desktop\5.png');
% figure, imshow(A);

C=medfilt2(A,[3 5]);
% figure,imshow(C);

D=imfill(C);
% figure,imshow(D);

%Image obtained using MATLAB function 'edge'    
E=edge(D,'canny',[0.01 .02],3);
figure, imshow(E); title('Image obtained using MATLAB function');

image=E;
img=im2bw(image);
% imshow(img)

se = strel('line',3,0);
zz = imerode(img,se);
figure, imshow(zz);

精明边缘检测后的输出:

输出1

腐蚀后:

输出2

这里的问题是,在侵蚀所有水平边缘后都被破坏了,但我不希望这样。除了要删除所有垂直线和对角线之外,我还想提取所有水平线而不会中断。

请有人修改代码。

4

1 回答 1

1

这是一个黑客,但它的工作原理。一个简短的说明,我建议不要使用 clear all。它有一些负面影响,例如清除对 mex 函数的引用。我不太确定这意味着什么,但除非你想清除全局变量,否则它似乎没有真正的用处。

基本上我在这里所做的事情是三倍的。我添加了一个高斯滤波器来提供更多的容差,增加了 strel 的侵蚀率,并跨角度搜索以提供一些角度容差。最后,您在水平部分上比开始时多一点,但它确实使图像清晰得多。如果您愿意,您可以将 zz 矩阵相加并对其设置阈值以获得新的二进制图像,该图像可能更接近您的原始图像。真的很喜欢这个问题,让我期待秋天的图像处理。

clear; close all;
%Input Image
A = imread('5.png');
% figure, imshow(A);

C=medfilt2(A,[3 5]);
% figure,imshow(C);

D=imfill(C);
% figure,imshow(D);

%Image obtained using MATLAB function 'edge'    
E=edge(D,'canny',[0.01 .02],4);
figure, imshow(E); title('Image obtained using MATLAB function');

image=E;
img=double(image);
img = imgaussfilt(img,.5);
% imshow(img)
zz_out = zeros(size(img));
% se = strel('line',3,-90);
% zz = imerode(img,se);
% se2 = strel('line',3,0);
% zz2 = imerode(img,se2);
for ii = -5:.1:5
    se = strel('line',20,ii);
    zz = imerode(img,se);
    zz_out = or(zz,zz_out);
end
% zz_out = img-zz;
figure, imshow(zz_out);

组合变换的输出

于 2017-06-10T01:25:45.310 回答