Общий подход для извлечения определенных линий или отрезков в изображении
У меня есть этот образец обрезанного изображения:
Мне нужно, чтобы черные толстые линии (горизонтальные и вертикальные) исчезали или выделялись, оставляя всю остальную информацию нетронутой. Эти конкретные линии имеют толщину 4 или 5 пикселей. Я старался:
- Простая фильтрация строк, имеющих больше нулей / единиц, если изображение читается как массив NumPy, но условие фильтрации не заканчивается, пока в одной строке не останется ноль или единица.
- Эрозия с простым ядром (3,3), но оставляет немного шума, потому что некоторые символы также толстые черные
- Расширение с линейным структурирующим элементом ширины ширины изображения, но есть огромные различия в размерах сегментов линии, соединяющих различные символы, что основная информация о каждом маленьком сегменте линии теряется.
Может ли кто-то дать понимание или указания о том, какого рода структурирующие элементы, какой тип морфологических операций следует учитывать, или это может быть любая другая умная эвристика? Вывод, если выделение толстых черных линий выполнено, будет выглядеть как эта сетка случайных отрезков:
1 ответ
Вот как вы стираете изображение и извлекаете грубые линии:
I=rgb2gray(imread('https://stackru.com/images/1de10cf27192649f91c3a49e4ce5cc1162488ff8.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
Отсюда вы можете начать думать о том, что удалить. Это не просто, если у вас нет словаря символов, например, как вы удаляете линию вокруг структур с помощью >-<
форма? Вы удаляете все средние пиксели или сохраняете всю среднюю тонкую полосу? Вы можете знать это, только если знаете, каким должен быть символ без жирных линий.