文档章节

图像缩放--最近邻插值

t
 tigerBin
发布于 2017/07/03 12:53
字数 357
阅读 48
收藏 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
粉丝 0
博文 65
码字总数 17440
作品 0
武汉
程序员
私信 提问
【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)

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

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

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

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

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

文艺小青年
2017/05/31
0
0
(伍)规划师方向技能:基于ArcGIS的栅格数据重采样方法

1、引言 在规划分析中,经常需要将各类评估指标进行量化,然后生成栅格数据,处理栅格数据时,由于数据像元大小不符合要求,或者在进行栅格数据配准后,像元发生倾斜,或者对多个栅格数据进行...

gis_bt
05/25
0
0
滤波反投影重建算法(FBP)实现及应用(matlab)

版权声明:欢迎转载,转载请注明出处:土豆洋芋山药蛋 https://blog.csdn.net/qq_33414271/article/details/78128813 滤波反投影重建算法实现及应用(matlab) 1. 滤波反投影重建算法原理 滤...

土豆洋芋山药蛋
2017/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中高级面试知识点:缓存

前言 几乎所有的项目都做了缓存,但是缓存做的怎么样,其实只有我们自己知道。缓存做的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待很久的情况。 程序中除了图片缓存(...

Mr_zebra
4分钟前
0
0
Poco官方PPT_190-Applications双语对照翻译

因工作需要用到这一块的功能,所以直接翻译了一下 此PPT来源于官方文件,地址https://pocoproject.org/documentation.html

CHONGCHEN
7分钟前
0
1
使用idea开发servlet,引用maven后触发的class not found的问题的解决方案

需要将maven下载的依赖加入到lib目录,具体操作方法如下:打开Projrct Settings->Artifacts->右边的Output Layout,双击maven的依赖,就可以加载上去...

shatian
9分钟前
0
0
SpringMVC 拦截器

拦截器 是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强 SpringMVC拦截器实现过程 1.编写拦截器,实现 org.springframework.web.servlet.HandlerInterceptor 接口 2.将拦截器注册...

晨猫
11分钟前
0
0
RabbitMQ+PHP演示实例

新建rabbit_consumer.php作为消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'admin', 'password' => ......

hansonwong
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部