一.原理:
计算图像的能量图,能量图一般是图像像素的梯度模值,为了简化计算可先转换成灰度图像,然后直接采用如下公式(直接用x、y方向上的差分取绝对值,然后相加),其实这一步就是相当于边缘检测算法一样:
通过能量图寻找最小能量线。最小能量线指的是需要被移除的那一列:首先需要以图像第一行或最后一行为开始行进行迭代。下面实现的为从图像最后一行开始,往上迭代。
找出最后一行需要被移除的像素点后,设其坐标为P(x,y),然后往上一行寻找,寻找的点为P点的在y-1行中的三个相邻像素点中的能量最小值像素。也就是寻找的坐标为(x-1,y-1)、(x,y-1)、(x+1,y-1);
最后移除得到的最小能量线,让图片的宽度缩小一个像素。移除的时候 为了让图像看起来自然,需要在移除缝线的地方进行平均,假设移除坐标为P(x,y),那么移除后P(x-1,y)的像素值为P(x-1,y)与P(x,y)的像素值的平均。P(x+1,y)的像素值为P(x-1,y)与P(x,y)的像素值的平均,然后才能把P(x+1,y)移动到P(x,y)的位置。
对于图像的放大算法原理一样,先找到最小能量线,设能量线上点的坐标为P(x,y),则在P(x,y)、P(x+1,y)中心位置插入新的像素,像素值为P(x,y)与P(x+1,y)的平均。
二.实现
1.打开matlab载入程序后,执行UI界面,出现如图所示交互框: 2. 点击open image选择待处理图片 3点击下方Display image中的下拉框,展示图片能量图。能量是通过计算图像像素的梯度模值得到的。通常会转换为梯度图进行计算,缩短运行时间。 4.展示图片梯度图。梯度图反应了相邻像素之间值的突变程度,表现出了边缘信息。通常这些信息对于描述内容十分重要。算法删除时会考虑梯度信息。 5.通过能量图计算出能量最小的缝,如图所示。能量最小的缝是梯度的模值,从下到上,考虑某点处下一层相邻三像素的最小能量点,并以此点为基点,循环找到一条完整的最小能量缝。 6..删除该缝隙后结果如图,(删除为一条缝,差别不够明显),在灰度图上操作,然后将灰度图转为RGB图 7.在水平和垂直方向都执行seam carving 算法,删除较多的缝之后,缩放效果明显结果和原图对比如下 |
三.实验数据及结果分析:
从下图中的实验结果可以看出,使用缝刻算法进行图像缩放时,能够不改变图像的主体内容,虽然图像中内容主体间的相对位置会发生一些变化,但这并不影响图片的观感。
四.实验结论:
通过seam carving算法对图像进行缩放,能够最大程度保留图片主要内容,从而不影响观感。该算法和传统的对图像直接进行缩放不同,此算法是基于图像内容,对图片中不重要的内容(梯度)进行删减,从而达到图片缩放的目的。
但是,另一方面,由于算法仅仅考虑梯度,在某些情况下,缩放的效果并不好,如下
五.总结
Seam carving 能够有效对图像进行缩放,但是具有一些缺点,如上,另外在缩放比例较大时,该算法处理时间大幅度增加,效率变低。梯度关注目标相邻像素突变的区域。梯度无论是在深度学习中还是在图像处理中具有重要的作用,灵活运用能够得到意想不到的结果。下图为图像的能量图,此图中的月亮能量和下方的山峰相比,明显较低,从这一方面,也可以看出泊松算法在图像融合中梯度的考量。
算法中的缝的求解结果是一条连贯的折线,这些折线是在某邻域中(三个像素)能量相对较低的点构成的,但是未考虑到该行或者列能量的最值。但是如果仅仅计算能力最值,又会导致图像的断层,如何将该行/列最值与邻域中相对能量较低点综合考虑,想必能够进一步改善缝刻的效果