Общий подход для извлечения определенных линий или отрезков в изображении - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть этот образец обрезанного изображения:

enter image description here

Мне нужно, чтобы черные толстые линии (горизонтальные и вертикальные) исчезали или извлекались, оставляя всю остальную информацию нетронутой. Эти конкретные линии имеют толщину 4 или 5 пикселей. Я попробовал:

  1. Простая фильтрация строк, имеющих больше нулей / единиц, если изображение читается как массив NumPy, но условие фильтрации не заканчивается, пока в одной строке не останется ноль или единица.
  2. Эрозия с простым ядром (3,3), но она оставляет некоторый шум, потому что некоторые символы также толстые черные
  3. Расширение с помощью элемента структурирования линии ширины ширины изображения, но существуют огромные различия в размерах сегментов линии, соединяющих различные символы, в результате чего основная информация о каждом маленьком сегменте линии теряется.

Может ли кто-то дать понимание или указания о том, какого рода структурирующие элементы, какой тип морфологических операций следует учитывать или какие-либо другие умные эвристики? Вывод, если извлечение толстых черных линий выполнено , будет выглядеть как эта сетка случайных отрезков: enter image description here

1 Ответ

0 голосов
/ 14 ноября 2018

Вот как вы стираете изображение и извлекаете грубые линии:

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

Отсюда вы можете начать думать о том, что удалять.Это не просто, если у вас нет словаря символов, например, как удалить линию вокруг структур с формой >-<?Вы удаляете все средние пиксели или сохраняете всю среднюю тонкую полосу?Вы можете знать это, только если знаете, каким должен быть символ без жирных линий.

enter image description here

...