Как улучшить качество изображения в Matlab - PullRequest
3 голосов
/ 04 июля 2011

Я создаю систему " Оптическое распознавание символов ".

пока система способна идентифицировать номерные знаки в хорошем качестве без шума.

на следующем уровне я хочу иметь возможность идентифицировать номерные знаки в плохом качестве из-за разных причин.

например, давайте посмотрим на следующую табличку:

enter image description here

как видите, цифры не выглядят четко из-за возврата света или чего-то еще.

на мой вопрос: как я могу улучшить качество изображения, чтобы при переходе к двоичному изображению числа не исчезали?

спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

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

Для цветных изображений RGB просто повторите процесс на каждом канале отдельно или даже примените его к другому цветовому пространству (HSV, L a b * и т. Д.)

Вот пример реализации:

function img = correctLighting(img, method)
    if nargin<2, method='rgb'; end
    switch lower(method)
        case 'rgb'
            %# process R,G,B channels separately
            for i=1:size(img,3)
                img(:,:,i) = LinearShading( img(:,:,i) );
            end
        case 'hsv'
            %# process intensity component of HSV, then convert back to RGB
            HSV = rgb2hsv(img);
            HSV(:,:,3) = LinearShading( HSV(:,:,3) );
            img = hsv2rgb(HSV);
        case 'lab'
            %# process luminosity layer of L*a*b*, then convert back to RGB
            LAB = applycform(img, makecform('srgb2lab'));
            LAB(:,:,1) = LinearShading( LAB(:,:,1) ./ 100 ) * 100;
            img = applycform(LAB, makecform('lab2srgb'));
    end
end

function I = LinearShading(I)
    %# create X-/Y-coordinate values for each pixel
    [h,w] = size(I);
    [X Y] = meshgrid(1:w,1:h);

    %# fit a linear plane over 3D points [X Y Z], Z is the pixel intensities
    coeff = [X(:) Y(:) ones(w*h,1)] \ I(:);

    %# compute shading plane
    shading = coeff(1).*X + coeff(2).*Y + coeff(3);

    %# subtract shading from image
    I = I - shading;

    %# normalize to the entire [0,1] range
    I = ( I - min(I(:)) ) ./ range(I(:));
end

Теперь давайте протестируем его на заданном изображении:

img = im2double( imread('http://i.stack.imgur.com/JmHKJ.jpg') );
subplot(411), imshow(img)
subplot(412), imshow( correctLighting(img,'rgb') )
subplot(413), imshow( correctLighting(img,'hsv') )
subplot(414), imshow( correctLighting(img,'lab') )

enter image description here

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


РЕДАКТИРОВАТЬ: Вот некоторые результаты, которые я получил, применив другие методы повышения контрастности IMADJUST , HISTEQ , ADAPTHISTEQ в различных цветовых пространствах таким же образом, как указано выше:

enter image description here

Помните, что вы должны точно настроить любой параметр, чтобы соответствовать вашему изображению ...

1 голос
/ 05 июля 2011

Поскольку вы хотите найти только цифры (из которых только 10), вы можете использовать взаимную корреляцию. Для этого вы бы Фурье преобразовал изображение пластины. Вы также преобразовываете Фурье шаблон, который хотите, чтобы оно соответствовало хорошему представлению изображения цифры 1. Затем вы умножаете в пространстве Фурье и обратно преобразовываете результат Фурье.

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

Вы делаете это 10 раз и знаете, где находится каждая цифра. Обратите внимание, что вы должны исправить наклон перед тем, как выполнять взаимную корреляцию.

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

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

1 голос
/ 04 июля 2011

Похоже, что на ваш вопрос уже был получен более или менее ответ (см. Комментарий d00b);однако вот несколько основных советов по обработке изображений, которые могут вам здесь помочь.

Во-первых, вы можете попробовать простой imadjust .Это просто отображает интенсивность пикселей на «лучшее» значение, которое часто увеличивает контраст (что облегчает просмотр / чтение).У меня был большой успех в моей работе.Это тоже легко использовать!Я думаю, что стоит попробовать.

Кроме того, этот выглядит многообещающе, если вы просто хотите изображение с более высоким разрешением.

Наслаждайтесь "удовольствием" от обработки изображений в MATLAB!

Удачи,

tylerthemiler

PS Если вы сглаживаете изображение в двоичном формате, скорее всего, вы испортите изображение для начала, так что не делайте этогочто если вы можете избежать этого!

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