OpenCV(3)-圖像resize


在圖像處理過程中,有時需要把圖像調整到同樣大小,便於處理,這時需要用到圖像resize()

原函數
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
前兩個參數分別為輸入和輸出圖像。dsize表示輸出圖像的大小,如果為0,則

\[dsize = Size(round(fx*src.cols), round(fy*src.rows)) \]

dsize和fx、fy不能同時為0。fx、fy是沿x軸和y軸的縮放系數;默認取0時,計算如下

\[fx=(double)dsize.width/src.cols \]

\[fy=(double)dsize.height/src.rows \]

最優一個參數interpolation表示插值方式,有以下幾種:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 線性插值(默認)
INTER_AREA - 區域插值
INTER_CUBIC - 三次樣條插值
INTER_LANCZOS4 - Lanczos插值

INTER_NEAREST最近鄰插值

目標如下的像素點為對應的最近的原圖像的像素點。假設原圖像大小為(s_height, s_width),目標圖像大小為(d_height, d_width),那么高度和寬度的縮放比例為h_ratio = s_height/d_height,w_ratio=s_width/d_width。

對面目標圖像像素:(x, y)其值等於原圖像(x * w_ration, y * h_ration)處的值。

INTER_LINEAR 線性插值

默認使用。在使用最近鄰插值時,得到的坐標未必是一個整數,例如
(xw_ration, yh_ration)=(10.5, 20.5),那么可能取得坐標點就有四種(10, 20)、(11, 20)、(10, 21)、(11, 21)。雙線性插值,會把這四個坐標的像素值加權求和。
D(x, y) = S(j, k) * w1 + S(j+1, k) *w2 + S(j+1,k+1) * w3 + S(j, K+1) * w4,其中w為權值。權值大小和計算位置的小數部分有關。

CV_INTER_AREA:區域插值

區域插值分為3種情況。圖像放大時類似於線性插值,圖像縮小時可以避免波紋出現。

INTER_CUBIC 三次樣條插值

使用4x4鄰域內的像素雙3次插值。

INTER_LANCZOS4 Lanczos插值

使用8×8像素鄰域的Lanczos插值

舉例

#include <string>

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main(int argc, char* argv[]){
	std::string path = "";
	int resize_height = 256;
	int resize_width = 256;
	cv::Mat src = cv::imread(path); 
	cv::Mat dst;
	imshow("src", src);
	cv::resize(src, dst, cv::Size(resize_width, resize_height), (0, 0), (0, 0), cv::INTER_LINEAR);
	imshow("dst", dst);

	cv::waitKey(0);
	return 0;
}

參考官網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM