Python OpenCV resize 圖片縮放

本篇將介紹如何使用 Python 搭配 OpenCV 來 resize 縮放圖片,在寫 python 影像處理程式時常常會用到 opencv cv2.resize 圖片縮放的功能,接下來介紹怎麼使用 python 搭配 OpenCV 模組來進行圖片縮放 resize。

使用範例

以下 python 範例 ShengYu 是將 lena.jpg 讀取進來後,使用 opencv cv2.resize 進行縮放,從原本的512x512大小縮放成256x256 的大小。

opencv-resize.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2

image = cv2.imread('lena.jpg')
image = cv2.resize(image, (256, 256), interpolation=cv2.INTER_AREA)
cv2.imshow('Result', image)
cv2.waitKey(0)

結果如下圖所示:

參數說明

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

interpolation 說明
INTER_NEAREST 最近鄰插值
INTER_LINEAR 雙線性插值(預設)
INTER_AREA 使用像素區域關係進行重採樣。它可能是圖像抽取的首選方法,因為它會產生無雲紋理(波紋)的結果。 但是當圖像縮放時,它類似於INTER_NEAREST方法。
INTER_CUBIC 4x4像素鄰域的雙三次插值
INTER_LANCZOS4 8x8像素鄰域的Lanczos插值

cv2.resize 參數的詳細細節請參考這裡

OpenCV cv2.resize 提供五種方式的結果比較

下面的例子將 cv2.resize 所提供的所有種類都使用看看,來互相比較之間的差異,
我們先 resize 縮小成 400x400 的大小 來比較看看,
例子中還使用了 matplotlib 的方式將有圖片一起呈現在同一個視窗內,關於 matplotlib 的使用可以看看這篇
其中 matplotlib 的 imshow 圖片是使用RGB排列方式,所以這邊我們將 opencv 的 BGR 排列作個轉換,
這樣在 matplotlib 上顏色顯示才會正確。

opencv-resize.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt

image = cv2.imread('lena.jpg')
img1 = cv2.resize(image, (400, 400), interpolation=cv2.INTER_NEAREST)
img2 = cv2.resize(image, (400, 400), interpolation=cv2.INTER_LINEAR)
img3 = cv2.resize(image, (400, 400), interpolation=cv2.INTER_AREA)
img4 = cv2.resize(image, (400, 400), interpolation=cv2.INTER_CUBIC)
img5 = cv2.resize(image, (400, 400), interpolation=cv2.INTER_LANCZOS4)

# BGR 轉 RGB
img0_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
img1_rgb = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2_rgb = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
img3_rgb = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)
img4_rgb = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)
img5_rgb = cv2.cvtColor(img5, cv2.COLOR_BGR2RGB)

# 或這樣轉也可以
#img1_rgb = img1[:,:,::-1]

titles = ['Original Image', 'INTER_NEAREST', 'INTER_LINEAR', 'INTER_AREA', 'INTER_CUBIC', 'INTER_LANCZOS4']
images = [img0_rgb, img1_rgb, img2_rgb, img3_rgb, img4_rgb, img5_rgb]
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(images[i])
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()

結果如下圖所示,從下列結果圖發現,使用 INTER_NEAREST 會有些微地鋸齒狀,在圖片中的帽緣與鏡子邊緣上的線條可以發現,
INTER_NEAREST 是最簡單的插值方法,且速度快,但也容易出現鋸齒的現象。

OpenCV cv2.resize 這五種方式在速度上的比較

由快到慢排序:INTER_NEAREST > INTER_CUBIC > INTER_LINEAR > INTER_AREA > INTER_LANCZOS4
這是以我的電腦的測試數據,每次跑的結果都不太一樣,但整體速度排序來說差不多,

1
2
3
4
5
INTER_NEAREST:  0.000447 seconds
INTER_LINEAR: 0.000673 seconds
INTER_AREA: 0.001684 seconds
INTER_CUBIC: 0.000482 seconds
INTER_LANCZOS4: 0.003038 seconds

總結

如果是要縮小圖片的話,通常 INTER_AREA 使用效果較佳。
如果是要放大圖片的話,通常 INTER_CUBIC 使用效果較佳,次等則是 INTER_LINEAR。
如果要追求速度的話,通常使用 INTER_NEAREST。

其它參考
opencv: 图像缩放(cv2.resize)_人工智能JNing-CSDN博客
https://blog.csdn.net/JNingWei/article/details/78218837
Python-OpenCV中的resize()函数 - Rogn - 博客园
https://www.cnblogs.com/lfri/p/10596530.html
OpenCV圖像縮放resize各種插值方式的比較
人工智能_pan_jinquan的博客-CSDN博客
https://blog.csdn.net/guyuealian/article/details/85097633

其它相關文章推薦
如果你在學習 Python 或 OpenCV 影像處理相關技術,可以參考看看下面的文章,
Python OpenCV 彩色轉灰階(RGB/BGR to GRAY)
Python OpenCV 彩色轉HSV(RGB/BGR to HSV)
Python OpenCV 彩色轉YCbCr(RGB/BGR to YCbCr)
Python OpenCV 影像邊緣偵測 Canny Edge Detection
Python OpenCV 顯示camera攝影機串流影像
Python OpenCV 垂直vconcat 和水平hconcat 影像拼接
Python 旋轉圖片 rotate
Python 圖片模糊化 blur
Python 新手入門教學懶人包
小專案 Python OpenCV 圖片轉字元圖畫