这是输入图像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);
精确边缘检测后的输出:
侵蚀后:
这里的问题是,在腐蚀之后所有的水平边都被打破了,但我不想这样。我想要提取所有水平线而不会破坏,除了想要删除所有垂直和对角线。
请有人修改代码。
答案 0 :(得分:1)
这是一个黑客,但它的工作原理。简而言之,我建议不要使用全部清除。它有一些负面影响,例如清除对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);