matlab - 提取图像中特定线条或线段的一般方法

标签 matlab opencv image-processing image-morphology

我有这个示例裁剪图像:

enter image description here

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

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

有人可以给出关于什么样的结构元素的见解或方向,应该考虑什么类型的形态学操作或者可能是任何其他聪明的启发式方法?如果粗黑线的提取完成,输出将看起来像这个随机线段的网格: enter image description here

最佳答案

这是侵 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

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

enter image description here

关于matlab - 提取图像中特定线条或线段的一般方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294066/

相关文章:

c++ - 图像处理-大纲

python - 在 python 中画一条线直到掩码 OpenCV 的边缘

visual-c++ - OpenCV和包含文件

c++ - 写入 .PGM 图像会导致形状困惑

windows - cmd 上的 Matlab (winxp)

r - 如何绘制 ROC 曲线以从 Weka 输出的二元类和多类数据进行交叉验证?

matlab - 为什么保存到名为 temp 的文件夹会导致数据加载在 Matlab 的 for 循环中变慢?

php - 计算宽度和高度以调整图像大小

c# - 将 8BIM 配置文件元数据添加到 tiff 图像文件

python - 在 joblib `matlab` 上下文中腌制 `Parallel` 对象时出错