文档章节

图像缩放--最近邻插值

t
 tigerBin
发布于 2017/07/03 12:53
字数 357
阅读 56
收藏 0

这种方法的优点是速度快,在放大倍数不大的时候,与其他几种算法效果差别不大

1. 用 P (i,j)表示目标图像的像素点(RGB),P(x,y)表示源图像的像素点(RGB)

2. 求解水平和垂直缩放因子

double horFactor = srcWidth / dstWidth;
double verFactor = srcHeight / dstHeight;

3.计算 P(i,j)在源图中的映射 P(x0,y0)

double x0 = i * verFactor;
double y0 = j * horFactor;

 4. 计算离P(x0,y0)最近的像素点 P(x,y)

int x = round(x0);
int y = round(y0);

 5. 得出目标图像 P(i,j)的像素值

P_dst(i,j).R = P_src(x,y).R;
P_dst(i,j).G = P_src(x,y).G;
P_dst(i,j).B = P_src(x,y).B;

 6. Source Code

uint8_t *Scaling(uint8_t *src, int srcWidth, int srcHeight, int dstWidth, int dstHeight)
{
	uint8_t *buf = new uint8_t[dstWidth * dstHeight * 3];

	double horFactor = double(srcWidth) / dstWidth;  //水平缩放因子
	double verFactor = double(srcHeight) / dstHeight; //垂直缩放因子

	int x0, y0;
	for (int i = 0; i < dstHeight; i++)
	{
		x0 = int(i * verFactor);
		for (int j = 0; j < dstWidth; j++)
		{
			y0 = int(j * horFactor);

			int srcOffset = (x0 * srcWidth + y0) * 3; // RGB 
			int dstOffset = (i * dstWidth + j) * 3;   //RGB

			buf[dstOffset + 0] = src[srcOffset + 0]; // B
			buf[dstOffset + 1] = src[srcOffset + 1]; // G
			buf[dstOffset + 2] = src[srcOffset + 2]; // R
		}
	}

	return buf;
}

 测试代码:

int main(int argc, char *argv[])
{

	JpegDecoder decoder("02.jpg");
	auto &img = decoder.Decoder();

	uint8_t *scale = Scaling(img.Data, img.Width, img.Height, img.Width / 2, img.Height / 2);

	cv::Mat src, dst;
	src.create(img.Height, img.Width, CV_8UC3);
	dst.create(img.Height / 2, img.Width / 2, CV_8UC3);

	src.data = img.Data;
	dst.data = scale;

	cv::imshow("src", src);
	cv::imshow("dst", dst);
	cv::waitKey();
	return 0;
}

JpegDecoder: https://git.oschina.net/SilentCode/tinyjepgdecoder

运行示例:

© 著作权归作者所有

共有 人打赏支持
t
粉丝 1
博文 65
码字总数 17440
作品 0
武汉
程序员
私信 提问
【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)

实验要求   本实验后面的图像给出了用点模式近似表示的10 个灰度级。每一个灰度级用一个3 x 3 的黑白点模式表示。用黑点全部填充的3 x 3 区域近似表示灰度级为0 的黑色灰度级,全部填充白点...

u013165921
2018/01/14
0
0
【OpenCV入门指南】第二篇 缩放图像

【OpenCV入门指南】第二篇 缩放图像 上一篇《【OpenCV入门指南】第一篇安装OpenCV》讲解了如何在VS2008下安装和配置OpenCV,本篇将介绍使用OpenCV来缩放图片。首先介绍几个关键函数——cvRes...

长平狐
2012/12/10
297
0
图像的几何变换

几何变换不改变像素值,而是改变像素所在的位置。 1.图像的平移 图像的平移非常简单,所用到的是中学学过的直角坐标系的平移变换公式: x ‘ = x +dx y’ = y + dy 注:(x,y)为源图像的坐标...

文艺小青年
2017/05/31
0
0
matlab imresize 改变图像大小

功能:改变图像的大小。 用法: B = imresize(A,m) B = imresize(A,m,method) B = imresize(A,[mrows ncols],method) B = imresize(...,method,n) B = imresize(...,method,h) imrersize 函数......

colddie
2012/06/21
0
0
图像放缩中最近邻插值和双线性插值的基本原理

图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工...

andrew659
2009/11/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

从 for of 聊到 Generator

你能学到什么 对 for of 更深入的理解 iterator 到底是何方神圣? 数组也是对象,为什么不能用 for of 来遍历对象呢? 如何实现对象的 for of? Generator 又是何方神圣? Generator 有什么用呢...

Jack088
14分钟前
0
0
怎么判断go-sql-driver 安装成功

.下载安装   执行下面两个命令:     下载:go get github.com/Go-SQL-Driver/MySQL     安装:go install github.com/Go-SQL-Driver/MySQL   怎么判断go-sql-driver 安装成功 ...

dragon_tech
22分钟前
0
0
刚入职阿里,告诉你真实的职场生活,兼谈P6、P7、P8的等级

一:拿下offer的人,基本上都有什么特征? 二:为什么选择阿里? 三:阿里的工作氛围什么样? 四:阿里的薪资情况? 五:阿里的晋升空间有多大? 最近部门招聘,很多工程师,包括我在内都参与...

java知识分子
36分钟前
3
0

中国龙-扬科
39分钟前
1
0
windows 安装nvm

1、nvw-windows的官网:https://github.com/coreybutler/nvm-windows/releases 2、选择nvm-setup.zip安装 3、配置环境变量 4、检查nvm是否安装成功 使用管理员权限打开一个命令行。输入nvm v...

灰白发
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部