基本上我想要产生的是不同灰度强度的图像直方图,显示图像中连接成分的面积。
让我进一步解释,我计划在变化阈值水平找到图像的所有连通分量的区域。然后以图形方式将它们全部组合,并显示它们相对于灰度图像的强度等级绘制,即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的面积并根据所选的阈值水平绘制它们。这就是它产生的:
这不是我想要的。我试图复制这个结果。它不必看起来像这样,但任何类似的东西都会做
然后我发现我可以直接使用STATS = regionprops(..., I, properties)
所以我写了这个:
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
这产生了以下结果:
所以现在我已经发现连接组件的区域是灰度的。如何绘制它们以显示为我想要的输出(我上面显示的蓝色)?
感谢您阅读
答案 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')