以灰度图像中的强度等级绘制灰度对象的区域

时间:2014-02-12 21:15:53

标签: matlab image-processing plot image-segmentation

基本上我想要产生的是不同灰度强度的图像直方图,显示图像中连接成分的面积。

让我进一步解释,我计划在变化阈值水平找到图像的所有连通分量的区域。然后以图形方式将它们全部组合,并显示它们相对于灰度图像的强度等级绘制,即0 - 255

我希望我的代码能够解释我想要做的事情。

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));

for k = 1:-0.01:0.1
     bw_normal = im2bw(img, k);
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area', 'Centroid'});
      plot([stats.Area],k,'o');
      axis([0 1000 0.1 1])

     hold on;

 end

正如您所知,我使用for循环来产生不同的阈值水平,计算CC的面积并根据所选的阈值水平绘制它们。这就是它产生的:

enter image description here

这不是我想要的。我试图复制这个结果。它不必看起来像这样,但任何类似的东西都会做

enter image description here

然后我发现我可以直接使用STATS = regionprops(..., I, properties)

从灰度图像中找到CC的属性

所以我写了这个:

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));

for k = 1:-0.01:0.1
     bw_normal = im2bw(img, k);
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area', 'Centroid'});
%       plot([stats.Area],k,'o');
%       axis([0 1000 0.1 1])
      imshow(img);
     hold on;
     for j = 1:numel(stats)
         text(stats(j).Centroid(1),stats(j).Centroid(2), ...
        sprintf('%2.1f', stats(j).Area), ...
        'EdgeColor','b','Color','r');
     end

 end

这产生了以下结果:

enter image description here

所以现在我已经发现连接组件的区域是灰度的。如何绘制它们以显示为我想要的输出(我上面显示的蓝色)?

感谢您阅读

1 个答案:

答案 0 :(得分:1)

根据您现有的代码:

img = rgb2gray(imread('W1\Writer1_01_02.jpg'));
k = 1:-0.01:0.1;
bins = 1:100 % change depending on your image

% preallocate output - this will be filled with histograms
histout = zeros(length(k),length(bins); 

for m = 1:length(k); 
     bw_normal = im2bw(img, k(m));
     bw = imcomplement(bw_normal);
     [label,n] = bwlabel(bw);
     stats = regionprops(label,img, {'Area'});
     A = cell2mat(struct2cell(stats));
     histout(m,:) = hist(A,bins);
end

我将regionprops的输出更改为Area,因为它简化了输出结构转换为hist可读取的内容。从循环到k更改为预定义向量k并在循环中使用k(m)只会使histout的索引更加直接。

您可以使用imagesc显示,然后更正刻度标记:

imagesc(histout)
colormap('jet')
set(gca,'XTickLabel',bins(get(gca,'XTick')));
set(gca,'YTickLabel',k(get(gca,'YTick')));
xlabel('Area')
ylabel('Threshold')