필터 지우기
필터 지우기

Extracting points for sharp curvature from signed distance function array

조회 수: 4 (최근 30일)
Geoffrey Rivers
Geoffrey Rivers 2023년 4월 18일
답변: Supraja 2023년 5월 5일
I have a signed distance array, extracted from a black-and-white bitmap. The shape described by the bitmap is arbitrary, and could contain concave or convex curvature of varying scales. I am interested in extracting the position of corners that are sharper than a certain amount. I'm frankly not sure how to define that sharpness here; what I care about is 'shoving' a circle of a defined radius into that corner, and for the corner in total to be larger than that circle (in other words, I don't want it reporting every single rasterisation of the bitmap):
  1. identifying if any convex curvatures' radius is less a code-defined radius of curvature limit
  2. calculating what coordinate in the bitmap represents the centrepoint of the code-defined radius of curvature limit for that corner, and then
  3. to list any and all found sets of centerpoint coordinates in an array of format T= [x1, y1; x2, y2; .... xn, yn].
I'm obtaining my distance array and interpolation function as follows.
X = imread("MeshTest01.bmp"); %load logical (1 or 0) bitmap
A = imrotate(X,-90);
E=edge(A); % Edge finding of bitmap
DistE = bwdist(E, "euclidean"); % signed distance function from edge
DistA = bwdist(A, "euclidean"); % signed distance function from whitespace
D = DistE-2*DistA % Pixel-enumerative distance for signed distance function from material (outside is positive)
D = double(D); %make array forced to Double so interpolation works correctly
Fi = griddedInterpolant(D,'linear')
fd=@(p) Fi(p); %defining the interpolation function call

답변 (1개)

Supraja
Supraja 2023년 5월 5일
You can use ‘ischange()’ function which detects abrupt changes in data.
The detailed documentation link for the same is given here: https://www.mathworks.com/help/matlab/ref/ischange.html?searchHighlight=ischange%20function&s_tid=srchtitle_ischange%20function_1
The sample code to use this function is as shown below:
f = @(x) 1-(x./sqrt(1+x.^2)); % Create Function
x = linspace(-10, 10);
y = f(x);
changes = ischange(y, 'linear', 'SamplePoints', x);
plot(x, y, '-', x(changes), y(changes), 'gp')
grid on
axis('equal')
xlim([-2.5 2.5])

카테고리

Help CenterFile Exchange에서 Feature Detection and Extraction에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by