I have extracted an image object, now i need to determine the line of symmetry for that object

조회 수: 7 (최근 30일)
Hi,
I have an object of which there is a symmetrical pattern, i want to plot a line of symmetry and then determine the array co-ordinates of the boundary point of the that line of symmetry. For example consider below:
How could i go about detecting the line of symmetry for the object?

채택된 답변

Image Analyst
Image Analyst 2017년 4월 26일
Try the attached test.m file, below this image it creates.
  댓글 수: 4
Optical_Stress
Optical_Stress 2017년 4월 26일
This images i produced were actually already ones with masked backgrounds, what i'd like to know from your results is how i can rotate the vertical line so i can check how well it passes through the original image.
I tried rotating the values by
slope = atand(orientation);
y = slope * (x - xCentroid) + yCentroid;
y=y*sind(slope); x=(x)*cosd(slope);
hold on;
plot(x, y, 'r-', 'LineWidth', 3);
but this did not work unfortunately, I have the equation of the circle, i want to use this to determine the intersection point with the straight line. I might just do it using imtool and hovering over the point if it doesn't work out.
Thanks though, you're input has been really helpful.
Image Analyst
Image Analyst 2017년 4월 26일
The line does not need to be rotated since it already goes through the main axis of the binary image. Like I said, if you don't like the overall binary image, you can get a different, smaller one to try to find just the stripes, and recompute the angles.

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

추가 답변 (2개)

Walter Roberson
Walter Roberson 2017년 4월 26일
data = double(YourImage);
dv = data(:);
try_it = @(ang) sum((reshape(fliplr(imrotate(data,ang,'crop')),[],1) - dv).^2)
A = linspace(0,359.9,500);
fitr = arrayfun(try_it, A);
[~,idx] = min(fitr);
best_ang = A(idx);
Note: what you posted was an object in a white frame. The YourImage I indicate above should have that white frame cropped away (e.g., should be the original image.)
The code here will work for grayscale and color both.
What this does is rotates an image by an angle, with cropping, flips it left to right, and finds the euclidean distance between that and the original. The hypothesis being tested is that there is an axis of reflective symmetry running though the center of the image and that it is just necessary to find the correct angle for it.
This will probably not do exactly what you want, in that your hypothesis probably involves an axis of reflective symmetry to does not run through the center of the image. You should be able to extend the technique to two parameters and evaluating at a grid of value pairs.
fmincon() cannot really optimize this, as it is not a continuous problem: small differences in rotation angles lead to the same output.
  댓글 수: 1
Optical_Stress
Optical_Stress 2017년 4월 26일
편집: Optical_Stress 2017년 4월 26일
Hi, thanks for your response. Could you explain a bit more regarding the code?
What is the Linspace part for?
I have just run the code, from what i've seen it seems to have just reflected the image about the center....?

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


Image Analyst
Image Analyst 2017년 4월 26일
What if you threshold, then use bwconvhull() to get the convex hull of all blobs, then use regionprops to get the centroid and orientation angle?

카테고리

Help CenterFile Exchange에서 Image Data Workflows에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by