我们在用计算机对图像进行处理时,计算机保存的图像都是一个一个的像素点,所以又称为数字图像。而这一过程由图像的取样与量化来完成,所以我们先来了解一下什么是取样和量化
取样和量化
取样
取样就是要用多少点来描述一幅图像,取样结果质量的高低就是用图像的分辨率来衡量的,一般我们说图像的像素是M*N的,这就是取样
量化
量化是指要使用多大范围的数值来表示图像采样之后的一个点,比如我们常见的用0-255来表示一个点色调或者采用0-1来表示一个点的色调
总的来说就是数字化坐标值称为取样,数字化幅度值称为量化
上采样和下采样
上采样(upsampling)就是放大图像(或称为图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上
下采样(subsampled)就是缩小图像(或称为降采样(downsampled))的主要目的 有两个:
1、使得图像符合显示区域的大小;
2、生成对应图像的缩略图
这里说明一下,这里说的放大和缩小图像是放大或缩小原图像,或者说就是增加或者减少图像的像素点,不是我们日常见得那种点击放大图片的操作哈
采样方法
上采样:
上采样原理几乎都是通过内插值的方法,就是在原来图像基础上在像素点点之间插入合适的新的像素点。
下采样:
下采样原理就是如果一幅图像尺寸为MxN,对其进行s倍下采样(即图像缩小s倍),即得到(M/s)x(N/s)尺寸的得分辨率图像,当然s应该是M和N的公约数才行,如果考虑的是矩阵形式的图像,就是把原始图像s*s窗口内的图像变成一个像素,也就是每间隔几个像素点取一次。
我们常见的马赛克效果,专业的处理就是用下采样的方式实现的,而非是用方格图片覆盖在原图片上
常用的插值方法
无论是上采样还是下采样,采样的方式都几乎是以插值的方法实现的,我就先分享几个最基础的吧
最邻近插值 (The nearest interpolation)
最近邻插值我们也说零阶插值,最邻近插值算法简而言之就是令变换后像素的灰度值等于距它最近的输入像素的灰度值,这个是最简单的插值方法。
设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰 度的值 f(i+u, j+v) 如下图所示:
如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。
我们先说一下u,v的值怎么确定的吧,我举个例子,假如现在我有4*4的图像 img_src,每个点灰度值如下图所示:
现在我要把他变成5*5的图像 img_dst,那么图像的高度和宽度的放大比例都是4:5
我们的是要在原图像中判断放大后的图像像素点应该离哪个坐标更接近,所以要将放大后的图像坐标映射到原图像里面。我们假设对应到原图像的坐标为 (x,y),这里的坐标可能会是小数,所以后面我们需要再做一个四舍五入的计算。这里就拿第一行的坐标进行计算:
( x 0 , y 0 ) = i m g d s t ( 0 , 0 ) 5 / 4 = ( 0 , 0 ) (x_0,y_0)=\frac{ img_{dst}(0,0)}{5/4}=(0,0) (x0,y0)=5/4imgdst(0,0)=(0,0)
( x 1 , y 0 ) = i m g d s t ( 1 , 0 ) 5 / 4 = ( 0.8 , 0 ) (x_1,y_0)=\frac{ img_{dst}(1,0)}{5/4}=(0.8,0) (x1,y0)=5/4imgdst(1,0)=(0.8,0)
( x 2 , y 0 ) = i m g d s t ( 2 , 0 ) 5 / 4 = ( 1.6 , 0 ) (x_2,y_0)=\frac{ img_{dst}(2,0)}{5/4}=(1.6,0) (x2,y0)=5/4imgdst(2,0)=(1.6,0)
( x 3 , y 0 ) = i m g d s t ( 3 , 0 ) 5 / 4 = ( 2.4 , 0 ) (x_3,y_0)=\frac{ img_{dst}(3,0)}{5/4}=(2.4,0) (x3,y0)=5/4imgdst(3,0)=(2.4,0)
( x 4 , y 0 ) = i m g d s t ( 4 , 0 ) 5 / 4 = ( 3.2 , 0 ) (x_4,y_0)=\frac{ img_{dst}(4,0)}{5/4}=(3.2,0) (x4,y0)=5/4imgdst(4,0)=(3.2,0)
好了,看到这里,相信都已经明白上面所说的u和v的值怎么来的吧
进行四舍五入后,第一行的坐标就变为:
(0,0),(1,0),(2,0),(2,0),(3,0)
然后我们再把原图像的对应坐标的像素点的色调值赋值给放大后的图像,那么放大后的图像的第一行像素点如下图所示:
原理搞明白了我们来看看代码是怎么实现的,还是先拿我女神照片吧
我们先用opencv看看原图的大小吧