2

我有一项任务需要分析一个填充有彩色形状的图像并突出显示图像中的蓝色圆圈。为此,我将图像拆分为其 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

“分数”是对斑点圆形度的度量。分数为 1 表示该 blob 是完美的圆形。程序显示圆形在其质心处的圆度;使用相同的 if 语句,我尝试在它们周围插入一条边界线。任何关于如何修复此代码以使其仅显示圆圈边界的建议或意见将不胜感激。

所附图像显示了程序当前正在执行的操作。我想摆脱三角形和正方形周围的绿色边界。 在此处输入图像描述

4

1 回答 1

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 文档中将条件添加到示例中。这假设分数数组的排序方式与生成的对象数组相同。如果对象 in的排序方式与生成的对象相同,则可以,因为和索引对象的顺序相同。bwboundariesscoreregionpropsregionpropsbwboundaries

您的代码中的错误在于您bwboundaries(BBinEro)使用外部循环的每次迭代重新计算。大概您正在尝试通过每次新迭代来计算每个新对象的边界,但是您正在计算整个图像(我猜是BBinEro)。希望这能解决您的问题。

于 2013-08-11T15:56:15.017 回答