专业讲解及优化方法,点击:https://blog.csdn.net/ggqhit/article/details/84302382
图像的缩放,对于大家来说一定是个非常熟悉的过程了:最简单直接的,就是双手按住触屏手机,手指外滑/内滑,就可以实现了。对于设计方向的小伙伴,通过PS,绘图,或者任何一中编程语言,都有非常方便的方法可以实现。
那现在不妨想一想,这简单效果背后,是怎样的算法思想呢?今天,将以一种非常简单、直接的方式,为大家描述图像缩放算法的基本思想。
我们首先需要大概理解一下图像的概念:有一种图形格式(位图),是利用像素点的方式,表述该点的颜色,看下面的图。4行,七列(阿拉伯数字表示行,汉语数字表示列),一共28位小朋友排成的队伍,每个小朋友有不同的颜色。这样的一个简单的排列,就是我们常见的4px*7px的图片啦,一共是28个像素点,如果小朋友个数,即像素点个数,足够多的话,就可以形成各种有意思的图片了。
pic1. 小朋友像素阵列!
理解了位图图片的基本概念之后,现在开始讨论缩放的问题。为了使问题简化,我们考虑更简单的情况:只有1行小朋友的时候,如下图所示:
pic2. 单行像素阵列!
我们知道,每个小朋友都是有“宽度”的,即其所占空间的大小,记为d1(可记为d1=1),则七位小朋友占总的空间大小:D1=7*d1=7。
图像缩放,即在占据相同空间(D1=D2=7)的情况下,用5个(随便举的例子)小朋友实现排列,那么每个小朋友所占的空间大小就发生了变化:d2=D2/5=1.4。这样看来,每个小朋友都应该变胖了一些才对,请看下图:
pic3. 单行缩放!
这样的效果,即把图像缩小成原来图像的5/7,只用5个像素点来表示之前7个点需要表示的数据。
理解这些之后,需要面临一个非常关键的问题了:下面的五位小朋友,应该怎样对它们进行颜色的选取呢?从上图我们可以发现,上下两列队伍已经对齐,下面这一列的每个小朋友,在横向上,都处在上面这一列两个小朋友之间,为了更加明确地表述,见下图:
pic4. 最临近关系?
则,下面的小朋友的颜色,应该是上面左右两个小朋友之间进行选择!
算法一:最邻近插值!
顾名思义,和哪个小朋友更接近,就选择哪一个!即上图所示内容。可以看到,我们丢失了部分信息,但是整体的颜色,和原图像是基本相同的!
算法二:双线性内插值!
这个名称有点不好理解。我们暂且忽略其称呼,简单理解起来,即综合考虑左右两边的情况,按距离的远近进行综合取舍。具体情况见下图所示:
pic5. 左右逢源的选择!
这样看来,所得到的新图形的颜色,和之前的图形之间,是不是还原度更高呢?并且连算法一中丢失掉的绿色,也部分地保留了下来。
这样得到的图形,也会更加地平滑。
这样,大家应该都明白算法的核心内容了吧?至于怎样用代码实现,以及选择什么语言更加方便,就见仁见智了!
来源:https://blog.csdn.net/weixin_40769843/article/details/100540262