opencv学习4——图像缩放

一、通过调用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.通过两次插值,通过周围四点的值插值出给定点的值

opencv学习4——图像缩放_第1张图片

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()

 

你可能感兴趣的:(opencv)