我有这个示例裁剪图像:
我需要使黑色粗线(水平和垂直)消失或提取,同时保留所有其他信息。这些特定的线条有 4 或 5 个像素粗。我试过:
- 如果图像被读取为 NumPy 数组,则对具有更多零/一的行进行简单过滤,但过滤条件不会终止,直到单行留下零或一。
- 使用简单内核 (3,3) 进行侵 eclipse ,但会留下一些噪声,因为一些符号也是黑色的
- 使用图像宽度的线结构元素进行膨胀,但连接不同符号的线段大小存在压倒性变化,因此丢失了每个小线段的基本信息。
有人可以给出关于什么样的结构元素的见解或方向,应该考虑什么类型的形态学操作或者可能是任何其他聪明的启发式方法?如果粗黑线的提取完成,输出将看起来像这个随机线段的网格:
最佳答案
这是侵 eclipse 图像和提取 hough 线的方式:
I=rgb2gray(imread('/image/cbHFL.jpg'));
Ibw=I>200;
imshow(Ibw)
SE=strel('disk',1)
Ier=imerode(~Ibw,SE);
[H,T,R] = hough(Ier);
P = houghpeaks(H,100,'threshold',ceil(0.1*max(H(:))));
lines = houghlines(Ier,T,R,P);
%% plot
imshow(I);hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
% Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','blue');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
从这里开始,您可以开始考虑要删除的内容。这并不简单,除非你有一个符号字典,例如你如何用>-<
删除结构周围的线?形状?您是删除所有中间像素还是保留整个中间细条?如果您知道没有粗线的符号应该如何,您只能知道这一点。
关于matlab - 提取图像中特定线条或线段的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294066/