我的任务是要求分析填充有彩色形状的图像并突出显示图像中的蓝色圆圈。为此,我将图像分割为RGB通道,并创建仅蓝色像素的二进制图像。使用斑点检测我已设法分割图像并找到每个形状的圆度。但是,当我尝试在圆形上放置边界线时,它会将边界放在所有形状周围,而不仅仅是圆形。相关的代码部分如下所示;
imshow(BBinEro)
for cnt = 1:length(BlueProps)
%disp(score);
if score(cnt) >= 0.98 %
text(BlueProps(cnt).Centroid(1),BlueProps(cnt).Centroid(2),num2str(score(cnt)),'color','red');
boundaries = bwboundaries(BBinEro);
numberOfBoundaries = size(boundaries);
hold on
for k = 1 : numberOfBoundaries
thisBoundary = boundaries{k};
if score(cnt) >= 0.98 %Only showing for circles
plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
end
end
hold off
end
end
“得分”是blob圆度的度量。得分为1意味着斑点是完美的圆形。程序在其质心处显示圆形的圆形度;使用相同的if语句,我试图在它们周围插入一条边界线。关于我如何修复此代码以便仅显示圆圈边界的任何建议或观察将非常感激。
附图显示了该程序当前正在执行的操作。我想摆脱三角形和正方形周围的绿色边界。
答案 0 :(得分:3)
这似乎可以解决您的问题:
[B,L,N,A] = bwboundaries(BBinEro);
for k=1:length(B)
text(BlueProps(k).Centroid(1),BlueProps(k).Centroid(2),num2str(score(k)),'color','red');
if(~sum(A(k,:))) & score(k) >= 0.98
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'r','LineWidth',2);
end
end
我刚刚将条件& score(k) >= 0.98
添加到matlab文档here中的示例中。这假设得分数组的排序方式与bwboundaries
生成的对象数组相同。如果score
中的对象的排序方式与regionprops
生成的对象的顺序相同,那么这是正常的,因为regionprops
和bwboundaries
索引对象的顺序相同。
代码中的错误在于您在外循环的每次迭代中重新计算bwboundaries(BBinEro)
。据推测,您正在尝试使用每次新迭代计算每个新对象的边界,而是计算整个图像(我猜是BBinEro
)。希望这能解决你的问题。