项目是有关在线检测的,简单的说下:下图左边的图是提前拍摄的模板,右边的图是相机在暗箱(里面使用环形灯管照明)中在线拍摄的照片,相机通过传感器检测板子的位置进行拍照。然后根据模板比对,检测相机拍摄的板子上的东西有没有错装或者漏装。需要检测的部分也不是整个板子,只是板子中间分五列排列、总共有7种颜色的长条块(红、蓝、棕、黄、乳白、深绿、还有一种是上面没装东西,算作黑色)。
图一
事实上,差分程序关注的部分只有下图我用红色框框起来的部分,我也会在制作模板时就记录这个红色框的位置,在差分程序中使用ROI,只处理框中的内容,但是在下面的图中我把整个板子的差分图都发出来了,方便大家有个整体认识。
图二
我现在的做法是:首先对两张图检测特征点,用SURF对图片进行匹配。然后用仿射变换将待检测的图片映射到模板图的空间里实现板子对齐,然后对两张图片提取轮廓,将背景剪除。再用差影法做两张图片的差,通过差分图来确定板子上哪些位置颜色有变化。我取的差分图像HSV空间的H通道和YCrCb空间的Cr和Cb通道进行处理(之所以选这三条通道,是因为这三条通道看上去信噪比比较高,其他的很多通道噪声多得根本没办法提取出任何有效数据),滤掉噪声,就能得到颜色有变化的位置,从而确定错装和漏装的位置。软件用C++编写,还用了opencv
但是,我的方法并不能很好的实现我想要的功能,主要有以下几点:
第一,也是最重要的。颜色有差异的部分并没有显著的体现在差影图像上,尤其是一些相近的颜色,比如红色和棕色、蓝色和黑色、棕色和乳白色、绿色和黑色等组合,它们在差影图上的信号有时甚至比噪声还低,根本没办法有效提取
第二,基于SURF的匹配效果不太一致,虽然大多数的时候比配效果用肉眼看还可以,但有时会出现匹配失败,两块板子完全没有对齐的情况,这种情况大多发生在待匹配的板子与模板中板子夹角比较大的时候。
第三,就算匹配成功的板子,也会产生许多噪声。我感觉是因为光照不均匀以及匹配并没有让板子完全对齐,少许的差异让两张图的边界在差值后产生了噪声。这些噪声十分影响有效数据的提取。
下图是上面两张差分图的H通道图像
图三
下图是差分图Cr通道的图像,虽然Cr通道上噪声比较小,但是能识别出的有效数据也少
图四
下图是差分图Cb通道的图像
图五
下图是一同一块板子(板子上没有差异)经过两次拍摄(板子在图中的位置不同,后经过匹配对齐)的图像差分得出得出的图像,边缘产生的噪声实在太大,很难与有效噪声区别
图六
做到现在,我完全没办法提取出有效的信号,不是提取不全有效信号,就是弄得噪声太大,甚至在两个板子一模一样时也提取出很多信息。
我尝试过增大图像的饱和度、对比度、或者直方图均衡等一些处理后再去差分,效果也不是很好。感觉颜色的变化总是不比亮度变化和其他一些噪声更显著。
大家有什么方法和思路可以对项目有所帮助呢?请大家帮我一起想一想,真心的谢过大家了。
22 个解决方案
#1
个人建议
两次拍摄位置肯定会稍微有些偏差, 图像用差分方法肯定是不可以的
可以换个思路, 比如在这块区域划分为 40 个区块, 分别识别每个区块的颜色(过滤掉PCB版的颜色)
两次拍摄位置肯定会稍微有些偏差, 图像用差分方法肯定是不可以的
可以换个思路, 比如在这块区域划分为 40 个区块, 分别识别每个区块的颜色(过滤掉PCB版的颜色)
#2
真是个不错的思路!谢谢!请问针对这种真彩图该怎么识别色彩呢,比如一个区域中的像素大部分都是红色的或者蓝色的,但是各像素点的红色或蓝色也是有些差别的,该如何在不知道一个区域内有什么颜色的前提下,将一个区域内相近的颜色进行聚类,然后用最具代表性的颜色代表整个区域的颜色呢?期待您的回答~
#3
可以用通用的聚合算法 Kmeans
另外也可以自己想办法, 比如先去除底板绿色, 文字白色, 然后分析颜色分布取出主要特征颜色
也可以用定位的方法找到需要的矩形区,再获取颜色
你的情况有个比较不好区分的3个颜色: 黑, 灰, 白
这3个颜色在拍照的曝光程度不一致时可能会导致混绕, 建议 特征颜色 和底板颜色进行亮度比较
另外也可以自己想办法, 比如先去除底板绿色, 文字白色, 然后分析颜色分布取出主要特征颜色
也可以用定位的方法找到需要的矩形区,再获取颜色
你的情况有个比较不好区分的3个颜色: 黑, 灰, 白
这3个颜色在拍照的曝光程度不一致时可能会导致混绕, 建议 特征颜色 和底板颜色进行亮度比较
#4
我猜测就是先分割再匹配了,
,再细节就不懂了
#5
《学习OpenCV(中文版)》
腐蚀、膨胀、腐蚀膨胀、膨胀腐蚀
轮廓提取
……
腐蚀、膨胀、腐蚀膨胀、膨胀腐蚀
轮廓提取
……
#6
自适应肤色
……
……
#7
这个是我截取的一个色块的区域,有什么算法可以将文字白色和边缘的黑色去除掉,使整个区域都表现为特征颜色的红色呢?
#8
关键就是分割采用什么方法让人头疼
#9
这里要识别的有效颜色有七种之多,而且需要提取的都是一个区域里有代表性的一种特征颜色。比如黑色,在左边的区域里需要将其滤除,用特征色蓝色替代;右边的区域里黑色就是特征色,应该用其填充整个区域,这个应该怎么实现呢?
#10
#11
建议楼主先编译链接调试OpenCV自带的相关例子代码。
#12
可以用颜色直方图相关算法得到指定区域中哪种颜色最多。
#13
7种颜色建立模板,然后再做匹配,根据找到的7种颜色坐标,再做处理。如果楼主接触过halcon,就会很容易解决
#14
你这个分割算法我向一般的应该都可以的,分水岭,meanshift,关键就是得调整一下参数
或者OpenCV直接按照举行轮廓进行分割
或者OpenCV直接按照举行轮廓进行分割
#15
#16
进来学习下
#17
当作一个二维码? 把左边的2个红色大矩形和右边的3个黑色大矩形用来定位,
把33个需要检测的元件位置划分为33个矩形区域,逐个判断其颜色,
二维码只分黑白, 你的照片虽然有误差,但不至于红的变成绿的吧?还是有一个小的颜色区间,把矩形区域内的颜色和标准安装的颜色对比,只要在一个区间就算成了。
把33个需要检测的元件位置划分为33个矩形区域,逐个判断其颜色,
二维码只分黑白, 你的照片虽然有误差,但不至于红的变成绿的吧?还是有一个小的颜色区间,把矩形区域内的颜色和标准安装的颜色对比,只要在一个区间就算成了。
#18
先分割再匹配,网页上有相关的例子的,楼主需要仔细研究。
#19
我真的是来学习的
#20
顶一下。高大上
#21
顶一个......
#22
用opencv库试试。
#1
个人建议
两次拍摄位置肯定会稍微有些偏差, 图像用差分方法肯定是不可以的
可以换个思路, 比如在这块区域划分为 40 个区块, 分别识别每个区块的颜色(过滤掉PCB版的颜色)
两次拍摄位置肯定会稍微有些偏差, 图像用差分方法肯定是不可以的
可以换个思路, 比如在这块区域划分为 40 个区块, 分别识别每个区块的颜色(过滤掉PCB版的颜色)
#2
真是个不错的思路!谢谢!请问针对这种真彩图该怎么识别色彩呢,比如一个区域中的像素大部分都是红色的或者蓝色的,但是各像素点的红色或蓝色也是有些差别的,该如何在不知道一个区域内有什么颜色的前提下,将一个区域内相近的颜色进行聚类,然后用最具代表性的颜色代表整个区域的颜色呢?期待您的回答~
#3
可以用通用的聚合算法 Kmeans
另外也可以自己想办法, 比如先去除底板绿色, 文字白色, 然后分析颜色分布取出主要特征颜色
也可以用定位的方法找到需要的矩形区,再获取颜色
你的情况有个比较不好区分的3个颜色: 黑, 灰, 白
这3个颜色在拍照的曝光程度不一致时可能会导致混绕, 建议 特征颜色 和底板颜色进行亮度比较
另外也可以自己想办法, 比如先去除底板绿色, 文字白色, 然后分析颜色分布取出主要特征颜色
也可以用定位的方法找到需要的矩形区,再获取颜色
你的情况有个比较不好区分的3个颜色: 黑, 灰, 白
这3个颜色在拍照的曝光程度不一致时可能会导致混绕, 建议 特征颜色 和底板颜色进行亮度比较
#4
我猜测就是先分割再匹配了,
,再细节就不懂了
#5
《学习OpenCV(中文版)》
腐蚀、膨胀、腐蚀膨胀、膨胀腐蚀
轮廓提取
……
腐蚀、膨胀、腐蚀膨胀、膨胀腐蚀
轮廓提取
……
#6
自适应肤色
……
……
#7
这个是我截取的一个色块的区域,有什么算法可以将文字白色和边缘的黑色去除掉,使整个区域都表现为特征颜色的红色呢?
#8
关键就是分割采用什么方法让人头疼
#9
这里要识别的有效颜色有七种之多,而且需要提取的都是一个区域里有代表性的一种特征颜色。比如黑色,在左边的区域里需要将其滤除,用特征色蓝色替代;右边的区域里黑色就是特征色,应该用其填充整个区域,这个应该怎么实现呢?
#10
建议楼主先了解一下啥叫“膨胀”,啥叫“腐蚀“再说。
http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E8%86%A8%E8%83%80+%E8%85%90%E8%9A%80
http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E8%86%A8%E8%83%80+%E8%85%90%E8%9A%80
#11
建议楼主先编译链接调试OpenCV自带的相关例子代码。
#12
可以用颜色直方图相关算法得到指定区域中哪种颜色最多。
#13
7种颜色建立模板,然后再做匹配,根据找到的7种颜色坐标,再做处理。如果楼主接触过halcon,就会很容易解决
#14
你这个分割算法我向一般的应该都可以的,分水岭,meanshift,关键就是得调整一下参数
或者OpenCV直接按照举行轮廓进行分割
或者OpenCV直接按照举行轮廓进行分割
#15
#16
进来学习下
#17
当作一个二维码? 把左边的2个红色大矩形和右边的3个黑色大矩形用来定位,
把33个需要检测的元件位置划分为33个矩形区域,逐个判断其颜色,
二维码只分黑白, 你的照片虽然有误差,但不至于红的变成绿的吧?还是有一个小的颜色区间,把矩形区域内的颜色和标准安装的颜色对比,只要在一个区间就算成了。
把33个需要检测的元件位置划分为33个矩形区域,逐个判断其颜色,
二维码只分黑白, 你的照片虽然有误差,但不至于红的变成绿的吧?还是有一个小的颜色区间,把矩形区域内的颜色和标准安装的颜色对比,只要在一个区间就算成了。
#18
先分割再匹配,网页上有相关的例子的,楼主需要仔细研究。
#19
我真的是来学习的
#20
顶一下。高大上
#21
顶一个......
#22
用opencv库试试。