使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用Python,OpenCV縮放照片(忽略寬高比,保持寬高比)
- 1. 效果圖
- 1.1 保持寬高比效果圖
- 1.2 忽略寬高比效果圖
- 1.3 opencv各插值效果圖
- 2. 原理
- 3. 源碼
- 參考
這篇博客將介紹如何使用OpenCV調(diào)整圖像大小。
調(diào)整圖像的大小:縮小圖像大小更有利一些(而且視覺上更吸引人一些),需要從圖像中移除像素。增加圖像的大小,則需要在其間“填補”不存在的像素值。
雖然高分辨率圖像在視覺上對人眼有吸引力,但它們會損害計算機視覺和圖像處理管道處理。
- 根據(jù)定義,圖像越大,數(shù)據(jù)越多,因此算法處理數(shù)據(jù)的時間也就越長。
- 高分辨率圖像非常詳細,但從計算機視覺/圖像處理的角度來看,我們更感興趣的是圖像的結(jié)構(gòu)成分,而不是超細粒度的細節(jié)。大分辨率的圖像幾乎都是下采樣的,以幫助圖像處理系統(tǒng)運行更快,更準確。
1. 效果圖
1.1 保持寬高比效果圖
原圖 VS 縮小為1/2圖 VS 放大2倍圖效果圖如下:
1.2 忽略寬高比效果圖
可以看出保持寬高比的縮放使得圖片看起來比較規(guī)整,忽略圖像的寬高比會使調(diào)整后的圖像看起來像被壓縮、扭曲或者擠壓。
1.3 opencv各插值效果圖
原圖 VS cv2.INTER_NEAREST效果圖如下,有塊狀的偽影
原圖 VS cv2.INTER_LINEAR效果圖如下:塊狀的偽影消失,圖像看起來更平滑
原圖 VS cv2.INTER_AREA效果圖如下,塊狀的瑕疵又回來了
原圖 VS cv2.INTER_CUBIC效果圖如下,三次插值進一步消除了塊狀偽影
原圖 VS cv2.INTER_LANCZOS4效果圖如下,基本同cv2.INTER_CUBIC
2. 原理
- cv2.resize(忽略寬高比)
- imutils.resize(保持寬高比)
- OpenCV中提供的插值方法(在需要對圖像進行下采樣或上采樣時非常有用)
3. 源碼
# USAGE
# python opencv_resize.py# 導(dǎo)入必要的包
import argparseimport cv2
# 構(gòu)建命令行參數(shù)及解析
# --image 輸入圖像的路徑
import imutilsap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str, default="ymzyt.jpg",help="path to the input image")
args = vars(ap.parse_args())# 加載原始圖像并展示
image = cv2.imread(args["image"])
image = imutils.resize(image, width=400)
cv2.imshow("Original", image)
width = image.shape[1]
cv2.imshow("ratio 1/2", imutils.resize(image, width=int(width / 2)))
cv2.imshow("ratio 2", imutils.resize(image, width=width * 2))
cv2.waitKey(0)cv2.imshow("Original", image)
width = image.shape[1]
height = image.shape[0]
cv2.imshow("no ratio 1/2", cv2.resize(image, (int(width / 2), int(height / 1)), interpolation=cv2.INTER_AREA))
cv2.imshow("no ratio 2", cv2.resize(image, (width * 2, height * 3), interpolation=cv2.INTER_AREA))
cv2.waitKey(0)# 縮放圖像為寬度200px,但是為了防止圖像被擠壓及扭曲,首先計算寬高比
r = 200.0 / image.shape[1]
dim = (200, int(image.shape[0] * r))# 調(diào)整圖像大小
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Width)", resized)# 保持寬高比的縮放高度為100px
r = 100.0 / image.shape[0]
dim = (int(image.shape[1] * r), 100)# 執(zhí)行縮放
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized (Height)", resized)
cv2.waitKey(0)# 每次縮放圖像時都自動計算寬高比,并保持寬高比的縮放圖像
resized = imutils.resize(image, width=200)
cv2.imshow("Resized via imutils", resized)
cv2.waitKey(0)resized = imutils.resize(image, height=75)# 插值函數(shù)的目標是檢查像素的鄰域,并使用這些鄰域在不引入失真(或至少盡可能少的失真)的情況下光學(xué)地增大或減小圖像的大小。
# - cv2.INTER_NEAREST 最近鄰插值法,OpenCV默認執(zhí)行該方法,它執(zhí)行雙線性插值-斜率截距形式;
# - cv2.INTER_AREA 最簡單的插值方法,找到“最近的”像素并假設(shè)其值。該方法不需要計算相鄰像素的加權(quán)平均值或應(yīng)用復(fù)雜的規(guī)則,雖然這種方法快速簡單,但調(diào)整大小后的圖像質(zhì)量往往相對較差,并可能導(dǎo)致“塊狀”偽影。# 這倆種方法速度較慢(它們不再使用簡單的線性插值,而是使用樣條曲線),并且在正方形像素鄰域上使用雙三次插值。
# - cv2.INTER_CUBIC 計算4 x 4鄰居
# - cv2.INTER_LANCZOS4 計算8 x 8鄰居,很少見,# 構(gòu)建OpenCV中的插值方法List
methods = [("cv2.INTER_NEAREST", cv2.INTER_NEAREST), # 有塊狀的偽影("cv2.INTER_LINEAR", cv2.INTER_LINEAR), # 塊狀的偽影消失,圖像看起來更平滑("cv2.INTER_AREA", cv2.INTER_AREA), # 塊狀的瑕疵又回來了("cv2.INTER_CUBIC", cv2.INTER_CUBIC), # 三次插值進一步消除了塊狀偽影("cv2.INTER_LANCZOS4", cv2.INTER_LANCZOS4)] # 基本同cv2.INTER_CUBIC# 遍歷插值方法
for (name, method) in methods:# 上采樣,使用當前插值方法,放大圖片3倍print("[INFO] {}".format(name))resized = imutils.resize(image, width=image.shape[1] * 2,inter=method)cv2.imshow("Method: {}".format(name), resized)cv2.waitKey(0)
cv2.destroyAllWindows()
參考
- https://www.pyimagesearch.com/2021/01/20/opencv-resize-image-cv2-resize/
總結(jié)
以上是生活随笔為你收集整理的使用Python,OpenCV缩放照片(忽略宽高比,保持宽高比)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pip install 及导出安装库,批
- 下一篇: Java Spring @Schedul