前言
尝试根据b站大佬的相关视频,扩展自己的知识面以及知识水平
参考视频
b站视频
最近临域插值
相关介绍
双线性插值
过程
现阶段图片缩放类型及相关方法
最近临域插值
原理
假设原图像为10x20的图片,而想要将其缩放成为5x10的图片
使用目标图像的点,去表示原图像的点
(1,2) —> (2,4)
如何使用目标图像的点去推断原图像的点
newX = x*(原图像的行/目标图像的行)
newY = y*(原图像的列/目标图像的列)
注:如出现小数,需要取整
定义
目标各像素点的灰度值代替源图像中与其最邻近像素的灰度值。
优缺点分析
- 算法简单
- 相比于其他方法可以更好的去实现
- 容易出现色块现象
- 会破坏原图像的渐变关系
双线性插值
原理
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)
|
运行结果
原图:
运行结果:
最近临域插值法实现照片缩放
实现步骤
- 先获取当前图片的信息
- 使用numpy创建一个空白模板
- 重新加载对应的图片
代码部分
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) 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)
|
实现效果
原图:
缩放后图片: