簡體   English   中英

MatLab:二值圖像的角點檢測

[英]MatLab: Corner Detection on Binary Image

我試圖找到一種方法在MatLab中找到這個二進制圖像上的角點

二進制圖像

我一直試圖找到一種方法在這個圖像上擬合一個三角形並找到頂點。 我試過找到角落,但它返回的值並不總是正確的。
有什么方法可以銳化邊緣,以便角落功能可以返回更好的結果?

我感謝任何輸入! 謝謝!

在此輸入圖像描述

什么策略看起來更簡單,更有效? 我可以使用哪些現有的MatLab功能?

而不是圖像處理方法,讓我們嘗試更多的代數方法。

您有白色像素 - 平面上的2D點,並且您希望找到三個半平面(直線),這些半平面最好將這些點與平面的其余部分分開。

那么,讓我們開始吧

img=imread('http://i.stack.imgur.com/DL2Cq.png'); %// read the image
bw = img(:,:,1) > 128;  %// convert to binary mask
[y x] = find(bw);  %// get the x-y coordinates of white pixels
n=numel(x);  %// how many do we have

為了穩定性,我們減去所有點的平均值 - 以原點周圍的白色像素為中心:

mm = mean([x y],1); 
mA = bsxfun(@minus, [x y], mm);

現在,可以通過兩個參數來描述線,所有點(x, y)滿足L(1)*x + L(2)*y = 1 為了找到一條線,所有點都嚴格地在它的一邊,這個不等式必須適用於集合的所有點(x,y)L(1)*x + L(2)*y <= 1 我們可以強制這些不等式並使用quadprog搜索滿足此約束的最緊的半平面L

L1 = quadprog(eye(2), -ones(2,1), mA, ones(n,1));
L2 = quadprog(eye(2), ones(2,1), mA, ones(n,1));
L3 = quadprog(eye(2), [1; -1], mA, ones(n,1));  

注意如何通過改變二次優化目標f ,我們能夠獲得分離白色像素的不同半平面。

一旦我們有三條線,我們就可以得到交點(將它們從原點移回mm ):

x12=inv([L1';L2'])*ones(2,1)+mm';
x23=inv([L3';L2'])*ones(2,1)+mm';
x13=inv([L3';L1'])*ones(2,1)+mm';

您可以使用查看結果

imshow(bw,'border','tight'); 
hold all; 
%// plot the lines
ezplot(gca, @(x,y) L1(1)*(x-mm(1))+L1(2)*(y-mm(2))-1, [1 340 1 352]);
ezplot(gca, @(x,y) L2(1)*(x-mm(1))+L2(2)*(y-mm(2))-1, [1 340 1 352]);
ezplot(gca, @(x,y) L3(1)*(x-mm(1))+L3(2)*(y-mm(2))-1, [1 340 1 352]);
%// plot the intersection points
scatter([x12(1) x23(1) x13(1)],[x12(2) x23(2) x13(2)],50,'+r');

在此輸入圖像描述

您可以找到最小區域外接三角形。

首先計算斑點的凸包。

然后嘗試船體三邊的所有不同選擇,通過計算成對交叉點來延伸邊,並保持三角形具有最小的正面積。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM