我是图像处理的新手,我尝试使用以下代码来检测垂直线 -
image=imread('benzene.jpg');
BW = im2bw(image);
w1=[-1 2 -1 ; -1 2 -1 ; -1 2 -1];
g=(imfilter(double(BW),w1));
g=abs(g);
T=max(g(:));
g=g>=T;
imshow(g);
这是我的图像 -
![输入图片描述](https://istack.dev59.com/phLp1.webp)
我是图像处理的新手,我尝试使用以下代码来检测垂直线 -
image=imread('benzene.jpg');
BW = im2bw(image);
w1=[-1 2 -1 ; -1 2 -1 ; -1 2 -1];
g=(imfilter(double(BW),w1));
g=abs(g);
T=max(g(:));
g=g>=T;
imshow(g);
我的一个简单建议是检测梯度并确定边缘点的方向。请记住,方向是指与边缘线垂直的方向。因此,如果您想找到垂直线条,则与垂直线条垂直的方向是水平的,在笛卡尔平面上,该方向要么是180度,要么是-180度。因此,对于每个检测到的边缘点的方向,如果方向是-180度或180度,则将此位置的输出设置为true
,否则设置为false
。使用图像处理工具箱中的imgradient
来检测梯度方向。假设您已经使用了imread
和im2bw
,它们都是该工具箱的一部分:
im = imread('http://i.stack.imgur.com/bdNOt.png');
tol = 5;
[~,ang] = imgradient(im);
out = (ang >= 180 - tol | ang <= -180 + tol);
imshow(out);
代码使用一个名为tol
的变量来定义一个容差,以便检测噪音或看起来垂直但在计算角度时可能不是的边缘。基本上,我们正在寻找任何角度在180度或-180度之内的点。
这是我们得到的结果:
作为后处理的手段,您可以使用bwareaopen
过滤掉像素区域面积低于某个值的像素。利用垂直线具有比其他像素更大的面积这一事实,您可以采取以下措施:
out_filter = bwareaopen(out, 50);
我们得到:
im = imread('http://i.stack.imgur.com/bdNOt.png');
tol = 20;
[~,ang] = imgradient(im);
out = (ang >= 45 - tol & ang <= 45 + tol) | (ang >= -135 - tol & ang <= -135 + tol);
out_filter = bwareaopen(out, 50);
imshow(out_filter);
这里同样需要增加公差:
im = imread('http://i.stack.imgur.com/bdNOt.png');
tol = 20;
[~,ang] = imgradient(im);
out = (ang >= 135 - tol & ang <= 135 + tol) | (ang >= -45 - tol & ang <= -45 + tol);
out_filter = bwareaopen(out, 50);
imshow(out_filter);
out=bwareaopen(out,50);
(可能需要稍微调整阈值)以删除与字母相关的线条。 - Jonasregionprops
完成。image=rgb2gray(imread('benzene.png'));
d=abs(255-image); % inverse the image
d=im2bw(d);
stat=regionprops(d,'Area', 'Orientation','PixelIdxList');
areas=[stat.Area];
hist(areas)
检查直方图可以确定切割线的位置,切割线的面积比字母小,而且应该大致相等。因此,我将面积在1000像素以下的部分进行切割:
idx=find(areas<1000);
angs=round([stat(idx).Orientation]);
angs
和idx
来获取任何类型的线。例如,让我们只绘制30度线:d2=zeros(size(d));
d2(vertcat(stat(idx(angs==30)).PixelIdxList))=1;
imagesc(d2)
image=imread('http://i.stack.imgur.com/bdNOt.png');
d=abs(1-image); % inverse the image
BW=im2bw(d);
BW = bwmorph(BW,'skel',1);
[H, T, R] = hough(BW,'Theta',-90:10:80);
P = houghpeaks(H, 100,'NHoodSize',[3 3],'threshold',1);
lines = houghlines(BW, T, R, P, 'FillGap',5, 'MinLength', 35);
让我们获取检测到的线的角度:
angs=round([lines.theta]);
如果你看到这里的angs
将会生成0度、-60度或60度的值。
如果你只想绘制0度的值:
p1=vertcat(lines(angs==0).point1);
p2=vertcat(lines(angs==0).point2);
imshow(BW, 'InitialMag',200, 'Border','tight'), hold on
for k = 1:size(p1,1)
line([p1(k,1) p2(k,1)],[p1(k,2) p2(k,2)], 'LineWidth',4,...
'Color',[1 0 0]); hold on
end
hold off
angles
和 idx
?你能给一些例子吗? - Nooberimage=imread('benzene.png');
BW = im2bw(image);
w1=(1/3)*[1 0 -1;1 0 -1;1 0 -1];
g=(imfilter(double(BW),w1));
g(g<1)=0;
imshow(g);
imlabel
),并计算每个高度上的宽度。如果宽度是恒定的,则为直线,否则为您想要避免的噪声。 - Ander Biguri