这学期有两门课程与图像处理有关,一门是图像处理与内容分析(数字图像处理+机器学习),另一门SLAM课程,SLAM的全称为Simutaneously Localization and Mapping,具体来说就是即使获取图像,处理图像并进行路径规划与场景建模,下面是第一次作业的小结
作业1:实现SSD算法:
SSD算法的思路很简单,假设要找的模块为target, 找的对象是img, 那就不断从img里面截取target大小的子图像,然后计算两个模块每个像素灰度值的差的取绝对值,再平方求和得到误差,误差最小的子图就是匹配得出的对象了 ,想法简单很简单,匹配下面这个玩意儿:
![7e04c7e81df67a427aee52fc3a9974f7.png](https://i-blog.csdnimg.cn/blog_migrate/68399f72fd12064a42902d01625aab3e.jpeg)
但是一看结果。。
![80c46f9a4e50a26d1c96410da721e8d5.png](https://i-blog.csdnimg.cn/blog_migrate/95b54e6761d2b16729ab53f3957b4676.jpeg)
这么简单的算法也能出错???
然后一番摸索,甚至从原图中抠图再匹配误差仍然大得惊人,输出一看,咋这么多255?
然后一番思索,发现:
![bf11cc94ff3d1e66d8c774a049e09cf3.png](https://i-blog.csdnimg.cn/blog_migrate/7817533a2eb0fcfac3647e3b91b4c0b1.png)
原来,图像每个像素灰度值被表示成了np.int8,两个numpy数组在计算差的时候,负数还会补码,吓得赶紧展开成一维的图像进行处理:
![f4ecfe6c4e25dd7c7717101c548ab95c.png](https://i-blog.csdnimg.cn/blog_migrate/972b483c0201469104f82498a4efd6e8.png)
后来发现,在很多代码中都采用了展开成一维,再用.dot()运算,运算速度也快了起来,匹配成功
作业2:实现ZNCC算法:
ZNCC,在这篇文章中有详细的写公式Zero Mean Normalized Cross-Correlation,意为零均值归一化交叉熵,零均值肯定要每项减去均值,归一化意味着要除以标准差,交叉熵体现在两个图片'向量'的点乘上,如果说SSD关注的是像素上的相似性,那么ZNCC关注的,更多是结构上的相似性。
![f05dfb07e5a28636b377f400123c300d.png](https://i-blog.csdnimg.cn/blog_migrate/8399ed9ba99c1b26452ff71ea1fb3b1a.png)
为了证明上述猜测,可以对原图进行Histogram Specification,即直方图特例化,向检测目标进行转换,图为转化前,参考图,以及转化后图
![3af3c6ba97f96f8b72aa9f790fa76a43.png](https://i-blog.csdnimg.cn/blog_migrate/3fe31117c9b5a5131624db584bebf071.png)
特例化后,SSD算法明显变好
ZNCC算法评价指标可有下式子计算:
![51bb344f9fda7e3d0adfdd8d1e02413e.png](https://i-blog.csdnimg.cn/blog_migrate/5a28fcc0109c81f19a7b66492b470fa6.png)