用MATLAB进行图像处理

图像处理概念,算法和MATLAB

Feret属性-包装

今天我想结束我长期以来关于费里特直径的讨论。(以前的帖子:29 - 9 - 201710月24日—- 20172月20 - - 2018,16 - 3月- 2018)。

回想一下,费雷特直径测量的是一个物体沿特定方向的范围。下面的图表说明了这个概念。将要测量的物体置于卡尺的钳口内,卡尺以指定的角度对准。在保持这个角度的同时,将下巴紧紧地关在物体上。两颚之间的距离就是那个角度的费里特直径。

最大费雷特直径而且最小费列直径测量物体的最大宽度和最小宽度。在之前的文章中,我谈到了如何识别对足顶点对从集合的凸包顶点来加快寻找这些最大和最小测度的过程。我也被认为是人们可以对单个像素的形状做出各种假设,以及这些假设如何影响结果。(在这篇文章的其余部分,我将假设一个菱形像素形状,如Cris建议)。

让我们来看看这几个特定物体的测量值。

Bw = imread(“shape.png”);imshow (bw)
visualizeFeretProperties (bw)

上面的第一个图显示了Feret的最大直径和它的方向。它还显示了Feret直径的角度是正交于最大直径。

第二张图与之相似,不同之处在于它显示的是最小Feret直径而不是正交直径。你可以看到它们是不一样的,一般来说,它们不会是一样的。

第三个图显示了最小面积包围框,可以使用类似于最小费里特直径的搜索程序找到它。在这个图中,请注意边界框并没有与最大Feret维度的方向完全对齐。一般来说,它们不一定是对齐的,然后最小面积包围框的长度将小于最大费列维。

下面是我编写的函数,它将Feret直径属性添加到返回的表中 regionprops(使用 “表”选项)。它使用的算法函数,你可以在我以前的文章中找到。

T =区域道具(“表”bw,“PixelList”
T =1×1表PixelList _________________ [163875×2 double]
T = feretProperties(T)
T =表1×12PixelList MaxFeretDiameter MaxFeretDiameterEndpoints MaxFeretDiameterOrientation MinFeretDiameter MinFeretDiameterTrianglePoints MinFeretDiameterOrientation OrthogonalDiameter OrthogonalDiameterLowerPoints OrthogonalDiameterUpperPoints MinAreaBoundingBox MinAreaBoundingBoxArea  _________________ ________________ _________________________ ___________________________ ________________ ______________________________ ___________________________ __________________ __________________________________________________________ __________________ ______________________ [ 163875×2双)781.13(2×2双)-41.835 - 317.08(3×2双)-143.8 - 331.18(1×2双)[1×2双][5×2双]2.4321 e + 05

我希望你们中至少有一些人喜欢这个与物体形状测量相关的算法。

附录:使用的函数

函数T = feretProperties(T)版权所有:The MathWorks, Inc.maxfd = 0(高度(T),1);maxfd_endpoints = cell(height(T),1);maxfd_orientation = 0(高度(T),1);minfd = 0(高度(T),1);minfd_triangle_points = cell(高度(T),1);minfd_orientation = 0(高度(T),1);minod = 0(高度(T),1);minod_lower_points = cell(高度(T),1);minod_upper_points = cell(height(T),1);minbb = cell(height(T),1); minbb_a = zeros(height(T),1);k = 1:height(T) pixels = T. pixellist {k};V = pixelHull(像素,“钻石”);pairs = antipodalPairs(V);[maxfd(k),maxfd_endpoints{k}] = maxFeretDiameter(V,pairs);点数= maxfd_endpoints{k};E = points(2,:) - points(1,:);Maxfd_orientation (k) = atan2d(e(2),e(1));[minfd(k),minfd_triangle_points{k}] = minFeretDiameter(V,pairs);Points = minfd_triangle_points{k};E = points(2,:) - points(1,:);Thetad = atan2d(e(2),e(1)); minfd_orientation(k) = mod(thetad + 180 + 90,360) - 180; [minod(k),minod_lower_points{k},minod_upper_points{k}] =...feretDiameter (V, maxfd_orientation (k) + 90);[minbb{k},minbb_a(k)] = minAreaBoundingBox(V,pairs);结束T.MaxFeretDiameter = maxfd;t . maxferetdiameter terendpoints = maxfd_endpoints;T.MaxFeretDiameterOrientation = maxfd_orientation;T.MinFeretDiameter = minfd;T.MinFeretDiameterTrianglePoints = minfd_triangle_points;T.MinFeretDiameterOrientation = minfd_orientation;T.OrthogonalDiameter = minod;T.OrthogonalDiameterLowerPoints = minod_lower_points;T.OrthogonalDiameterUpperPoints = minod_upper_points;T.MinAreaBoundingBox = minbb; T.MinAreaBoundingBoxArea = minbb_a;结束函数[bb,A] = minAreaBoundingBox(V,antipodal_pairs)版权所有:The MathWorks, Inc.如果nargin < 2 antipodal_pairs = antipodalPairs(V);结束N = size(antipodal_pairs,1);P = antipodal_pairs(:,1);Q = antipodal_pairs(:,2);A = Inf;Thetad = [];K = 1:n如果K = n k1 = 1;其他的K1 = k+1;结束Pt1 = [];Pt2 = [];Pt3 = [];如果(p (k) ~ = p (k1)) & & (q (k) = = q (k1)) pt1 = V (p (k):);pt2 = V(p(k1),:);pt3 = V(q(k),:);elseif(p (k) = = p (k1)) & & (q (k) ~ = q (k1)) pt1 = V (q (k):);pt2 = V(q(k1),:);pt3 = V(p(k),:);结束如果~ isempty (pt1)%点pt1, pt2和pt3可能在最小面积上%包围框,与点pt1和pt2形成一条边重合%包围框。以底为三角形的高度% pt1-pt2边界框的高度,h。h = triangleHeight(pt1,pt2,pt3);Pt1pt2_direction = atan2d(pt2(2)-pt1(2),pt2(1)-pt1(1)));w = feretDiameter(V,pt1pt2_direction);A_k = h*w;如果(A_k < A) A = A_k;Thetad = pt1pt2_direction;结束结束结束旋转所有的点,使pt1-pt2为最小的包围框点%直上。R = 90 - thetad;Cr = cosd(r);Sr = sind(r);R = [cr -sr;sr cr);Vr = V * R';xr = Vr(:,1);yr = Vr(:,2);Xmin = min(xr);Xmax = max(xr); ymin = min(yr); ymax = max(yr); bb = [...xminyminxmaxyminxmaxymaxxminymaxxminymin将包围框点向后旋转。bb = bb * R;结束函数h = triangleHeight(P1,P2,P3)版权所有:The MathWorks, Inc.h = 2 * abs(signedTriangleArea(P1,P2,P3)) / norm(P1 - P2);结束函数区域= signedTriangleArea(A,B,C)版权所有:The MathWorks, Inc.area = ((B(1) - A(1)) * (C(2) - A(2)) -...(b (2) - a (2)) * (c (1) - a (1))) / 2;结束函数[d,V1,V2] = feretDiameter(V,theta) %版权所有2017-2018 The MathWorks, Inc. %旋转点,使感兴趣的方向垂直。Alpha = 90 - theta;Ca = cosd(alpha);Sa = sind(alpha);R = [ca -sa;sa ca);% Vr = (R * V')';Vr = V * R';y = Vr(:,2);Ymin = min(y,[],1); ymax = max(y,[],1); d = ymax - ymin; if nargout > 1 V1 = V(y == ymin,:); V2 = V(y == ymax,:);结束函数[d,end_points] = maxFeretDiameter(P,antipodal_pairs)版权所有:The MathWorks, Inc.如果nargin < 2 antipodal_pairs = antipodalPairs(P);结束v = P (antipodal_pairs (: 1):) - P (antipodal_pairs (:, 2):);D = hypot(v(:,1),v(:,2));[d,idx] = max(d, [],1);P1 = P(antipodal_pairs(idx,1),:);P2 = P(antipodal_pairs(idx,2),:);end_points = [P1;P2);结束函数[d,triangle_points] = minFeretDiameter(V,antipodal_pairs)版权所有:The MathWorks, Inc.如果nargin < 2 antipodal_pairs = antipodalPairs(V);结束n = size(antipodal_pairs,1);P = antipodal_pairs(:,1);Q = antipodal_pairs(:,2);d = Inf;三角点= [];对于k = 1:n如果k == n k1 = 1;Else k1 = k+1;结束pt1 = [];Pt2 = []; pt3 = []; if (p(k) ~= p(k1)) && (q(k) == q(k1)) pt1 = V(p(k),:); pt2 = V(p(k1),:); pt3 = V(q(k),:); elseif (p(k) == p(k1)) && (q(k) ~= q(k1)) pt1 = V(q(k),:); pt2 = V(q(k1),:); pt3 = V(p(k),:); end if ~isempty(pt1) % Points pt1, pt2, and pt3 form a possible minimum Feret diameter. % Points pt1 and pt2 form an edge parallel to caliper direction. % The Feret diameter orthogonal to the pt1-pt2 edge is the height % of the triangle with base pt1-pt2. d_k = triangleHeight(pt1,pt2,pt3); if d_k < d d = d_k; triangle_points = [pt1; pt2; pt3]; end end end end
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。