3

我有这个示例裁剪图像:

在此处输入图像描述

我需要使黑色粗线(水平和垂直)消失或提取,同时保持所有其他信息完好无损。这些特定的线条是 4 或 5 像素厚。我试过了:

  1. 如果图像被读取为 NumPy 数组,则对具有更多零/一的行进行简单过滤,但过滤条件不会终止,直到单行剩下零或一。
  2. 使用简单内核 (3,3) 进行侵蚀,但会留下一些噪音,因为有些符号也是厚黑色
  3. 使用图像宽度宽度的线结构元素进行膨胀,但连接不同符号的线段大小存在压倒性变化,导致每个小线段的基本信息丢失。

有人可以就什么样的结构元素、应该考虑什么样的形态学操作或任何其他聪明的启发式方法提供见解或指导?如果完成了粗黑线的提取,则输出将类似于以下随机线段网格: 在此处输入图像描述

4

1 回答 1

2

这是你如何腐蚀图像并提取霍夫线:

I=rgb2gray(imread('https://i.stack.imgur.com/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

从这里,您可以开始考虑要删除的内容。除非你有一个符号字典,否则这并不简单,例如你如何删除带有>-<形状的结构周围的线?您是删除所有中间像素还是保留整个中间细条?只有知道符号在没有粗线的情况下应该是怎样的,才能知道这一点。

在此处输入图像描述

于 2018-11-14T11:33:38.020 回答