Обнаружение однородной области с точки зрения связности на изображении

Я ищу некоторые измерения, чтобы различить эти два бинарных изображения (текст и шум).

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

Хотя преобразование частотной области мало что мне говорит (ни в скелете, ни в исходной форме), как видно ниже!

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

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

что ты думаешь ?

Я использую Matlab для теста.

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


person Brain Marker    schedule 27.03.2014    source источник


Ответы (2)


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

Экспериментальный код

%%// Experiment to research what features what might help us 
%%// differentiate betwen noise and text images

%%// Read in the given images
img1 = imread('noise.png');
img2 = imread('text.png');

%%// Since the given images had the features as black and rest as white, 
%%// we must invert them
img1 = ~im2bw(img1);
img2 = ~im2bw(img2);

%%// Remove the smaller blobs from both of the images which basically
%%// denote the actual noise in them
img1 = rmnoise(img1,60);
img2 = rmnoise(img2,60);

%// Get the skeleton images
img1 = bwmorph(img1,'skel',Inf);
img2 = bwmorph(img2,'skel',Inf);

%%// Find blobs branhpoints for each blob in both images
[L1, num1] = bwlabel(img1);
[L2, num2] = bwlabel(img2);
for k = 1:num1
    img1_bpts_count(k) = nnz(bwmorph(L1==k,'branchpoints'));
end
for k = 1:num2
    img2_bpts_count(k) = nnz(bwmorph(L2==k,'branchpoints'));
end

%%// Get the standard deviation of branch points count
img1_branchpts_std = std(img1_bpts_count)
img2_branchpts_std = std(img2_bpts_count)

Примечание. В приведенном выше коде используется функция — rmnoise, показанная ниже, которая построена на основе проблемы, обсуждаемой в этом ссылка :

function NewImg = rmnoise(Img,threshold)

[L,num] = bwlabel( Img );
counts = sum(bsxfun(@eq,L(:),1:num));
B1 = bsxfun(@eq,L,permute(find(counts>threshold),[1 3 2]));
NewImg = sum(B1,3)>0;

return;

Вывод

img1_branchpts_std =
   73.6230

img2_branchpts_std =
   12.8417

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

Работает на некоторых других образцах

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

(I) Чистое текстовое изображение

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

(II) Некоторое добавленное шумовое изображение

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

check_value = 30.1453

(III) Добавлено еще несколько шумовых изображений введите здесь описание изображения

check_value = 54.6446

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

Завершенный код

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

%%// Parameters
%%// 1. Decide this based on the typical image size and count of pixels 
%%// in the biggest noise blob
rmnoise_threshold = 60; 

%%// 2. Decide this based on the typical image size and how convoluted the
%%// noisy images are 
branchpts_count_threshold = 50; 

%%// Actual processing
%%// We are assuming input images as binary images with features as true 
%%// and false in rest of the region
img1 = im2bw(imread(FILE)); 
img1 = rmnoise(img1,rmnoise_threshold);
img1 = bwmorph(img1,'skel',Inf);

[L1, num1] = bwlabel(img1);
for k = 1:num1
    img1_bpts_count(k) = nnz(bwmorph(L1==k,'branchpoints'));
end

if std(img1_bpts_count) > branchpts_count_threshold
    disp('This is a noise image');
else
    disp('This is a text image');
end
person Divakar    schedule 28.03.2014

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

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

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

это схема, иллюстрирующая это. пиксели, у которых количество переходов равно 0 или больше 2 (красные), должны быть классифицированы как шум, а те, которые имеют 2 или 1 переход, классифицированы как нормальные.

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

Что вы думаете об этом подходе!

person Brain Marker    schedule 29.03.2014