目錄
二、使用opencv五種插值算法進行圖像插值放大處理,比較效率與效果
一、圖像DPI爲分辨率/物理尺寸
DPI(200*200),分辨率(1008*745)的圖像的物理尺寸爲(1008/200)英寸 * (745/200)英寸
二、使用opencv五種插值算法進行圖像插值放大處理,比較效率與效果
保持圖像物理尺寸不變,將200DPI轉化爲300DPI,相當於將圖像放大了1.5倍,及此時的放縮參數scale爲1.5。
對比了下述五種插值算法:
① IMAGE_INTER_LINEAR //雙線性插值
② IMAGE_INTER_NN //最近鄰插值
③ IMAGE_INTER_AREA //像素面積相關重採樣
④ IMAGE_INTER_CUBIC //雙三次插值
⑤ IMAGE_INTER_LANCZOS4 //8x8像素鄰域內的Lanczos插值
三、代碼如下
#include <iostream>
#include <opencv2/opencv.hpp>
#include <fcntl.h>
#include <io.h>
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<sys/timeb.h>
#define MAX_PATH 260
#define IMAGE_NAME "image_DPM901_0_uv_a.bmp"
#define IMAGE_NAME_FINAL "image_DPM901_0_uv_a_"
#define IMAGE_TYPE ".bmp"
using namespace std;
using namespace cv;
enum IMAGE_TYPE_
{
IMAGE_INTER_LINEAR, //雙線性插值
IMAGE_INTER_NN, //最近鄰插值
IMAGE_INTER_AREA, //像素面積相關重採樣
IMAGE_INTER_CUBIC, //雙三次插值
IMAGE_INTER_LANCZOS4 //8x8像素鄰域內的Lanczos插值
};
int gettimeofday(struct timeval *tp, void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year = wtm.wYear - 1900;
tm.tm_mon = wtm.wMonth - 1;
tm.tm_mday = wtm.wDay;
tm.tm_hour = wtm.wHour;
tm.tm_min = wtm.wMinute;
tm.tm_sec = wtm.wSecond;
tm.tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec = clock;
tp->tv_usec = wtm.wMilliseconds * 1000;
return (0);
}
void GetRunPath(char* szFilePath)
{
GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
(strrchr(szFilePath, '\\'))[1] = 0; // 刪除文件名,只獲得路徑字串//
}
int main()
{
char* Type[5] = { "IMAGE_INTER_LINEAR", "IMAGE_INTER_NN", "IMAGE_INTER_AREA","IMAGE_INTER_CUBIC","IMAGE_INTER_LANCZOS4" };
struct timeval tvstart, tvend;
char path[MAX_PATH];
memset((char*)path, 0, sizeof(path));
GetRunPath(path);
printf("%s\n", path);
strcat((char*)path, IMAGE_NAME);
IplImage *src = 0;
IplImage *ret = 0;
CvSize ret_cvsize;
double scale = 1.5;
src = cvLoadImage((char*)path);
if (!src)
{
printf("no image\n");
return 0;
}
ret_cvsize.width = (int)(src->width*scale);
ret_cvsize.height = (int)(src->height*scale);
for (int i = 0; i < 5; i++)
{
ret = cvCreateImage(ret_cvsize, src->depth, src->nChannels);
gettimeofday(&tvstart, NULL);
switch (i)
{
case IMAGE_INTER_LINEAR:
cvResize(src, ret, IMAGE_INTER_LINEAR);
break;
case IMAGE_INTER_NN:
cvResize(src, ret, CV_INTER_NN);
break;
case IMAGE_INTER_AREA:
cvResize(src, ret, CV_INTER_AREA);
break;
case IMAGE_INTER_CUBIC:
cvResize(src, ret, CV_INTER_CUBIC);
break;
case IMAGE_INTER_LANCZOS4:
cvResize(src, ret, CV_INTER_LANCZOS4);
break;
default:
printf("type error\n");
break;
}
gettimeofday(&tvend, NULL);
int Timesss = tvend.tv_sec * 1000000 + tvend.tv_usec - tvstart.tv_sec * 1000000 - tvstart.tv_usec;
printf(" %s run time = %d (us)\n", Type[i],Timesss);
Mat ret_finial = cvarrToMat(ret);
memset((char*)path, 0, sizeof(path));
strcat((char*)path, IMAGE_NAME_FINAL);
strcat((char*)path, Type[i]);
strcat((char*)path, IMAGE_TYPE);
imwrite(path, ret_finial);
cvReleaseImage(&ret);
}
cvReleaseImage(&src);
system("pause");
return 0;
}
四、結果對比