文档章节

图像缩放--最近邻插值

t
 tigerBin
发布于 2017/07/03 12:53
字数 357
阅读 37
收藏 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
【OpenCV】图像几何变换:旋转,缩放,斜切

几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几...

moki_oschina
2016/05/20
137
0
OpenCV 3 floodFill(漫水填充)、图片的放大缩小 pyrUp、pyrDown、Resize JAVA OpenCV专题学习10

关于 JAVA 学习 OpenCV 的内容,函数讲解。内容我均整理在 GitHubd的【OpenCV3-Study-JAVA】 下面代码中所需的项目结构,图片,请访问 GitHub 获取。 内容在注释里了。 广告栏: 欢迎关注我的...

35Niu
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
29分钟前
0
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
52分钟前
1
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
4
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
3
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部