文档章节

图像缩放--双线性插值

t
 tigerBin
发布于 2017/07/02 23:42
字数 427
阅读 164
收藏 0

双线性插值:https://en.wikipedia.org/wiki/Bilinear_interpolation

(i,j)表示 destination 目标图片中的像素点, P(x0, y0) 表示 source源图像中的像素点

P(i, j)就是要求的像素点

1.首先,计算 水平压缩因子与垂直压缩因子,

double horFactor = srcWidth / dstWidth,

double verFactor = srcHeight / dstHeight

2. 计算 P(x0, y0)

double x0 = i * horFactor

double y0 = j * verFactor

3. 计算 Source中 距离P(x0, y0)最近的四个像素点的坐标(x1, y1), (x1, y2), (x2, y1), (x2, y2)

x1  =int(x0)
x2 = x1 + 1
y1 = int(y0)
y2 = y1 + 1

4.计算权值 

5.利用公式求解 P(i,j)

6. Source Code

uint8_t  *Scale(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; //垂直缩放因子

	double w0, w1, w2, w3; // weight
	int x1, y1, x2, y2; // (x1, y1), (x2, y2)
	double fx1, fx2, fy1, fy2;

	for (int i = 0; i < dstHeight; i++)
	{
		double x0 = i * verFactor;
		x1 = int(i * verFactor);
		x2 = x1 + 1;

		fx1 = x2 - x0;
		fx2 = x0 - x1;
		for (int j = 0; j < dstWidth; j++)
		{
			double y0 = j * horFactor;
			y1 = int(j * horFactor);
			y2 = y1 + 1;

			fy1 = y2 - y0;
			fy2 = y0 - y1;

			// 计算权值
			w0 = fx1 * fy1;
			w1 = fx1 * fy2;
			w2 = fx2 * fy1;
			w3 = fx2 * fy2;

			int dstOffset = (i * dstWidth + j) * 3;
			int srcOffset1 = (x1 * srcWidth + y1) * 3;
			int srcOffset2 = (x2 * srcWidth + y1) * 3;

			buf[dstOffset + 0] = w0 * src[srcOffset1] + w1 * src[srcOffset1 + 3] + w2 * src[srcOffset2] + w3 * src[srcOffset2 + 3];     //B
			buf[dstOffset + 1] = w0 * src[srcOffset1+1] + w1 * src[srcOffset1 + 4] + w2 * src[srcOffset2+1] + w3 * src[srcOffset2 + 4]; //G
			buf[dstOffset + 2] = w0 * src[srcOffset1+2] + w1 * src[srcOffset1 + 5] + w2 * src[srcOffset2+2] + w3 * src[srcOffset2 + 5]; //R
		}
	}

	return buf;
}

运行示例:

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

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

	uint8_t *scale = Scale(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);

	cvWaitKey();
	return 0;
}

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

© 著作权归作者所有

共有 人打赏支持
t
粉丝 1
博文 65
码字总数 17440
作品 0
武汉
程序员
私信 提问
常用的像素操作算法:Resize、Flip、Rotate

Resize 图像缩放是把原图像按照目标尺寸放大或者缩小,是图像处理的一种。 图像缩放有多种算法。最为简单的是最临近插值算法,它是根据原图像和目标图像的尺寸,计算缩放的比例,然后根据缩放...

fengzhizi715
2017/12/14
0
0
OpenCV尺寸调整函数resize

src:输入,原图像,即待改变大小的图像; dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已; dsize:输出图像的大小。如果这个参数不为0,那么...

OceanStar
2018/08/30
0
0
【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)

实验要求 (1.a) 编写一个以2 的幂次方将给定图像的灰度级数从256 减少到2 的程序。图像的灰度级数以参数变量的形式传递到所编写的程序中。 (1.b) 使用图2.21(a) 以(1.a)中编写的程序生成图2...

u013165921
2018/01/14
0
0
5- OpenCV+TensorFlow 入门人工智能图像处理-图片的几何变换(一)

图片的几何变换 图片的几何变换章节介绍 图片位移 & 图片缩放 图片剪切 & 图片镜像 图片仿射变换 Hog + Svm 小狮子识别 计算机视觉的基础: 裁剪样本为64,128 等比例缩放 仿射变换: 位移,旋转...

天涯明月笙
2018/04/19
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

撒网要见鱼
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
7
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部