Автоматическое удаление прямых с помощью преобразования Хафа - PullRequest
0 голосов
/ 07 июня 2018

Я делаю диссертацию по оптическому распознаванию символов.Моя работа состоит в том, чтобы правильно сегментировать текстовые символы из изображений.

Проблема в том, что в каждой текстовой строке на этом языке есть слова, в которых символы часто связаны прямыми линиями.Эти линии могут иметь или не иметь одинаковую толщину.

До сих пор, используя профиль проекции, я смог сегментировать символы, которые не прикреплены ни к одной из прямых линий.Но чтобы сегментировать символы, которые связаны прямыми линиями, я должен удалить эти линии.Я предпочитаю использовать преобразование Хафа для обнаружения и удаления этих линий (то есть в изображении черно-белого изображения, если пиксель в строке черный, а затем сделать его белым).

См. Образец изображения, содержащий текст: Образец изображения

Эта является линией, сегментированной от изображения выше, с использованием профиля проекции.

И Эти являются обнаруженными линиями с использованием HoughПреобразование.

Код для преобразования Хафа.Используйте Это изображение, чтобы проверить его.

I = imread('line0.jpg');
%I = rgb2gray(I);
BW = edge(I,'canny');
[H,T,R] = hough(BW);
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
xlabel('\theta'),ylabel('\rho');
axis on, axis normal, hold on;
P = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2));
y = R(P(:,1));
plot(x,y,'s','color','blue');

% Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure, imshow(I), hold on
grid on
max_len = 0;

for k = 1:length(lines)
    xy = [lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),'LineWidth',1,'Color','green');

    % plot beginnings and ends of lines
    plot(xy(1,1),xy(1,2),'o','LineWidth',2,'Color','red');
    plot(xy(2,1),xy(2,2),'o','LineWidth',2,'Color','blue');

    % 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

Есть идеи, как мне это сделать?Любая помощь будет оценена!

1 Ответ

0 голосов
/ 07 июня 2018

С houghlines вам просто нужно заменить индексы линии на белые (в данном случае 255).Возможно, вам придется немного поэкспериментировать с отступом, чтобы снять еще один или два пикселя.

РЕДАКТИРОВАТЬ: Вот версия пытается определить отступ.

%% OCR
I = imread('CEBML.jpg');
BW = edge(I,'canny');
[H,T,R] = hough(BW);
P = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2));
y = R(P(:,1));

% Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
subplot(2,1,1)
grid on
imshow(I)
title('Input')
hold on
px = 5; % Number of padding pixels to probe
white_threshold = 30; % White threshold
ln_length = .6; % 60 %
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    buf_y = xy(1,1):xy(2,1); % Assuming it's a straight line!
    buf_x = [repmat(xy(1,2),1,xy(2,1) - xy(1,1)),xy(2,2)] +  [-px:px]';
    I_idx = sub2ind(size(I),buf_x, repmat(buf_y,size(buf_x,1),1));
    % Consider lines that are below white threshold, and are longer than xx
    % of the found line.
    idx = sum(I(I_idx) <= white_threshold,2) >= ln_length * size(I_idx,2);
    I(I_idx(idx,:)) = 255;

    % Some visualisation 
    [ixx,jyy] = ind2sub(size(I),I_idx(idx,:));
    plot(jyy,ixx,'.r');% Pixels set to white 
    plot(xy(:,1),xy(:,2),'-b','LineWidth',2);  % Found lines
end
subplot(2,1,2)
grid on
imshow(I)
title('Output')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...