Opencv中提供了resize函數,可以把圖像調整到相同大小
Java中resize函數的聲明,內部調用的都是native方法
public static void resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation)
{
resize_0(src.nativeObj, dst.nativeObj, dsize.width, dsize.height, fx, fy, interpolation);
return;
}
//javadoc: resize(src, dst, dsize)
public static void resize(Mat src, Mat dst, Size dsize)
{
resize_1(src.nativeObj, dst.nativeObj, dsize.width, dsize.height);
return;
}
解釋下各個參數的意思:
src: 待改變大小的圖像
dst: 輸出的目標圖像
dsize: 目標圖像的尺寸
fx:width方向的縮放比例,如果它是0,那么它就會按照
(double)dsize.width/src.cols來計算
fy:height方向的縮放比例,如果它是0,那么它就會按照(double)dsize.height/src.rows來計算
interpolation:這個是指定插值的方式,圖像縮放之后,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:
INTER_NEAREST - 最鄰近插值
INTER_LINEAR - 雙線性插值,如果最后一個參數你不指定,默認使用這種方法
INTER_AREA - 區域插值; 區域插值分為3種情況。圖像放大時類似於線性插值,圖像縮小時可以避免波紋出現。
INTER_CUBIC -基於4x4像素鄰域的3次插值法
INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值
實戰演示一下
/**
* 把圖片歸一化到相同的大小
*
* @param src
* Mat矩陣對象
* @return
*/
public static Mat resize(Mat src) {
//src = trimImg(src);//這個函數可以忽略,不產生影響
Mat dst = new Mat();
// 區域插值(INTER_AREA):圖像放大時類似於線性插值,圖像縮小時可以避免波紋出現。
Imgproc.resize(src, dst, dsize, 0, 0, Imgproc.INTER_AREA);
return dst;
}
效果:
本項目的所有代碼地址:https://github.com/YLDarren/opencvHandleImg