一、通过调用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.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.双向线性插值法