最近要进行数据预处理,所以要将读取的图片进行缩放才能使用,所以就来学一学图像的缩放。
图像的缩放主要包括两种,一种是全比例缩放,即把图像x,y方向都进行等比例缩放,另外一种是非全比例缩放。
比例缩放矩阵:
其代数式:
两种缩小变换方法:
基于等间隔采样的图像缩小方法。
基于局部均值的图像缩小方法。
等间隔采样方法顾名思义,就是每隔固定的距离进行采样,这样就选择一些点,舍弃一些点,最后就能得到最终结果,使其效果和原来差不多。若比例因子为m和n,原图的矩阵为 f[M×N],缩小后的矩阵为 g [(M*m)×(N*n)],由于原图像素点多,映射到g后会出现多点对一点的现象所以我们从g映射到f,则有g(i,j) = f(i/m,j/n)
代码:
import cvdef Reduce(image,m,n):H = int(image.height*m)W = int(image.width*n)size = (W,H)iReduce = cv.CreateImage(size,image.depth,image.nChannels) #创建一个新图样for i in range(H):for j in range(W):x = int(i/m) #分别对x,y进行缩放y = int(j/n)iReduce[i,j] = image[x,y]return iReduce
实验效果
第二种缩放方法是基于局部均值的图像缩放方法
前面一种方法舍弃了很多点的信息,而局部均值法可以解决这个问题,我们说过f到g是一个多对一的映射前面的方法,我们简单的选取了其中的一个来映射到g,而这里,我们将找出所有映射到g(i,j)上的点,然后对他们的值取均值,好啦,具体思路如下:
此时g(i,j)不只是简单映射到f(i/m,j/n)了,而是可以映射到如下矩阵:
import cvdef JReduce(image,m,n):H = int(image.height*m)W = int(image.width*n)size = (W,H)iJReduce = cv.CreateImage(size,image.depth,image.nChannels)for i in range(H):for j in range(W):x1 = int(i/m)x2 = int((i+1)/m)y1 = int(j/n)y2 = int((j+1)/n)sum = [0,0,0]for k in range(x1,x2):for l in range(y1,y2):sum[0] = sum[0]+image[k,l][0]sum[1] = sum[1]+image[k,l][1]sum[2] = sum[2]+image[k,l][2]num = (x2-x1)*(y2-y1)iJReduce[i,j] = (sum[0]/num,sum[1]/num,sum[2]/num)return iJReducec
评论