简体   繁体   中英

Corner points from an image to redraw the outline it in Matlab or Python

I have one image. I want to get the coordinates in order so that the image can be redrawn. The image may be complex. I want to get sampled corner coordinates to redraw the outline of the image.

Attempt 1: corner function

I tried to detect the corner using corner() in matlab but it is not giving exact point. The corners are lying outside. The original image is attached below.

ASD

My code for corner detection is:

It=rgb2gray(I);
Itt=im2bw(It);
Itt1=corner(Itt);
imshow(Itt);
hold on
plot(Itt1(:,1), Itt2(:,2), 'r*');

The output of corner detection is attached below:

Problem with corner : If you zoom the image, you will find that the some corners don't lie on boundaries. So, please suggest some efficient and good working method.

Attempt 2: bwtraceboundaries

I also tried using bwtraceboundaries and corners to order the corner in terms of bwtraceboundaries output but the corner is not being exactly detected.

Question: Can you please suggest how can I detect the corner or is there any other method to extract the sampled corner points from the image so that the outline can be redrawn?

You can use bwboundaries to achieve what you want. It returns all the sorted boundary positions as a cell array:

B = bwboundaries(Itt);
imshow(Itt);
hold on
B = B{2}; % select the desired boundary (the second in this case)
plot(B(:,2), B(:,1), 'b-'); % draw a connected line

在此输入图像描述

If you want to obtain only the corner points, you can filter them out manually by checking if the point lies in the middle of the next and previous point as follows:

iBremove = []; % redundant indexes in B
for k=2:length(B)-1 % loop over all the points, except the first and last one
  Bk = (B(k-1, :) + B(k+1, :))/2; % interpolate the previous and next point
  if all(Bk == B(k, :)) % check if point k is redundant
    iBremove = [iBremove k]; % add to the list of indexes to remove
  end
end
B(iBremove, :) = []; % remove the redundant points out of B

plot(B(:,2), B(:,1), 'r*-'); % draw a connected line

在此输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM