【1】引言
前序已經學習了常規的圖像讀取操作和圖像保存技巧,相關文章鏈接為:
python學opencv|讀取圖像-CSDN博客
python學opencv|讀取圖像(二)保存彩色圖像-CSDN博客
今天我們更近一步,學習放大和縮小圖像的技巧,力求掌握cv.resize()函數的用法。
【2】opencv官方教程
點擊系下述鏈接,可以直達官網教程:
OpenCV: Geometric Image Transformations
在官網有很多函數,今天主要學習下述內容:
圖1
其實這里講的比較簡單,綜合起來就是:
resize(src, dst, dst.size(), fx, fy, interpolation)
src,輸入圖像,必須有,這是修改大小的初始條件;
dst,輸出圖像,如果不為0,大小和dsize一致,否則就,通過輸入計算fx和fy;輸出圖像和輸入圖像的類型一致;
dsize,輸出圖像的大小,如果=0或者none,就用fx和fy來修改圖像;
fx,水平方向放大因子;
fy,豎直方向放大因子;
interpolation,插值方法。
【3】代碼測試
在上述基礎上,輸入以下代碼做測試:
import cv2 #引入CV模塊# 讀取圖片
image = cv2.imread('opencv-picture-001.png')# 定義放大因子
scale_factor = 2# 放大圖片,使用立方插值
scaled_image = cv2.resize(image, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值# 保存結果
cv2.imwrite('scaled_image-22-INTER_CUBIC.png', scaled_image)# 顯示結果
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在這里,使用的原圖像為opencv-picture-001.png:
圖2
用了兩倍的放大因子:scale_factor=2
使用的插值方法為:cv2.INTER_CUBIC
運行后的輸出圖像為:
圖3
上傳網站后好像圖2和圖3沒有區別,我們看一下它們的大小:
圖4
可見圖3相對于圖2確實是分別率擴大了兩倍。
【4】插值方法測試
在上述測試案例上,我們獲得的放大圖像在上傳CSDN網站后依然清晰。
實際上改變圖像大小有多種插值方法,相關鏈接為:
OpenCV: Geometric Image Transformations
我們主要研究一下前面三種:
圖5
更新插值和保存圖像代碼為:
# 放大圖片,使用不同插值方法 scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值 scaled_image1= cv2.resize(image, None, fx=0.2, fy=2.2, interpolation=cv2.INTER_NEAREST) scaled_image2= cv2.resize(image, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR ) # 保存結果 cv2.imwrite('scaled_image-22-INTER_CUBIC.png', scaled_image) cv2.imwrite('scaled_image-22-INTER_NEAREST.png', scaled_image1) cv2.imwrite('scaled_image-22-INTER_LINEAR.png', scaled_image2)
獲得的cv2.INTER_NEAREST和cv2.INTER_LINEAR插值圖像為:
圖6? cv2.INTER_NEAREST
圖6是使用NEAREST插值方法,橫向縮小為原來的0.2倍,豎向擴大為原來的2.2倍后的效果。
圖7 cv2.INTER_LINEAR
圖7是使用 LINEAR插值方法,橫向和豎向均縮小為原來的0.5倍后的圖像。
之后我們繼續修改,使圖像的放大因子保持一致:
scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值 scaled_image1= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST) scaled_image2= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR ) # 保存結果 cv2.imwrite('scaled_image-220-INTER_CUBIC.png', scaled_image) cv2.imwrite('scaled_image-220-INTER_NEAREST.png', scaled_image1) cv2.imwrite('scaled_image-220-INTER_LINEAR.png', scaled_image2)
此時獲得的圖像為:
圖8 從上到下CUBIC-NEAREST-LINEAR
相對來說,CUBIC插值法獲得的圖像清晰度最好。
此時的完整代碼為:
import cv2 #引入CV模塊# 讀取圖片
image = cv2.imread('opencv-picture-001.png')# 定義放大因子
scale_factor = 2# 放大圖片,使用不同插值方法
scaled_image = cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) #INTER_CUBIC插值
scaled_image1= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST)
scaled_image2= cv2.resize(image, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR )
# 保存結果
cv2.imwrite('scaled_image-220-INTER_CUBIC.png', scaled_image)
cv2.imwrite('scaled_image-220-INTER_NEAREST.png', scaled_image1)
cv2.imwrite('scaled_image-220-INTER_LINEAR.png', scaled_image2)
# 或者顯示結果
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
【5】總結
探索了使用python+opencv放大和縮小圖像的方法。
經過對比不同的插值方法,發現CUBIC插值法獲得的圖像清晰度最好。
?
?
?
?