How to find "rectangular" corners?

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.

1 commentaire

Cedric
Cedric le 24 Mai 2014
If your rectangles are not too degenerate, you could get corners with four 2D convolutions using appropriate kernels.

Connectez-vous pour commenter.

 Réponse acceptée

Matt J
Matt J le 24 Mai 2014
Modifié(e) : Matt J le 24 Mai 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,:)

13 commentaires

Mor
Mor le 31 Mai 2014
Hi,
It works. Can you explain what this line: [~,idx]=min(IJ*[1 1; -1 -1; 1 -1; -1 1].');?
Matt J
Matt J le 31 Mai 2014
It finds where the sums and differences of the coordinates in the shape are maximized and minimized.
Bálint Udvardy
Bálint Udvardy le 23 Fév 2018
Hi, I have just found this thread. I have a similar problem now: I am working on a nonogram-solver and I want to remove the perspective from the image to get the picture of the puzzle, but after extracting the largest connected component from the image (the puzzle grid) and using convex hull of that component I get a pentagram. Unfortunately, all the corner detectors fail to detect the 5 corners. Using your method detects 4 corners, which itself is an improvement, but I need that 5th corner to calculate the theoretical "true" upper left corner, which i need to remove the perspective.
Matt J
Matt J le 23 Fév 2018
Why do you need the "upper left" corner? Why can't you use the 4 point correspondences that you already have to compute the perspective transform?
Bálint Udvardy
Bálint Udvardy le 26 Fév 2018
How? I only know that the right and the left vertical lines should be paralell to each other and have the same length in real, but on the photo it can be shorter or longer.
Matt J
Matt J le 26 Fév 2018
You know all the little boxes in the puzzle grid are the same size and therefore you know the world coordinates of all corners of those boxes with respect to that grid. That gives you lots of point-to-point correspondence information.
Syed Haider
Syed Haider le 18 Avr 2018
Dear Matt,
Thanks for the code. It did work really well on most of the images. But if I apply the same code to the image attached,
I get the wrong corners. I have attached the output image below. Any suggestions would be highly appreciated.
Thanks,
Irtaza
Matt J
Matt J le 18 Avr 2018
A quick fix would be to imrotate() the image, so the rectangle is better aligned with the edges of the image grid. Then find the corners of the rotated rectangle and then rotate back.
Image Analyst
Image Analyst le 18 Avr 2018
Compute the centroid, then the distances to the boundary points. Then use findpeaks() to find the vertices. I have a demo if you want - start your own brand new thread.
What is the idea behind the code ? Is it a standard kernel ?
[~,idx]=min(IJ*[1 1; -1 -1; 1 -1; -1 1].')
Balkrishna Patankar
Balkrishna Patankar le 25 Juin 2019
Thank you (y)
Matt J
Matt J le 22 Oct 2019
Modifié(e) : Matt J le 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,:)

Connectez-vous pour commenter.

Plus de réponses (4)

Matt J
Matt J le 6 Fév 2020

2 votes

Use pgonCorners from the File Exchange (Download). It applies to any convex polyhedron.
numVertices=4;
corners=pgonCorners(Image,numVertices)
Image Analyst
Image Analyst le 23 Mai 2014
Modifié(e) : Image Analyst le 23 Mai 2014

1 vote

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

1 commentaire

Mor
Mor le 24 Mai 2014
Hi,
Thanks for your answer. The reason I don't want to use the corner() function is because I have more pictures and in some of them the corner function doesn't work good (detects 2 corners is the same place) I think it's because the lines are not straight. maybe there is some configuration to make it work for every picture.

Connectez-vous pour commenter.

Matt J
Matt J le 24 Mai 2014

1 vote

Maybe use edge() followed by houghlines() with an appropriate FillGap selection? The endpoints of the line segments returned by houghlines would be the corners of the quadrilateral.

3 commentaires

Mor
Mor le 24 Mai 2014
Hi Matt,
Here is the result:
The top left and the bottom right are not exactly the corner, It's because it's not a straight lines.
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
Matt J le 24 Mai 2014
Modifié(e) : Matt J le 24 Mai 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).

Connectez-vous pour commenter.

Image Analyst
Image Analyst le 24 Mai 2014

0 votes

If the quad is roughly aligned with the edges of the image you could also get the distance from the 4 corners. For each corner, take the one point on the white boundary that has the minimum distance. No need to mess with hough in that case.

Catégories

Community Treasure Hunt

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

Start Hunting!

Translated by