Глядя на скелетные изображения, можно заметить, что шумовое изображение имеет много ответвлений по сравнению с текстовым изображением, и это выглядит как одна из возможностей, которые можно использовать. Эксперимент в виде кода, показанного ниже, пытается проверить то же самое, используя изображения 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) Чистое текстовое изображение
![введите здесь описание изображения](https://i.stack.imgur.com/J6qwf.png)
check_value = 1.7461
(II) Некоторое добавленное шумовое изображение
![введите здесь описание изображения](https://i.stack.imgur.com/kIQME.png)
check_value = 30.1453
(III) Добавлено еще несколько шумовых изображений ![введите здесь описание изображения](https://i.stack.imgur.com/GyKnv.png)
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