OpenCV圖像縮放之cv.resize()函數(shù)詳解
系列前言
這個(gè)系列是我第一個(gè)想要更下去的系列。每篇會(huì)全面介紹一個(gè) OpenCV 函數(shù),會(huì)給出 API 和示例。示例主要是用 Python 去寫,但是 OpenCV 的原生語(yǔ)言是 C++,所以想翻譯過(guò)去其實(shí)很簡(jiǎn)單。介紹過(guò)程中如果有相關(guān)的 CV 知識(shí)也會(huì)一并寫入,還是那句話,爭(zhēng)取做到說(shuō)人話,讓小白也能看得懂。
API
API 來(lái)自 OpenCV官方文檔
C++
void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR )
Python
dst = cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
函數(shù)詳解
顧名思義,這個(gè)函數(shù)可以把圖片縮放到你想要的大小。
參數(shù)列表
在這里我們主要說(shuō) Python 的參數(shù)。把各個(gè)參數(shù)的含義和相關(guān)信息打一張表:
參數(shù) | 類型 | 是否必須指定 | 具體含義 |
---|---|---|---|
src | numpy.ndarray | 是 | 原圖像 |
dsize | tuple<int> | 是 | 縮放后的圖像大小 |
dst | 無(wú)所謂 | 否 | 目標(biāo)圖像,但是在 Python 里面沒(méi)有任何意義。一般不傳參或者設(shè)成 None |
fx , fy | 數(shù)值類型 | 否 | x 和 y 方向上的縮放比例 |
interpolation | int | 否 | 插值方式表示代碼,本質(zhì)是一個(gè) int 數(shù)值,一般用 OpenCV 內(nèi)置的參數(shù)代號(hào)以提高可讀性。 |
看這張表想必大家就很清楚了。
縮放方式其一
那么,想要實(shí)現(xiàn)縮放圖像,有兩種方法。第一種方法是指定縮放后的圖像大小。下面是實(shí)現(xiàn)這個(gè)功能的一個(gè)簡(jiǎn)單的程序。后面的給出的其他程序都是對(duì) resize
所在行進(jìn)行的改動(dòng)。
import numpy as np import cv2 as cv img = cv.imread("你希望縮放的圖片") # 縮放圖像,后面的其他程序都是在這一行上改動(dòng) dst = cv.resize(img, (400, 300)) # 顯示圖像 cv.imshow("dst: %d x %d" % (dst.shape[0], dst.shape[1]), dst) cv.waitKey(0) cv.destroyAllWindows()
在這個(gè)例子中,我們指定了縮放后圖像的大小為 400 x 300
,resize
函數(shù)就會(huì)將圖像拉伸到這個(gè)大小,拉伸后的圖像相比于原圖不會(huì)有任何的裁剪。
縮放方式其二
另一種方法,就是利用后面的 fx
和 fy
,指定縮放后圖像長(zhǎng)寬相對(duì)于原圖的比例。如果利用這兩個(gè)參數(shù),前面的 dsize
要寫成一個(gè)不合法的形式(比如:(0, 0)
)。具體原因后面會(huì)解釋。
注意,在 dsize
和 fx
中間其實(shí)隔了一個(gè)無(wú)用的 dst
,雖然沒(méi)有實(shí)際作用,但是這個(gè)參數(shù)確實(shí)存在,按照 Python 的函數(shù)傳參規(guī)則,要么指明實(shí)參傳遞給哪個(gè)形參,要么按順序傳參不能遺漏。具體看下面的例子,兩行的效果一致,都是將圖像橫向縮放為原來(lái)的 0.5 倍,縱向縮放為原來(lái)的 0.3 倍。
# 形參缺省 dst = cv.resize(img, (0, 0), None, 0.5, 0.3) # 指明形參 dst = cv.resize(img, (0, 0), fx=0.5, fy=0.3)
值得注意的是,縮放后的圖像寬高是根據(jù) round(img.shape[0] * fx)
和 round(img.shape[1] * fy)
來(lái)計(jì)算的,所以即使 fx
和 fy
并不是0,只要這兩個(gè)計(jì)算結(jié)果中有一個(gè)是 0,也會(huì)報(bào)錯(cuò)。
兩種方式的優(yōu)先級(jí)
OpenCV 會(huì)先檢查 dsize
是否合法,即圖像的寬和高是否都是非 0 的。如果是,就按照這個(gè)縮放,忽略后面的 fx
和 fy
;如果不是,就按照 fx
,fy
來(lái)計(jì)算。即優(yōu)先級(jí): dsize
> fx
fy
.
另外,兩種方式是獨(dú)立定義的,也就是不能混著,用數(shù)值指定長(zhǎng)卻用比率指定寬。不存在 cv.resize(img, (0, 400), fx=0.42)
這種用法!
關(guān)于插值方式
最后一個(gè)參數(shù),在 resize
函數(shù)里有 7 種可能取值,參考OpenCV文檔相關(guān)頁(yè)。但是我這里第 7 個(gè)參數(shù)是不存在的,或許是版本問(wèn)題?最后兩個(gè)參數(shù)我試過(guò),會(huì)報(bào)錯(cuò),不行。
雖然這些參數(shù)非常龐雜,但他們的插值效果卻差不多,一般情況下,默認(rèn)的線性插值就夠用。如果非要給點(diǎn)建議的話,我翻譯一下官網(wǎng)方文檔的原話:
要縮小圖片,一般來(lái)說(shuō)最好的插值方法是 cv.INTER_AREA
,而要放大一張圖片的話,一般來(lái)說(shuō)效果最好的是 cv.INTER_CUBIC
(速度慢)或者 cv.INTER_LINEAR
(速度快一些但結(jié)果仍然不錯(cuò))。
擴(kuò)展 —— 相關(guān)函數(shù)
OpenCV 為縮放圖像的大小提供了其他的選擇,這里說(shuō)兩個(gè)函數(shù):cv.pyrUp
和cv.pyrDown
。
這兩個(gè)函數(shù)可以用于構(gòu)建圖像金字塔,pyrUp
可以將圖像長(zhǎng)寬均放大為原來(lái)的 2 倍,而 pyrDown
則可以將圖像長(zhǎng)寬縮小為原來(lái)的 1/2. 與 resize
不同的是,這兩個(gè)函數(shù)和高斯卷積核緊密相關(guān)。pyrUp
是對(duì)圖像升采樣,隔行隔列插入零向量之后用高斯核卷積,而 pyrDown
則是對(duì)圖像高斯卷積后隔行隔列采樣。兩個(gè)的卷積核成倍數(shù)關(guān)系,前者是后者的4倍。
總結(jié)
到此這篇關(guān)于OpenCV圖像縮放之cv.resize()函數(shù)詳解的文章就介紹到這了,更多相關(guān)OpenCV圖像縮放cv.resize()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python的XSS測(cè)試工具XSStrike使用方法
XSS(Cross Site Scripting,跨站腳本攻擊)是一類特殊的Web客戶端腳本注入攻擊手段,通常指攻擊者通過(guò)“HTML注入”篡改了網(wǎng)頁(yè),插入惡意的腳本,從而在用戶瀏覽網(wǎng)頁(yè)時(shí)控制瀏覽器的一種攻擊。2017-07-07用pyqt5 給按鈕設(shè)置圖標(biāo)和css樣式的方法
今天小編就為大家分享一篇用pyqt5 給按鈕設(shè)置圖標(biāo)和css樣式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)虛擬機(jī)部署的算法思想
這篇文章主要介紹了Python動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)虛擬機(jī)部署的算法思想,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析
這篇文章主要介紹了pycharm創(chuàng)建scrapy項(xiàng)目教程及遇到的坑解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08通過(guò)python-turtle庫(kù)實(shí)現(xiàn)繪制圖畫
turtle庫(kù)是python的基礎(chǔ)繪圖庫(kù),經(jīng)常被用來(lái)給孩子們介紹編程知識(shí)的方法庫(kù),是標(biāo)準(zhǔn)庫(kù)之一,利用turtle可以制作很多復(fù)雜的繪圖。本文將為大家介紹通過(guò)turtle庫(kù)繪制的一些有趣的圖畫,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12