opencv將200DPI圖像轉化爲300DPI(插值放大)

目錄

一、圖像DPI爲分辨率/物理尺寸

二、使用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;
}

四、結果對比

五種算法的速度對比

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章