一、通过调用api实现尺寸的改变
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None) 图像尺寸改变
scr:原图片;dsize:输出图像尺寸;fx:沿水平轴的比例因子;fy:沿垂直轴的比例因子;interpolation:插值方法,包括:
cv2. INTER_LINEAR,双线性插值(缺省);
cv2.INTER_NEAREST,最近邻域插值;
cv2. INTER_CUBIC,4x4像素邻域的双三次插值;
cv2. INTER_LANCZOS4,8x8像素邻域的Lanczos插值;
cv2. INTER_AREA, 像素关系重采样
二、最近邻域插值法
1.确定图像缩放比例,将原图像像素位置乘以缩放比例得到新图像像位置,如果出现小数,取最近邻的像素位置(四舍五入)
2.numpy是科学计算中的常用库,对于矩阵运算等十分方便
3.np.zeros(shape, dtype=float, order='C') 生成全零数组
Shape,数组尺寸,在此程序中设置为图像的高、宽、通道三维数组
Dtype,数组元素类型,此代码中这设置为无符号8位整数
Order,c代表与c语言类似,行优先;F代表列优先
三、双线性插值法
1.给定任意一点,以及周围已知四点(默认给定点不在已知图像矩阵中)
2.通过两次插值,通过周围四点的值插值出给定点的值
3.第一次插值,确定A1、A2点的值,根据左上、左下点求出A1,根据两点距离A1点的距离以及值进行按距离加权
P(A1) = D(A1~左上)*P(左上) + D(A1~左下)*P(左下)
同理得出A2的插值
P(A2) = D(A2~右上)*P(右上) + D(A2~右下)*P(右下)
4.第二次插值,对A1、A2进行插值得出指定点的插值
P(点) = D(A1~点)*P(A1) + D(A2~点)*P(A2)
四、代码实现
1.api
# API 实现图像尺寸改变
import cv2
img = cv2.imread('image01.jpg',1)
imgHeight,imgWidth,imgMode = img.shape
# 图像长、宽、通道数值获取
# 压缩比设置
coe1 = 0.5
coe2 = 2
dst1Height = int(imgHeight*coe1)
dst1Width = int(imgWidth*coe1)
dst2Height = int(imgHeight*coe2)
dst2Width = int(imgWidth*coe2)
dst1 = cv2.resize(img,(dst1Width,dst1Height))
dst2 = cv2.resize(img,(dst2Width,dst2Height))
cv2.imshow('image',dst1)
cv2.imshow('image',dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.最近邻域插值法
# 最近邻域插值法
# 实现过程:
# 1.获取原图像信息,并设置缩放比
# 2.创建目标图像尺寸的数组
# 3.确定像素对应关系并赋值
import cv2
import numpy as np
img = cv2.imread('image01.jpg',1)
imgHeight,imgWidth,imgMode = img.shape
coe = 0.5
dstHeight = int(imgHeight*coe)
dstWidth = int(imgWidth*coe)
dstImg = np.zeros((dstHeight,dstWidth,imgMode),np.uint8)
# 像素值确定,使用最近邻域插值
for i in range(dstHeight):
for j in range(dstWidth):
y = int(i/coe + 0.5) #图像改变后图像中的位置 = 图像改变前图像中的位置 * 缩放比,改变前位置 = 改变后位置/缩放比以找到原像素值
x = int(j/coe + 0.5) #原图像A中的点a(x,y),对应的,改变后图像B中的点a'(x',y')=(x*coe,y*coe)
dstImg[i,j] = img[y,x] #所以,x = x'/coe,得到对应的原图像中的位置,并将原像素中的值赋给改变后的像素
cv2.imshow('image',dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.双向线性插值法
#双线性插值法
import cv2
import numpy as np
img = cv2.imread('image01.jpg',1)
imgHeight,imgWidth,imgMode = img.shape
coe = 0.5
dstHeight = int(imgHeight*coe)
dstWidth = int(imgWidth*coe)
dstImg = np.zeros((dstHeight,dstWidth,imgMode),np.uint8)
# 像素值确定,使用双线性插值
for i in range(dstHeight):
for j in range(dstWidth):
y = i / coe #确定所求点位置
x = j / coe
dy1 = y - int(y) #确定A1、A2与四点的距离
dy2 = int(y + 1) - y
dx1 = x - int(x)
dx2 = int(x + 1) - x
#确定A1、A2插值
A1 = dy1 * img[int(y), int(x)] + dy2 * img[int(y), int(x + 1)]
A2 = dy1 * img[int(y + 1), int(x)] + dy2 * img[int(y + 1), int(x + 1)]
dstImg[i, j] = dx1 * A1 + dx2 * A2
cv2.imshow('image',dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()