Извлечение объекта для низкоконтрастного изображения

У меня есть изображение с очень низкой контрастностью, из которого я хотел бы извлечь текстовый объект. Поскольку у него низкий контраст, я попробовал несколько методов, но ни один из них не дал удовлетворительного результата. Я использовал watershed для извлечения текстового объекта, но из-за плохой контрастности извлечение не удалось.

Моя программа для watershed:

I_cropped=imread(strcat('C:\Id\',currentfilename));
I_cropped = rgb2gray(I_cropped);
I_eq = histeq(I_cropped);  
figure,imshow(I_eq);
bw = im2bw(I_eq, graythresh(I_eq));
bw2 = imfill(bw,'holes');
bw3 = imopen(bw2, ones(5,5));
bw4 = bwareaopen(bw3, 40);
bw = im2bw(I_eq, graythresh(I_eq));
figure,imshow(bw);
mask_em = imextendedmax(I_eq, 30);
mask_em = imclose(mask_em, ones(5,5));
mask_em = imfill(mask_em, 'holes');
mask_em = bwareaopen(mask_em, 40);
figure,imshow(mask_em);
I_eq_c = imcomplement(I_eq);
figure,imshow(I_eq_c);
I_mod = imimposemin(I_eq_c, ~bw4 | mask_em);
figure,imshow(I_mod);
L = watershed(I_mod);
figure,imshow(label2rgb(L));

Я применил фильтр laplacian и усилил края, но это не помогло.

Моя цель - извлечь текстовый объект. Какой метод я должен попробовать для такого низкоконтрастного изображения?

Изображение прилагается:

введите здесь описание изображения


person batuman    schedule 16.03.2015    source источник
comment
Что вы подразумеваете под извлечь текстовый объект? Вы хотите получить область со всеми цифрами, разделить цифры или получить число, соответствующее числу на изображении? Уточните, пожалуйста, желаемый результат.   -  person Ratbert    schedule 16.03.2015


Ответы (1)


Вот как это сделать.

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

Затем инвертируйте изображение и примените regionprops для обнаружения объектов на изображении. После этого немного математики, чтобы вывести начало координат x и y (определяющее верхний левый угол), а также ширину и длину большого ограничивающего прямоугольника, охватывающего все буквы изображения.

Вот код:

clear
clc

close all

Im = rgb2gray(imread('Imtext.png'));

%// Apply median filter to remove outliers
Im = medfilt2(Im,[9 9]);

%// Clear borders and apply threshold, then invert image
ImBW = imclearborder(~(im2bw(Im,.55)));

%// Find bounding boxes to delineate text regions.
S = regionprops(ImBW,'BoundingBox');

%// Concatenate all bounding boxes and obtain x,y, width and length of big
%// bounding box enclosing everything
bb = cat(1,S.BoundingBox);

LargeBB_x = min(bb(:,1));
LargeBB_y = min(bb(:,2));

LargeBB_height = max(bb(:,4));

%// Find last column in which pixel value is 1; that's the end 
%// of the bounding box.
[~,ic] = find(ImBW==1);
MaxCol = max(ic(:));

LargeBB_width = MaxCol-LargeBB_x;

%// Display boxes
imshow(ImBW)
hold on
    rectangle('Position',[LargeBB_x LargeBB_y LargeBB_width LargeBB_height],'EdgeColor','r','LineWidth',2) 

hold off

И вывод:

введите здесь описание изображения

Или с исходным изображением:

введите здесь описание изображения

person Benoit_11    schedule 16.03.2015
comment
Потрясающие! Удачи :) - person Benoit_11; 16.03.2015
comment
Есть ли способ, которым я могу дополнительно сегментировать отдельные цифры? - person batuman; 16.03.2015
comment
Ммм, вы можете применить эрозию изображения или другие морфологические операции, чтобы сделать буквы тоньше... посмотрите на bwmorph и imerode. - person Benoit_11; 16.03.2015