Başka bir yaklaşım, köşeleri kenarlarınızdan mesafelerine göre sıralamak için bwdistgeodesic
'u kullanmaktır. Bu, sürekli bir kenar tespit edebileceğiniz herhangi bir çokgen için çalışmalıdır.
Biz yığın taşması gelen görüntüde yükleme başlamak ve siyah-beyaz görüntüye dönüştürerek daha kolay kenara bulmasını sağlamak bwmorph
fonksiyon siyah işlemek için birçok seçenek sunar
A = imread('http://i.stack.imgur.com/dpbpP.jpg');
A_bw = im2bw(A,100/255); %binary image
A_bw1 = imcomplement(A_bw); %inverted binary image
ve beyaz görüntüler. Çokgenimizin kenarını bulmak için
remove
seçeneğini kullanacağız, ancak isterseniz başka bir kenar detektörü de kullanabilirsiniz.güzel bir açık sürekli kenar var,
%Find the edges
A_edges = bwmorph(A_bw, 'remove');
[edge_x, edge_y] = find(A_edges');
en kenarları görselleştirmek edelim biz Tamam
figure; imshow(A_edges);
algılandı. Şimdi köşeleri bulalım.
A_corners = corner(A_bw1, 'QualityLevel',.3);
en
figure; imshow(A_bw1);
hold on
plot(A_corners(:,1), A_corners(:,2), 'r.', 'MarkerSize', 18)
text(A_corners(:,1), A_corners(:,2), strsplit(num2str(1:length(A_corners))), 'Color', 'g', 'FontSize', 24);
hold off
fark olmayabilir başka şey sipariş eden ilk köşe görselleştirmek edelim ben corner
kullanır, ancak favori köşe dedektör yerine olabilir, bunlar doğrudan doğruya olmaması kenarlarda. Her köşe noktasına kenar boyunca en yakın noktayı bularak başlayacağım ve sonra köşeleri kırmızı ve en yakın kenar noktalarını yeşil olarak görselleştireceğim. Her köşe için kenar etrafında mesafeyi hesaplamak için
[~, ind] = min(pdist2(A_corners, [edge_x, edge_y]), [], 2);
A_edge_corners = [edge_x(ind), edge_y(ind)];
figure; imshow(A_edges);
hold on;
plot(A_corners(:,1), A_corners(:,2), 'r.', 'MarkerSize', 18)
plot(A_edge_corners(:,1), A_edge_corners(:,2),'g.', 'MarkerSize', 18)
hold off;
, biz köşe noktasının kendisi A_corners
(kırmızı nokta yerine kenarında köşe noktası yaklaşım, A_edge_corners
(yeşil nokta) kullanacağız).
Şimdi bwdistgeodesic
'u kullanmamız için gereken tüm parçalara sahibiz. Bu işlev, siyah beyaz bir görüntüdeki sıfır olmayan piksellerin her biri için bir tohum noktasına olan mesafeyi bulur. İlk köşeden, her noktaya kadar olan mesafeyle ilgileniyoruz. Hadi deneyelim.
% Calculate distance from seed corner
first_corner = A_edge_corners(1,:);
D = bwdistgeodesic(A_edges, first_corner(1), first_corner(2));
figure; imagesc(D);
Biz doğru en köşeden başlıyoruz ve piksel uzağa değerindeki köşe artışından hareketli. Ama bu bizim istediğimiz şey değil. Köşeleri bu değerleri kullanarak sipariş edersek, başlangıç noktasından uzakta bir sipariş veririz.
[~, corner_order] = sort(D(sub2ind(size(D), A_edge_corners(:,2), A_edge_corners(:,1))));
A_corners_reorder1 = A_corners(corner_order, :);
figure; imshow(A_bw1);
hold on
plot(A_corners_reorder1(:,1), A_corners_reorder1(:,2),'r.', 'MarkerSize', 18)
text(A_corners_reorder1(:,1), A_corners_reorder1(:,2), strsplit(num2str(1:length(A_corners))), 'Color', 'g', 'FontSize', 24);
hold off
Bu sorunu çözmek için, sadece sipariş yalnızca ilk noktadan tek yönde ilerler, böylece kenar kırmak zorunda. Saat yönünde veya saat yönünün tersine bir sıralamayla ilgileniyorsanız, kenarın yönüne bağlı olarak bir takım kurallara göre kenarı kırmanız gerekir. Yön önemli değilse, ilk köşeye bitişik bir piksel bulabilir ve oradaki kenarı kırabilirsiniz.
%Break the edge into one path by removing a pixel adjacent to first corner
%If the corner is near the edge of the image, you would need to check for
%edge conditions
window = A_edges(first_corner(2)-1:first_corner(2)+1, first_corner(1)-1:first_corner(1)+1);
window(2,2) = 0; %Exclude the corner itself
[x, y] = find(window, 1);
A_edges(first_corner(2)+x-2, first_corner(1)+y-2) = 0;
figure; imshow(A_edges);
hold on;
plot(first_corner(1), first_corner(2), 'r.', 'MarkerSize', 18)
hold off;
Şimdi kenar boyunca ilk noktadan itibaren mesafe, sadece Bu bize kenarlarının istenen sipariş verir bir yol
%Find order the pixels along edge
D = bwdistgeodesic(A_edges, first_corner(1), first_corner(2));
figure; imagesc(D);
takip edebilir
[~, corner_order] = sort(D(sub2ind(size(D), A_edge_corners(:,2), A_edge_corners(:,1))));
A_corners = A_corners(corner_order, :);
figure; imshow(A_bw1);
hold on
plot(A_corners(:,1), A_corners(:,2),'r.', 'MarkerSize', 18)
text(A_corners(:,1), A_corners(:,2), strsplit(num2str(1:length(A_corners))), 'Color', 'g', 'FontSize', 24);
hold off
Bu yöntem, aynı zamanda, ikinci bir demo görüntü olarak ağırlık merkezi ile ilgili olarak, dengesiz çokgenler çalışır.
eğlence için, dengesiz bir çokgen daha net bir örnek olarak, ağırlık merkezi karşı tarafında bir köşe sahip üçüncü bir görüntü sunar. Benim yöntemim de bu resmi doğru şekilde ayrıştırıyor.
http://stackoverflow.com/questions/29123125/detect-correct-number-of-corner-coordinates-from-a-polygon-image-in (bu [SI soru] Bkz -matlab? rQ = 1). – Maurits
Sorun, köşeleri algılamıyor, saat yönünde/saat yönünün tersine sırayla elde ediliyor. –
Siparişi manuel olarak elde edecekseniz, bu sipariş ne olurdu? Ne bekliyorsun? Beklenen çıktınızı tanımlamadınız. Bence, daha fazla tanımlayarak sorununun geliştirilebileceğini düşünüyorum. – kkuilla