Matlab 根据灰度图像中对象的强度级别绘制灰度对象的区域
基本上,我试图产生的是不同灰度强度下的图像直方图,显示图像中连接组件的区域 让我进一步解释一下,我计划在不同的阈值水平下查找图像所有连接组件的区域。然后以图形方式将它们组合在一起,并显示它们与灰度图像的强度级别(即Matlab 根据灰度图像中对象的强度级别绘制灰度对象的区域,matlab,image-processing,plot,image-segmentation,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 = imco
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
这产生了以下结果:
现在我已经找到了灰度图中连接组件的区域。如何绘制它们以显示为所需的输出(上面显示的蓝色输出)
感谢您根据现有代码阅读:
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)
,只会使对historut
的索引更直接一些
您可以使用imagesc
显示,然后更正勾号标签:
imagesc(histout)
colormap('jet')
set(gca,'XTickLabel',bins(get(gca,'XTick')));
set(gca,'YTickLabel',k(get(gca,'YTick')));
xlabel('Area')
ylabel('Threshold')
你能提供你的原始数据吗。如果我要看代码来完成一些事情,使用实际的输入可以确保更高质量的输出。谢谢。不需要具体数据。任何文本图像都可以。就像我在最后展示的图像一样。我认为对于每个灰度级别,您需要提取所有
区域值的列表,并从中构建直方图(使用一致的bin值)。“宽度图”中的每一行都是单个阈值级别的直方图。@nkjt您能否添加一个答案,其中包含如何实现这一点的代码。你所说的似乎产生了我想要的结果,但我不知道如何按照你解释的方式绘制直方图。非常感谢。