4

我的问题显示在这里:problem statement。我有一个模板图像,我必须在相机图像中检测。在检测到我必须通过使用仿射变换来标准化摄像机图像之后。我的工作的目标是确定十字架。我尝试使用SURF功能进行图像标准化步骤,但模板图像非常规则,不适合SURF匹配。任何想法如何做到这一点?也许某种轮廓匹配?图像匹配,仿射变形

+0

您的程序允许多少手动输入,或根本没有输入? – MoarCodePlz

+0

没有手动输入允许,应该全部由计算机完成。 – Karl

+0

您是想从头开始编写整个系统还是使用现有库来为您完成工作? – MoarCodePlz

回答

5

所以我给了这个想法,然后意识到,你正在寻找一个整体票而不是该票的一个子集,并将其转换为常规矩形。这个问题(至少在理论上)不是那么困难,编写一些代码来自己做这件事相对来说是微不足道的。

到目前为止,这个最困难的部分将是初始角点检测。由于您只对整张票感兴趣,票上的所有内容都没有任何意义。所有你感兴趣的是四个角落。你可以从照片中看到,当一张票在另一张票上面时,角落并不明显。如果你的所有照片都是在非常黑暗的表面上放置的票据,那么这将再次变得微不足道,但想法是编写一个应用程序,希望能够处理甚至含糊不清的情况。这就是说我会建议采用以下方法:

1)使用图像过滤器来减轻图片的光照区域并使图片的黑暗区域变暗。

我忘记了这种过滤器的名称,但基本上你想在图像的较暗和较亮的区域之间有更多的对比。

2)锐化所有区域的一个给定的亮度以上,高斯模糊所有给定的黑暗

特征寻找算法一般依赖于“锐度”的图像在下面的区域中,以便能够检测角和边。通过锐化图像中所有较亮的区域(考虑到您的票据是白色的)并模糊了图像中所有较暗的区域,您将增加算法检测您所寻找的角落的机会。

3)使用功能检测,检测四角

在这里,事情会得到毛。如果你有一堆乐透彩票,你正在拍照,而且你希望能够在算法上找到一张并显示它,那么你正在谈论尖端的当前正在研究的材料。如果这是你想要做的,那么我建议读一些刘延熙的论文,最着名的是基于对称性的基于对称性的感知分组与城市场景的应用。您很可能必须从预先制作的故障单图片中创建模板,然后尝试将此模板的确切功能与相机图像中相同功能的扭曲网格相匹配。一旦你的比赛高于百分比门槛,那么你可以尝试找到它的四个角落。如果你找到他们成功,那么你可以继续下一步。

另一方面,如果您没有尝试做尖端的事情,那么您可以只做一些书中的功能检测。对于角点检测,我会推荐使用The Harris & Stephens/Plessey/Shi-Tomasi角点检测算法。这与Yanxi在她的许多论文中使用的算法相同,并且在拐角检测方面做得相当不错。我不确定滤镜是否需要图像的灰度,或者是否需要当前色彩比例,但是如果它使用Canny边缘检测滤镜,则在使用角点检测算法之前进行滤镜处理将是有利的。一旦你得到了检票的主要角落(希望),那么你将需要设计一些智能发现算法(基于你的照片的角度和内容)来“猜测”哪个角落实际上是你关心的四个角落。

同样值得注意的是,“Mean Shift Belief Propagation”可以帮助您确定检测算法后最重要的特征。基本上,您可以在给定框中获取多个特征点,对其所有坐标进行平均,然后将框放在所得坐标上。移动后如果盒子中有新点,则再次进行。你继续这样做直到你在盒子中心有一个兴趣点。这是对这个想法的简要描述,所以我建议你进一步研究它,因为我不知道平均细节。

4)使用双线性插值来确定您需要传输到最终图像的颜色。

重要的是要注意,你不想从你扭曲的图像中获取颜色。在图像上运行所有过滤器和检测算法的目的是找到您感兴趣的特征点。一旦拥有了这些坐标,就可以回到使用原始图像来拉取颜色。

如果你问这个问题,那么我假设你知道双线性插值的含义。您可以考虑失真票的顶部和底部边缘从0开始(左角)并结束于1(右侧角落)。你会认为左边和右边从0开始(顶角),结束于1(底角)。您可以将相同的逻辑应用于输出图像的尺寸。在输出图像中逐个像素地寻找需要检索颜色并使用双线性插值的插值坐标,您可以从输入图像中提取颜色。

就是这样! (大声笑)你要做的事情很相关,我希望你这样做的运气。根据我所知道的,创建一个完全适用于所有情况而无需用户输入的算法,几乎是不可能的。此外,你正在看乐透彩票的事实引发了这个项目的道德问题。但无论如何,希望这足以让你的大脑开始。这里有一些额外的链接:

Canny边缘检测:http://en.wikipedia.org/wiki/Edge_detection

角检测:http://en.wikipedia.org/wiki/Corner_detection

燕西刘的论文:http://www.cse.psu.edu/~yanxi/

均值漂移信仰传播:用于我告诉过你的文件

编辑

代码级分离

int threshold = 128; 
float percentChange = .5; 
int oldr, oldg, oldb, newr, newg, newb, grayscale; 

//Assuming that pixels is a 1D array of pixel objects that make up the image you're currently working with. Syntax is of Processing.org 

for (int i=0; i<pixels.length; i++) { 

    oldr = red(pixels[i]); 
    oldg = green(pixels[i]); 
    oldb = blue(pixels[i]); 

    grayscale = Math.floor((oldr + oldg + oldb)/3.0); 

    if (grayScale >= threshold) { //Brightness is above threshold, therefore increase brightness 
     newr = oldr + (255-oldr)*percentChange; 
     newg = oldg + (255-oldg)*percentChange; 
     newb = oldb + (255-oldb)*percentChange; 
    } else { //Brightness is below threshold, therefore increase darkness 
     newr = oldr - oldr*percentChange; 
     newg = oldg - oldg*percentChange; 
     newb = oldb - oldb*percentChange; 
    } 

    pixels[i] = color(newr,newg,newb); 

} 
+0

感谢您的提示!我查了一些过滤器为1),但没有找到某人..你能记住这些过滤器的名称? – Karl

+0

为过滤器添加代码。找不到它的名字(我认为它有点过于通用),但实现就在那里。你基本上通过像素循环,检查亮度(灰度),如果超过了阈值,你将每个颜色通道增加当前值和255之间的距离的百分比。如果低于这个值,则将该值减小一个% 0与当前值之间的距离。 – MoarCodePlz

0

基于特征的直接(基于像素)的方法可能会更好。

的图像对齐很好的教程,你可以在这里找到: http://research.microsoft.com/apps/pubs/default.aspx?id=70092

另一个想法是选择投资回报率。如果您知道图像上的正确区域由红色方块组成,您可以尝试将其从SURF检测中排除。此外,您可以检测“红色方形区域”的形状并将其用于变换估计。

+0

我已经尝试过使用投资回报率,但是如果在右侧区域没有任何东西,我就会遇到问题......但是你也许正确,如果我检测到正方形并且使用这些点,那么它可以工作......什么样的算法会你用来检测红色方块? – Karl

+0

首先,我会尝试一些简单的方法,找到长红线(例如通过霍夫变换)并检测它们的方向。选择两个最受欢迎的方向并打开正确的角度。第二个想法是使用诸如边缘模板匹配之类的东西:http://www.codeproject.com/KB/graphics/Edge_Based_template_match.aspx,并且在模板图像上使用长红线作为算法的模板。 – ton4eg

0

只要找到最大(厚和长)红线,并做仿射变形。