双线性插值2-代码
2016-05-08 18:40
337 查看
双线性插值较为常用,原理参考http://www.cnblogs.com/linkr/p/3630902.html
下面给出代码:
[cpp] view
plain copy
void ImgResize_BiLinear()
{
cv::Mat imgSrc, imgDst1, imgDst2;
imgSrc = cv::imread("test.jpg");
imgDst1 = cv::Mat(cv::Size(imgSrc.cols*2, imgSrc.rows*2), imgSrc.type(), cv::Scalar::all(0));
imgDst2 = cv::Mat(imgDst1.size(), imgSrc.type(), cv::Scalar::all(0));
double scale_x = (double)imgSrc.cols / imgDst1.cols;
double scale_y = (double)imgSrc.rows / imgDst1.rows;
uchar* dataDst = imgDst1.data;
int stepDst = imgDst1.step;
uchar* dataSrc = imgSrc.data;
int stepSrc = imgSrc.step;
int iWidthSrc = imgSrc.cols;
int iHiehgtSrc = imgSrc.rows;
short cbufy[2];
float y_float, x_float;
int y_int, x_int;
short cbufx[2];
for (int j=0; j<imgDst1.rows; ++j)
{
y_float = (float)((j + 0.5) * scale_y - 0.5);
y_int = cvFloor(y_float);
y_float -= y_int;
y_int = std::min(y_int, iHiehgtSrc - 2);
y_int = std::max(0, y_int);
cbufy[0] = cv::saturate_cast<short>((1.f - y_float) * 2048);
cbufy[1] = 2048 - cbufy[0];
for (int i=0; i<imgDst1.cols; ++i)
{
x_float = (float)((i + 0.5) * scale_x - 0.5);
x_int = cvFloor(x_float);
x_float -= x_int;
if (x_int < 0)
{
x_float = 0, x_int = 0;
}
if (x_int >= iWidthSrc - 1)
{
x_float = 0, x_int = iWidthSrc - 2;
}
cbufx[0] = cv::saturate_cast<short>((1.f - x_float) * 2048);
cbufx[1] = 2048 - cbufx[0];
for (int k = 0; k < imgSrc.channels(); ++k)
{
*(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + y_int*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[0] +
*(dataSrc + (y_int+1)*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[1] +
*(dataSrc + y_int*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[0] +
*(dataSrc + (y_int+1)*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[1]) >> 22;
}
}
}
cv::imwrite("result_1.jpg", imgDst1);
cv::resize(imgSrc, imgDst2, imgDst1.size(), 0, 0, 1);
cv::imwrite("result_2.jpg", imgDst2);
}
上述代码为3通道彩图的缩放代码,图片的加载保存用了Opencv的结构体,其余基本保持C的风格;
VS2008+Opencv249下面测试通过,有兴趣的朋友自己试试;
下面给出代码:
[cpp] view
plain copy
void ImgResize_BiLinear()
{
cv::Mat imgSrc, imgDst1, imgDst2;
imgSrc = cv::imread("test.jpg");
imgDst1 = cv::Mat(cv::Size(imgSrc.cols*2, imgSrc.rows*2), imgSrc.type(), cv::Scalar::all(0));
imgDst2 = cv::Mat(imgDst1.size(), imgSrc.type(), cv::Scalar::all(0));
double scale_x = (double)imgSrc.cols / imgDst1.cols;
double scale_y = (double)imgSrc.rows / imgDst1.rows;
uchar* dataDst = imgDst1.data;
int stepDst = imgDst1.step;
uchar* dataSrc = imgSrc.data;
int stepSrc = imgSrc.step;
int iWidthSrc = imgSrc.cols;
int iHiehgtSrc = imgSrc.rows;
short cbufy[2];
float y_float, x_float;
int y_int, x_int;
short cbufx[2];
for (int j=0; j<imgDst1.rows; ++j)
{
y_float = (float)((j + 0.5) * scale_y - 0.5);
y_int = cvFloor(y_float);
y_float -= y_int;
y_int = std::min(y_int, iHiehgtSrc - 2);
y_int = std::max(0, y_int);
cbufy[0] = cv::saturate_cast<short>((1.f - y_float) * 2048);
cbufy[1] = 2048 - cbufy[0];
for (int i=0; i<imgDst1.cols; ++i)
{
x_float = (float)((i + 0.5) * scale_x - 0.5);
x_int = cvFloor(x_float);
x_float -= x_int;
if (x_int < 0)
{
x_float = 0, x_int = 0;
}
if (x_int >= iWidthSrc - 1)
{
x_float = 0, x_int = iWidthSrc - 2;
}
cbufx[0] = cv::saturate_cast<short>((1.f - x_float) * 2048);
cbufx[1] = 2048 - cbufx[0];
for (int k = 0; k < imgSrc.channels(); ++k)
{
*(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + y_int*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[0] +
*(dataSrc + (y_int+1)*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[1] +
*(dataSrc + y_int*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[0] +
*(dataSrc + (y_int+1)*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[1]) >> 22;
}
}
}
cv::imwrite("result_1.jpg", imgDst1);
cv::resize(imgSrc, imgDst2, imgDst1.size(), 0, 0, 1);
cv::imwrite("result_2.jpg", imgDst2);
}
上述代码为3通道彩图的缩放代码,图片的加载保存用了Opencv的结构体,其余基本保持C的风格;
VS2008+Opencv249下面测试通过,有兴趣的朋友自己试试;
相关文章推荐
- 20145215《Java程序设计》第10周学习总结
- 归纳总结C#中的各种定时器
- struts2模型驱动获取表单的数据是空
- C++第五次作业
- c++作业5
- QT串口模拟-基本界面
- 一起talk C栗子吧(第一百四十八回:C语言实例--数据报socket通信过程)
- 基于MT7688模块的开发笔记8——TFTP方式烧写Uboot固件
- 《java入门第一季》之面向对象(匿名内部类)
- 《java入门第一季》之面向对象(匿名内部类)
- SpringMVC 全注解配置
- 解决yii2左侧菜单子级无法高亮问题的方法
- vc++ MFC中字符串(CString)的比较
- Java之------单机版书店管理系统(设计思想和设计模式系列一)概述
- 20145201《Java程序设计》第十周学习总结
- [JAVA修炼之路十二]- session管理
- 【Java故事系列】J2EE前五年: 从起源到目的
- c语言:删除多余的空格
- Struts2基础学习(三)—Result和数据封装
- preg_match_6.php