双线性插值图像放大
单通道图放大实现代码:
//op.h
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
//缩放图像函数
void enlargeImg(Mat src,Mat &dst,double size,int type)
{
int dx = (int)((double)src.cols*(size-1));
int dy = (int)((double)src.rows*(size-1));
copyMakeBorder(src, dst, 0, dy, 0, dx, BORDER_CONSTANT);
if (type==0)//最近差值法
{
for(int i=0;i<dst.rows;i++)
{
for(int j=0;j<dst.cols;j++)
{
dst.at<uchar>(i,j)=src.at<uchar>(i/size,j/size);
}
}
}
else if(type==1)//双线性差值
{
double srcX,srcY;
double u,v;
for(int i=0;i<dst.rows;i++)
{
for(int j=0;j<dst.cols;j++)
{
srcX=(double)i/(double)size;
srcY=(double)j/(double)size;
u=srcX-floor(srcX);
v=srcY-floor(srcY);
int x=i/size,y=j/size;
dst.at<uchar>(i,j)=(int)((1-u)*(1-v)*(double)src.at<uchar>(x,y)+(1-u)*v*(double)src.at<uchar>(x,y+1)+u*(1-v)*(double)src.at<uchar>(x+1,y)+u*v*(double)src.at<uchar>(x+1,y+1));
}
}
}
}
//main.cpp
#include <iostream>
#include<opencv2/opencv.hpp>
#include"op.h"
#define path "dog.jpg"
using namespace cv;
using namespace std;
int main()
{
Mat src=imread(path,0);
Mat dst;
imshow("源图像",src);
waitKey(0);
enlargeImg(src, dst, 3,0);//最近插值放大源图像3倍
imshow("双线性插值放大",dst);
waitKey(0);
enlargeImg(src, dst, 2.5,1);//双线性插值放大源图像2.5倍
imshow("双线性插值放大",dst);
waitKey(0);
return 0;
}
使用了大量的数据类型转换,代码效率不高,仅做到实现理论功能。
详细原理及代码优化参考:https://www.cnblogs.com/yssongest/p/5303151.html