测量物体边界的不规则性

时间:2018-04-02 01:53:30

标签: python matlab border detection edge

我有下面的图像,想测量图像的边框不规则性。也就是说,指定边框(边缘)是否规则。

enter image description here

我一直在四处寻找,并且主要找到关于该主题的研究论文。我可以在PythonMATLAB中使用某些功能吗?

感谢。

2 个答案:

答案 0 :(得分:2)

正如尤瓦尔指出的那样,这实际上取决于你所说的常规或不定期。但是,为了快速开始,我采取了一种天真的假设,即常规意味着像圆圈一样。现在检查像素体是否像圆一样我使用regionprops函数来计算'EquivDiameter'属性:

  

返回一个标量,指定与区域面积相同的圆的直径。计算为sqrt(4 * Area / pi)。

然后我使用IOU measure来计算不规则性。为了测试代码,我使用了来自here的图像。

代码是这样的:

clc; close all; clear variables;
%% read image
I = imresize(rgb2gray(imread('maxresdefault.jpg')), 0.5);
I = imfill(medfilt2(I, [3 3])<230,'holes');
% I = imread('1.gif')>0; % load your GIF image
imshow(I); title('Shapes');

%% check irregularity
[L, n] = bwlabel(I);
S = regionprops('table', L, 'Centroid', 'EquivDiameter');
[X, Y] = meshgrid(1:size(I, 2), 1:size(I, 1));
r = zeros(1, n);
for i=1:n
   shape = L==i;
   circle = ((X-S.Centroid(i, 1)).^2+(Y-S.Centroid(i, 2)).^2)<(S.EquivDiameter(i)/2)^2;
   r(i) = 1-bwarea(shape&circle)/bwarea(shape|circle); % calculating ROI 
end

%% showing intersection
figure;
circs = im2double(repmat(I, 1, 1, 3));
circs = insertShape(circs, 'filledcircle', [S.Centroid S.EquivDiameter/2], 'LineWidth', 5);
imshow(circs); title('Intersections');

%% showing results
figure;
map = jet(256);
O = zeros(size(I), 'uint8');
for i=1:n
   ind = max(1,round(r(i)*256));
   O(L==i) = ind;
end
O = label2rgb(O, map);
O = insertText(O, S.Centroid, r, 'AnchorPoint', 'center', 'FontSize', 18);
imshow(O); title('Irregularity');
colormap jet;
colorbar('ticks', [0 1], 'TickLabels',{'Regular','Irregular'})

<强>结果:

enter image description here enter image description here enter image description here enter image description here

答案 1 :(得分:0)

或者只是您可以使用

测量圆度指数
        circularity_index=((4*np.pi*R.area)/pow(R.perimeter,2)) # circularity