MatLab:二进制图像的角点检测

5

我正在尝试找到在MatLab中查找此二进制图像上的角点的方法。

Binary Image

我一直在尝试找到一种方法,将三角形放置在这张图片上,并找到其顶点。我已经尝试过查找角落,但是返回的值并不总是正确的。
有没有办法可以锐化边缘,以便角落函数可以返回更好的结果?
非常感谢您的任何帮助!谢谢!

enter image description here

什么策略似乎更简单和更有效?我可以使用哪些现有的MatLab函数?

1
你想检测多少/哪些个角落?能否添加一个标出角落的图片? - Benoit_11
应该有3个角落,我已经在原问题中添加了一个附件。 - user3315340
有人知道我如何检测三个角落的方法吗?我一直在研究houghline,但我不太确定如何正确使用它。 - user3315340
你一直在寻找角落吗?请解释一下。 - user1196549
我正在使用MatLab中的“corner”函数来获取最佳的三个角落。 - user3315340
2个回答

3

不要采用图像处理方法,我们尝试一种更代数的方法。

您有白色像素-二维平面上的点,并且希望找到三个最好地将这些点与平面其余部分分离的半平面(直线)。

因此,让我们开始吧。

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);

现在,一条直线可以用两个参数来描述,所有满足 L(1)*x + L(2)*y = 1 的点 (x, y) 都在该直线上。为了找到一条直线,使得所有点都位于它的一侧,这个不等式必须对集合中的所有点 (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');

enter image description here


代码在一些图片上运行得很好,但是如果我给它像这样的某些图片,它似乎会遇到一些问题:http://imgur.com/qqg3cKS 有没有办法修复这个问题? - user3315340
@user3315340 在 quadprog 中玩弄一下 f 项(第二个参数)会得到不同的解决方案,对于你发送的图像,L3 = quadprog(eye(2), [-1; 1], mA, ones(n,1)); 可以得到所需的解决方案。 - Shai
@user1714410 为什么L1目标函数是L(1)^2 + L(2)^2 - L(1) - L(2)?这是指从“平均点”到直线的距离吗? - Chen Yu
1
我现在明白了,不需要回复。 - Chen Yu

1
你可以找到最小的外接三角形面积。
首先计算blob的凸包。
然后尝试所有凸包三条边的不同选择,通过计算成对相交来延伸边,并保留具有最小正面积的三角形。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接