128 views (last 30 days)

Hey,

I have this image:

I want to find the 4 corners of the "rectangular", but I don't want to use the "corner" function. What can I do?

Thanks.

Matt J
on 24 May 2014

Edited: Matt J
on 24 May 2014

If the quadrilateral is roughly aligned with the edges of the image, you could also find the corners as follows,

[I,J]=find(Image>max(Image(:))/2);

IJ=[I,J];

[~,idx]=min(IJ*[1 1; -1 -1; 1 -1; -1 1].');

corners=IJ(idx,:)

Matt J
on 25 Jun 2019

My rationale for the code is described here,

Matt J
on 22 Oct 2019

Here is a generalization of the approach to arbitrary convex quadrilaterals. No particular orientation is assumed.

N=360;

theta=linspace(0,360,N);

[I,J]=find(Image);

IJ=[I,J];

c=nan(size(theta));

for i=1:N

[~,c(i)]=max(IJ*[cosd(theta(i));sind(theta(i))]);

end

H=histcounts(c,1:numel(I)+1);

[~,k] = maxk(H,4);

corners=IJ(k,:)

Sign in to comment.

Image Analyst
on 23 May 2014

Edited: Image Analyst
on 23 May 2014

Why not try the corner() function in the Image Processing Toolbox. What do you have against using that?

Or else call bwboundaries() and go along the coordinates looking for kinks in the curve as shown by the FAQ: http://matlab.wikia.com/wiki/FAQ#How_do_I_find_.22kinks.22_in_a_curve.3F

Matt J
on 24 May 2014

Image Analyst
on 24 May 2014

If you need the exact corner, use (untested)

boundaries = bwboundaries(binaryImage);

x = boundaries{:,1};

y = boundaries{:,2};

and compare every x and y to see which is closest to the hough points

distances = sqrt((xh - x).^ 2 + (yh - y) .^ 2)

[minDistance, indexOfMin] = min(distances);

xc = x(indexOfMin);

yc = y(indexOfMin);

Do the above for each hough estimated point to find the point in the blob which is closest to the hough point (xh, yh).

Matt J
on 24 May 2014

You can be generous with the RhoResolution, given the large size of the quadrilateral. I get a pretty good fit to the edges with the following,

[H,T,R] = hough(E,'RhoResolution',4,'Theta',-90:.5:89);

Similar to what ImageAnalyst was saying, this initial line fit should allow you to segment the boundary points into 4 separate edges. You do this by finding the closest point to each initial line. You can then do a more refined line fit to each edge using each group of points (e.g., using polyfit).

Sign in to comment.

Image Analyst
on 24 May 2014

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/130851-how-to-find-rectangular-corners#comment_215718

⋮## Direct link to this comment

https://in.mathworks.com/matlabcentral/answers/130851-how-to-find-rectangular-corners#comment_215718

Sign in to comment.