从图像连通性角度检测均匀区域

时间:2014-03-27 13:58:30

标签: matlab image-processing spatial feature-detection

我正在寻找一些测量来区分这两个二进制图像( texte和noise )。

enter image description here

频域的Hough变换不会告诉我太多(无论是在骨架中还是在原始形状中),如下所示!

enter image description here

在空间域中,我尝试测量,如果给定像素参与线或曲线,或参与随机形状,然后测量参与的所有像素的百分比并且不参与正常形状(线和曲线) )区分这些图像,但我没有成功,在实施中。

你觉得怎么样?

我使用matlab进行测试。

提前致谢

2 个答案:

答案 0 :(得分:1)

观察骨骼图像,人们可以注意到噪声图像中有多个分支,与文本图像相比,这看起来像是可以被利用的特征之一。下面显示的代码实验使用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是根据此link中讨论的问题构建的:

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)纯文字图片

enter image description here check_value = 1.7461

(II)一些添加的噪点图像

enter image description here

check_value = 30.1453

(III)增加了一些噪点图像 enter image description here

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

答案 1 :(得分:0)

现在你建议如果我们尝试使用原始形状而不是骨架,(以避免丢失信息)。 我尝试通过计算顺时针方向上从白色到黑色的过渡次数来测量给定像素,过去整个像素的笔划(而不是直线分支)的伸长。

我正在考虑使用一个半径为圆的圆,并考虑像素的原点,并将位于圆的边缘的像素存储在一个有序列表中(顺时针),然后计算过渡的数量(黑色)从此列表中获取白色。

通过增加圆的半径,我们可以追踪细长的斯托克斯的形状,并知道他的方向。

这是一个说明这一点的模式。 具有等于​​0或大于2的转换(红色)的像素必须被分类为噪声,并且具有2或1个转换的像素被归类为正常。

enter image description here

您如何看待这种方法!