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

Имам изображение с много нисък контраст, от което бих искал да извлека текстов обект. Тъй като има нисък контраст, опитах няколко метода, но нито един метод не ми даде задоволителен резултат. Използвах 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