필터 지우기
필터 지우기

how to find contour inflection points?

조회 수: 8 (최근 30일)
Alessandro
Alessandro 2014년 5월 30일
댓글: Alessandro 2014년 5월 31일
Hi, i have a bw image describing a shape contour. How find the coordinates of inflection points? And then, how plot the fingerprint representarion? Thanks to all!!!

채택된 답변

Bjorn Gustavsson
Bjorn Gustavsson 2014년 5월 30일
편집: Bjorn Gustavsson 2014년 5월 30일
Inflection points ought to be rather simple to calculate (function below should get the job done), but the actual contour-lines returned from contour et al. might have a rather large number of inflection-points as you can verify by looking at the example.
HTH,
function r_inflections = contourinflectionpoints(C,fK)
% CONTOURINFLECTIONPOINTS - find inflection-points on contourlines
% CONTOURINFLECTIONPOINTS identifies inflection points on
% contourlines by identifying line-segments where the curvature
% changes direction. Each contourline is interpreted as a number
% of connected straight-line-segments and an inflection-point is
% identified as the mid-point of a line-segment where the
% neihbouring points fall on opposite sides of the extension of
% the line-segment.
%
% Calling:
% r_inflections = contourinflectionpoints(C,fK)
% Input:
% C - contourline matrix as returned by contourc or the
% contour-family of functions on the format:
% C = [level1 x1 x2 x3 ... level2 x2 x2 x3 ...;
% pairs1 y1 y2 y3 ... pairs2 y2 y2 y3 ...]
% fK - filter-factors used to smoothen the contour-lines (simple
% experimentation reveal that contourlines can have a large
% number of spurious inflection-points, smoothing of the
% contour-lines reduces this problem, user tuning required).
% Output:
% r_inflections - [n x 2] double array with identified
% inflection-points.
%
% Example:
% M = peaks(127);
% C = contour(M,8);
% r_i = contourinflectionpoints(C);
% fK = [1/2,1,1/2]/2;
% r_s = contourinflectionpoints(C,fK);
% hold on
% plot(r_i(:,1),r_i(:,2),'b.')
% plot(r_s(:,1),r_s(:,2),'ro','linewidth',3)
%
% No argument checks or error-controls, if you want that you have
% to pay me good money.
% Copyright © B. Gustavsson 20140530, GPL version 3 or later applies
%%Extract the individual contour-lines
iC = 1;
idxC = 1;
while iC < size(C,2)
nP = C(2,iC); % number of points in current contour
xC{idxC} = C(1,iC+(1:nP)); % x coordinates of current contour
yC{idxC} = C(2,iC+(1:nP)); % y coordinates of current contour
if nargin > 1 && ~isempty(fK)
xC{idxC} = filtfilt(fK/sum(fK),1,xC{idxC});
yC{idxC} = filtfilt(fK/sum(fK),1,yC{idxC});
end
iC = iC+nP+1; % Start-point of next contour
idxC = idxC + 1; % next contourline index
% plot(xC{idxC-1},yC{idxC-1},'b.-')
% pause
end
iInflections = 1;
for iC = 1:length(xC),
for iP = 2:(length(xC{iC})-2)
% First take 2 points on the current contour :
r0 = [xC{iC}(iP);yC{iC}(iP)];
r1 = [xC{iC}(iP+1);yC{iC}(iP+1)];
% let them define a stratight line on the form:
% dot(r,e_n) - 1 = 0
e_n = [cos(pi/2) sin(pi/2);-sin(pi/2) cos(pi/2)]*(r1-r0)/norm(r1-r0);
l = dot(r0,e_n);
% the points on the contour on either side of the line-segment:
r_p = [xC{iC}(iP+2);yC{iC}(iP+2)];
r_m = [xC{iC}(iP-1);yC{iC}(iP-1)];
% lengths along e_n to points r_p and r_m
l_p = dot(r_p,e_n);
l_m = dot(r_m,e_n);
% if they are on either side of the line-segment then we have
% an inflection point
if (l_p - l)*(l_m - l) <0
% take the mid-point of that line-segment as the
% inflection-point, change this according to taste...
r_inflections(iInflections,:) = (r0+r1)'/2;
iInflections = iInflections + 1;
end
end
end

추가 답변 (2개)

Image Analyst
Image Analyst 2014년 5월 30일

Alessandro
Alessandro 2014년 5월 30일
편집: Image Analyst 2014년 5월 30일
Hi, thanks for responses! I don't know (and still understand) the 'countour'/'contourc' Matlab function.... I have not regular shapes (triangles, squares, etc...), in my situation i have just a bw image (obtained from such edge detection filters and others..) and i just need to locate the inflection points of a shape in orther to make a descriptor for it. Can i use contour functions also in this situation?... i didn't understand what contour function does with just a bw image.
To be more clear, i need something like figure 3) and 4) of this page http://vgg.fiit.stuba.sk/wordpress/2013-04/css-%E2%80%93-curvature-scale-space-in-opencv/.
  댓글 수: 6
Alessandro
Alessandro 2014년 5월 31일
Ok... maybe I am.. l is the line that connect r0 and r1, if rm and rp are both under or both up from this line i have an inflection in the middle of r0 and r1... so for my application i could augment the distance of these points
Alessandro
Alessandro 2014년 5월 31일
Ok... i got it!!... but i still don't understand the mathematical meaning og e_n and l. Thanks a lot!!

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Surface and Mesh Plots에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by