0%

使用opencv对图像进行缩放

前言

尝试根据b站大佬的相关视频,扩展自己的知识面以及知识水平

参考视频

b站视频

最近临域插值

相关介绍

双线性插值

过程

现阶段图片缩放类型及相关方法

最近临域插值

原理

假设原图像为10x20的图片,而想要将其缩放成为5x10的图片

使用目标图像的点,去表示原图像的点

​ (1,2) —> (2,4)

如何使用目标图像的点去推断原图像的点

newX = x*(原图像的行/目标图像的行)

newY = y*(原图像的列/目标图像的列)

注:如出现小数,需要取整

定义

目标各像素点的灰度值代替源图像中与其最邻近像素的灰度值。

优缺点分析

  • 算法简单
  • 相比于其他方法可以更好的去实现
  • 容易出现色块现象
  • 会破坏原图像的渐变关系

双线性插值

原理

image

A1 = 20%上面的点 +80%下面的点

B1 = 30%左面的点 +70%右边的点

1最终点 = A1*30% + A2*70%

2最终点 = B1*20% + B2*80%

定义

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值

优缺点分析

  • 内插值法计算量大
  • 图像质量高,不会出现不连续的现象
  • 具有低通滤波性质,可能会使得图像在一定程度上变得模糊

使用双线性插值对图像进行缩放处理

代码片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
img = cv2.imread('YT.jpg', 1)
imgInfo = img.shape # 获取图片信息
print(imgInfo)
height = imgInfo[0] # 图片高度
weight = imgInfo[1] # 图片宽度
mode = imgInfo[2] # 图片的组成方式
# 缩放:放大或者缩小 等比例或者非等比例
dstHeight = int(height*0.5)
dstWeight = int(weight*0.5)

# 图片缩放类型: 最近临域插值 双线性插值(默认) 像素关系重采样 立方插值
dst = cv2.resize(img, (dstWeight, dstHeight))
cv2.imshow('img', dst)
cv2.waitKey(0)

运行结果

1
(3648, 2736, 3)

原图:

image

运行结果:

image

最近临域插值法实现照片缩放

实现步骤

  1. 先获取当前图片的信息
  2. 使用numpy创建一个空白模板
  3. 重新加载对应的图片

代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
效果import cv2
import numpy as np
img = cv2.imread('YT.jpg', 1)
imgInfo = img.shape
imgHeight = imgInfo[0]
imgWeight = imgInfo[1]
dstHeight = int(imgHeight / 2)
dstWeight = int(imgWeight/2)
dstImg = np.zeros((dstHeight, dstWeight, 3), np.uint8) # 0-255
for i in range(0, dstHeight): # 对应的是行信息
for j in range(0, dstWeight): # 对应的是列信息
iNew = int(i*(imgHeight*1.0/dstHeight))
jNew = int(j*(imgWeight*1.0/dstWeight))
dstImg[i, j] = img[iNew, jNew]
cv2.imshow('dst', dstImg)
cv2.waitKey(0)

实现效果

原图:

image

缩放后图片:

image

-------------我也是有底线的哦如需更多,欢迎打赏-------------