2014-02-08 42 views
0

我试图绘制在灰度强度级别的特定阈值连接组件的面积。如何绘制包含6000个元素的矢量对包含500个元素的矢量?

我想出的代码试图通过首先在选定的阈值下将文本图像转换为二进制文件并使用regionprops找到该区域,将该图像转换回灰度。然后我使用hist找到强度等级。然后绘制强度与面积的关系。这基本上给了我一个强度矢量大约6000元的,当我尝试plot我得到以下错误的连接组件仅513:

??? Error using ==> plot Vectors must be the same lengths.

这里是我的代码

img = rgb2gray(imread('urdu.jpg')); 

for k = 0:0.01:1 
    bw_normal = im2bw(img, k); 
    bw = imcomplement(bw_normal); 
    [label,n] = bwlabel(bw); 
    stats = regionprops(label, 'Area'); 
    gray = double(bw_normal); 
    h = hist(gray); 
    h = h(:); 
    plot([stats.Area],h); 
    %axis([0 350 0 1.1]) 
    hold on; 
end 

所以你可以告诉我试图以增量的阈值查找连接组件的区域。

是我的执行挑战的错吗?这可以通过其他方式完成吗?

只是要清楚,最终产品应该是这个样子:

enter image description here

回答

1

因为你bwlabel后计算领域你不能做原来的灰度图像的直方图。一种肮脏的方法可能不需要调用hist函数,但您需要粗略估计连接组件的最大面积。请注意,有时您设置了一个阈值,一些连接组件的面积非常大,但这样大的值只发生很少的次数(大部分时间是1)。你可能会考虑在你的最终形象中忽略这么大的一块。根据您显示的图像,我使用200作为允许的最大连接组件区域。

MAP=zeros(101,200); 
for k=0:0.01:1 
    bw_normal = im2bw(img, k); 
    bw = imcomplement(bw_normal); 
    [label,n] = bwlabel(bw); 
    stats = regionprops(label, 'Area'); 

    for j=1:length(stats) 
     if stats(j).Area<=200 
      MAP(fix(k/0.01+1),stats(j).Area)=MAP(fix(k/0.01+1),stats(j).Area)+1; 
     end 
    end 
end 
imagesc(MAP) 
+0

感谢您的回答。但是你能否请你进一步解释你的代码。我无法理解一些概念。你最多提到一次我会得到一个非常大的区域,何时以及为什么会发生这种情况?选择101行和200列的原因是什么?你也可以解释一下if语句中的语句,为什么''fix''而不是'round''以及为什么''1''?非常感谢 – StuckInPhD

+0

同样在你的代码生成的图像上,我在y轴上有0-100,在x轴上有0-200。这些意味着什么?我想绘制连接组件的强度与面积?那么左边的绿色斑点意味着大多数连接的组件都在1-5区域内?谢谢 – StuckInPhD

+1

修复(k/0.01 + 1)只会让你的k 0:0.01:1得到1:101。因为matlab索引从1开始,你也可以使用round。这也是你选择101行的原因。我根据您在问题中显示的图像选择了200列,您可以更改此值。这里的列是指连接组件的区域 – lennon310

1

你应该为每个阈值不是像素强度的直方图做区域的直方图。假设您对区域属性感兴趣,以收集使用regionprops发现的对象。

如果有兴趣通过regionprops发现然后使用“像素值测量”的一个或多个的每个对象的强度,然后使用这些的直方图。