我试图将特定阈值处的连通分量区域与灰度级别的强度级别进行对比。
我想出的代码试图通过首先将文本图像转换为选定阈值的二进制文件并使用regionprops
找到该区域来完成此操作,将此图像转换回灰度。然后我使用hist
找到了强度等级。然后绘制强度与面积的关系。这基本上给了我一个大约6000个元素的强度矢量,连接的组件只有513.当我尝试plot
时,我收到以下错误:
???使用==>时出错情节 矢量必须长度相同。
这是我的代码
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
因此,你可以告诉我试图以阈值的增量找到连通分量的区域。
我对挑战的实施是错误的吗?这可以通过其他方式完成吗?
为了说清楚,最终产品应该是这样的:
答案 0 :(得分:1)
你应该为每个阈值做一个区域的直方图,而不是像素强度的直方图。假设您对使用regionprops找到的对象集合的区域属性感兴趣。
如果您对regionprops找到的每个物体的强度感兴趣,那么使用一个或多个“像素值测量”然后使用这些的直方图。
答案 1 :(得分: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)