我试图找到一种方法在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.我们可以强制这些不等式并搜索最紧的半平面L使用quadprog
实现此约束:
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');