一、參數介紹
cv2.resize()函數是OpenCV庫中的一種圖像處理函數,用於調整圖像的大小。常用於圖像縮放、裁剪、旋轉、鏡像等操作。在使用該函數時,需要注意以下參數:
1.1 目標大小參數——dsize
dsize是目標圖像的大小,通常採用元組(width, height)表示。可以指定縮放後圖像的大小,也可以使用0參數來根據縮放比例自動計算大小。舉個例子:
# 指定目標大小 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, (500, 600)) # 指定縮放比例 resized_img = cv2.resize(img, None, fx=0.5, fy=0.5)
1.2 縮放比例參數——fx和fy
fx和fy是橫向和縱向的縮放比例,默認值為1,表示不縮放。若fx為0.5,fy為2,則水平方向縮小一半,垂直方向增大一倍。同樣地,在使用該參數時可以指定目標大小或使用0參數來自動計算大小。
1.3 插值方法參數——interpolation
interpolation表示縮放圖像時的插值方法,常見的有以下三種:
- cv2.INTER_NEAREST:最近鄰插值。
- cv2.INTER_LINEAR:雙線性插值(默認選項)。
- cv2.INTER_CUBIC:雙三次插值。
一些情況下,放大圖像使用INTER_CUBIC會比較好,縮小圖像使用INTER_AREA會比較好。舉個例子:
# 指定插值方法 resized_img1 = cv2.resize(img, (500, 600), interpolation=cv2.INTER_NEAREST) resized_img2 = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
1.4 填充方式參數——borderMode
borderMode表示在縮放圖像時所填充的邊緣像素的模式,常見的有以下兩種:
- cv2.BORDER_CONSTANT:填充常數值。
- cv2.BORDER_REPLICATE:複製最邊緣像素。
舉個例子,在寬度和高度上各縮放2倍,並且填充邊界像素:
import cv2 import numpy as np img = cv2.imread('image.jpg') rows, cols = img.shape[:2] resized_img = cv2.resize(img, (cols * 2, rows * 2), interpolation=cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT)
二、圖像縮放
圖像縮放是最常用的cv2.resize()函數操作之一,它的作用是改變圖像的大小。下面我們來看一下cv2.resize()函數如何實現圖像縮放操作。
2.1 按比例縮放
比例縮放是指按照一定的比例縮小或者放大圖片。在使用cv2.resize()函數時,可以使用fx和fy參數分別指定水平方向和垂直方向的比例。比如:傳入fx=0.5,fy=0.5,表示縮小一半。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC) cv2.imshow('resized_img', resized_img) cv2.waitKey(0) cv2.destroyAllWindows()
2.2 按目標尺寸縮放
目標尺寸縮放是指將原圖縮放到指定的目標尺寸。需要注意的是,在指定目標尺寸時,需要使用一個元組(width, height)來表示。比如:傳入(400, 200),表示將目標圖片的寬為400,高為200。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, (400, 200), interpolation=cv2.INTER_CUBIC) cv2.imshow('resized_img', resized_img) cv2.waitKey(0) cv2.destroyAllWindows()
2.3 按照比例和目標尺寸縮放
有時候我們需要按照一定的比例和指定的目標尺寸來縮放圖片。此時我們可以直接指定fx和fy的值,也可以直接指定目標尺寸的大小。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img1 = cv2.resize(img, (400, 200), interpolation=cv2.INTER_CUBIC) resized_img2 = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC) cv2.imshow('resized_img', resized_img1) cv2.imshow('resized_img2', resized_img2) cv2.waitKey(0) cv2.destroyAllWindows()
三、插值演算法
在圖像縮放中,插值演算法是一個不可忽略的問題。OpenCV提供了三種插值演算法,包括最近鄰插值、雙線性插值和雙三次插值。下面我們會針對這三種插值演算法進行詳細介紹。
3.1 最近鄰插值
最近鄰插值的演算法非常簡單,就是取周圍點的灰度值來填充當前像素點的值。在圖像縮小的時候,最近鄰插值演算法會丟失一些細節。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST) cv2.imshow('resized_img', resized_img) cv2.waitKey(0) cv2.destroyAllWindows()
3.2 雙線性插值
雙線性插值是一種比較常用的插值演算法,在縮小和放大圖像時都會用到。它是基於對兩個方向上的一階導數進行估計來計算一個像素值,而不是簡單地從周圍的像素值中選取一個值。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) cv2.imshow('resized_img', resized_img) cv2.waitKey(0) cv2.destroyAllWindows()
3.3 雙三次插值
雙三次插值是一種複雜的插值演算法,如果在縮小圖像時使用的話,會比雙線性插值更加平滑。而在放大圖像時,它比雙線性插值更能保留細節。代碼示例如下:
import cv2 img = cv2.imread('image.jpg') resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC) cv2.imshow('resized_img', resized_img) cv2.waitKey(0) cv2.destroyAllWindows()
四、結尾
cv2.resize()函數是一個非常有用的圖像處理函數,在圖像縮放、裁剪、旋轉、鏡像等操作中都有應用。本文詳細介紹了該函數參數的使用方法,並給出了實用的代碼示例。如果有需要對圖像進行縮放等操作的讀者,可以了解該函數的更多使用技巧,從而更好地幫助你解決實際問題。
原創文章,作者:DZEHH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317758.html