OpenCV-图片缩放

最近邻域插值法、双线性插值法。

OpenCV 中提供了 4 中常用的缩放方法,最近邻域差值、双线性差值、像素关系重采样、立方差值。默认采用双线性差值法来缩放图片。

缩放一张图片代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

img = cv2.imread('../01image.JPG', 1)
img_info = img.shape
print(img_info)

height = img_info[0] # 原图高度
width = img_info[1] # 原图宽度
mode = img_info[2] # 原图的颜色模式

# 放大和缩小两种,又等比例缩放和非等比例缩放
# 等比例缩放:原始图像的宽高 * 一个相同的系数
# 非等比例缩放:原始宽高 * 不同的系数
# 下面是等比例缩放
dst_height = int(height * 0.5)
dst_width = int(width * 0.5)

dst_img = cv2.resize(img, (dst_width, dst_height))

cv2.imshow('img', img)
cv2.imshow('dst_img', dst_img)
cv2.waitKey(0)

运行结果

##最近邻域插值

在一维空间中,最近点插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。会在一定程度上损失空间对称性(Alignment)

src 10*20
dst 5*10
dst <- src
(1, 2) <- (2, 4)

new_x = src_x (src 行 / dst 行)
new_y = src_y
(src 列 / dst 列)
例如: (1, 2) 这个点
new_x = 1 (10 / 5) = 2
new_y = 2
(20 / 10) = 4

如果是像素点 12.3 则取 12。

这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临 近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接 近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。

最近领域插值法Python代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2
import numpy as np

src_img = cv2.imread('../WindowsLogo.jpg', 1)

src_img_info = src_img.shape
src_img_height = src_img_info[0]
src_img_width = src_img_info[1]

dst_img_height = int(src_img_height / 2)
dst_img_width = int(src_img_width / 2)
dst_img = np.zeros((dst_img_height, dst_img_width, 3), np.uint8) # 0-255

for dst_x in range(0, dst_img_height): # 行
for dst_y in range(0, dst_img_width): # 列
src_x = int(dst_x * (src_img_height * 1.0 / dst_img_height))
src_y = int(dst_y * (src_img_width * 1.0 / dst_img_width))
dst_img[dst_x, dst_y] = src_img[src_x, src_y]

cv2.imshow('src_img', src_img)
cv2.imshow('dst_img', dst_img)
cv2.waitKey(0)

效果

双线性插值

A1 = 20% 上点 + 80% 下点,A2 相同。

B1 = 30% 左点 + 70% 右点,B2 相同。

最终点:A1 30% + A2 70% 或者 B1 20% + B2 80%。

注意这里 A1 和最终点的距离和 A2 距离最重点的距离是 0.3 和 0.7。

双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。


资料:
https://blog.csdn.net/JNingWei/article/details/78822026
https://blog.csdn.net/csdnforyou/article/details/82315683
https://blog.csdn.net/coy_wang/article/details/5027872

文章作者: ahoj
文章链接: https://ahoj.cc/2019/07/OpenCV-图片缩放/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ahoj 的小本本