图像的缩放之c++实现(qt + 不调包)

1.基本原理

   图像的缩放一般使用插值算法,而本章将介绍两种常用插值算法:最临近插值法和双线性插值法

   1.最临近插值法

    将浮点数的位置坐标,进行四舍五入找到原图像的整型坐标即可,具体操作可见下面的公式,其中原图像坐标为(x, y),输出图像坐标为(i,j),比例系数为fx和fy。

    2.双线性插值法

     浮点数的位置坐标是由周围四个像素点来确定。具体公式可见下面,其中浮点数周围四个像素点的像素值分别为T1、T2、T3和T4,u和v分别表示浮点坐标距离左上角的横坐标差值和纵坐标差值。

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

/*图像的缩放函数(最临近插值法),fx为水平缩放系数,fy为垂直缩放系数*/
QImage* MainWindow::ZoomNormal(QImage* image,double fx,double fy)
{unsigned int OutWidth = (unsigned int)(image->width() * fx + 0.5);unsigned int OutHeight = (unsigned int)(image->height() * fy + 0.5);QImage* newImage = new QImage(OutWidth, OutHeight ,QImage::Format_ARGB32);unsigned char* copyPixel = NULL;unsigned char* objPixel = NULL;int x = 0;int y = 0;long tempY;long tempJ;for (unsigned int  j = 0; j < OutHeight; j++){y = (int) (j / fy + 0.5);if (y >= image->height()){y --;}tempY = y * image->width() * 4;tempJ = j * OutWidth * 4;for(unsigned int i =0; i < OutWidth; i++){x = (int)(i / fx + 0.5);if (x >= image->width()){x --;}copyPixel = image->bits() + tempY + x * 4;objPixel = newImage->bits() + tempJ + i *4;memcpy(objPixel,copyPixel,4);}}return newImage;
}/*图像的缩放函数(双线性差值法),fx为水平缩放系数,fy为垂直缩放系数*/
QImage* MainWindow::ZooInterpolation(QImage* image,double fx,double fy)
{unsigned int OutWidth = (unsigned int)(image->width() * fx +0.5);unsigned int OutHeight = (unsigned int)(image->height() * fy +0.5 );QImage* newImage = new QImage(OutWidth, OutHeight ,QImage::Format_ARGB32);double  x = 0;double  y = 0;int r,g,b;for (unsigned int  j = 0; j < OutHeight- fy; j++) //    最后一行会溢出,所以去掉{y = j / fy  ;for(unsigned int i =0; i < OutWidth; i++){x = i / fx ;int x1, x2, y1, y2;x1= ( int)x;x2 = x1 + 1;y1 = ( int)y;y2 = y1 + 1;QColor oldcolor1;QColor oldcolor2;QColor oldcolor3;QColor oldcolor4;double u, v;u = x - x1;v = y - y1;if ((x >=image->width() - 1 ) && (y >=image->height() - 1 )){oldcolor1 = QColor(image->pixel(x1,y1));r = oldcolor1.red();g = oldcolor1.green();b = oldcolor1.blue();}else if (x >= image->width() - 1){oldcolor1 = QColor(image->pixel(x1,y1));oldcolor3 = QColor(image->pixel(x1,y2));r = oldcolor1.red() * (1 - v) + oldcolor3.red() * v;g = oldcolor1.green() * (1 - v) + oldcolor3.green() * v;b = oldcolor1.blue() * (1 - v) + oldcolor3.blue() * v;}else if (x >=image->height() - 1){oldcolor1 = QColor(image->pixel(x1,y1));oldcolor2 = QColor(image->pixel(x2,y1));r = oldcolor1.red() * (1 - u) + oldcolor2.red() * u;g = oldcolor1.green() * (1 - u) + oldcolor2.green() * u;b = oldcolor1.blue() * (1 - u) + oldcolor2.blue() * u;}else{oldcolor1 = QColor(image->pixel(x1,y1));oldcolor2 = QColor(image->pixel(x2,y1));oldcolor3 = QColor(image->pixel(x1,y2));oldcolor4 = QColor(image->pixel(x2,y2));int r1,g1,b1;r = oldcolor1.red() * (1 - u) + oldcolor2.red() * u;g = oldcolor1.green() * (1 - u) + oldcolor2.green() * u;b = oldcolor1.blue() * (1 - u) + oldcolor2.blue() * u;r1 = oldcolor3.red() * (1 - u) + oldcolor4.red() * u;g1 = oldcolor3.green() * (1 - u) + oldcolor4.green() * u;b1 = oldcolor3.blue() * (1 - u) + oldcolor4.blue() * u;r = r * (1 - v) + r1 * v;g = g * (1 - v) + g1 * v;b = b * (1 - v) + b1 * v;}newImage->setPixel(i, j, qRgb(r, g, b));}}return newImage;
}

3.参考资料

    数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js2+Cesium1.103.0 八、动态光墙效果

Vue.js2Cesium1.103.0 八、动态光墙效果 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ import /utils/dynamicWallMaterialProperty.js exp…

Windows下批处理删除文件

最近我使用Maven的时候会出现下载jar包不成功的现象&#xff0c;然后需要把它删除然后重新下载&#xff0c;但是有时候文件过多&#xff0c;一个个删除太花费时间&#xff0c;所以用bat的批处理会很舒服。 bat的语法我之前没遇到过&#xff0c;然后我是边学习边试验&#xff0…

简单程度与自负是否相关?探索STM32的学习价值

事实上&#xff0c;无论STM32是否简单并不重要&#xff0c;更重要的是我们能通过学习STM32获得什么。通过STM32&#xff0c;我们可以学习到许多知识&#xff1a;如果我们制作一个键盘或鼠标&#xff0c;我们可以学习USB协议。如果我们制作一个联网设备&#xff0c;我们需要学习…

Go http.Handle和http.HandleFunc的路由问题

Golang的net/http包提供了原生的http服务&#xff0c;其中http.Handle和http.HandleFunc是两个重要的路由函数。 1. 函数介绍 http.HandleFunc和http.Handle的函数原型如下&#xff0c;其中DefaultServeMux是http包提供的一个默认的路由选择器。 func HandleFunc(pattern st…

SpringBoot 全局异常处理进阶

待总结 参考文章&#xff1a; SpringBoot 全局异常处理进阶&#xff1a;使用 ControllerAdvice 对不同的 Controller 分别捕获异常并处理 SpringBoot 对 controller 层捕获全局异常并处理的方法&#xff08;ControllerAdvice 和 ExceptionHandler&#xff09; 注解RestCont…

Docker启动一个Centos镜像

搜索可用的centos的docker镜像 docker search <image>&#xff1a;在docker index中搜索imagedocker search centos 下载centos镜像&#xff08;拉取镜像&#xff09; docker pull centos:latest查看镜像docker images&#xff1a;列出imagesdocker images -a&#xff…

激光与光电子学进展, 2023 | 非视域成像技术研究进展

注1&#xff1a;本文系“计算成像最新论文速览”系列之一&#xff0c;致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论…

OpenCV(三)——图像分割(三)

目录 6.区域生长算法 6.1 区域生长概要 6.2 区域生长原理 7.分水岭算法 7.1 分水岭算法概要

stm32 cubemx can通讯(1)回环模式

文章目录 前言一、cubemx配置二、代码1.过滤器的配置&#xff08;后续会介绍&#xff09;2.main.c3.主循环 总结 前言 介绍使用stm32cubemx来配置can&#xff0c;本节讲解一个简答&#xff0c;不需要stm32的can和外部连接&#xff0c;直接可以用于验证的回环模式。 所谓回环模…

Mysql按小时进行分组统计数据

目录 前言 按1小时分组统计 按2小时分组统计 按X小时分组统计 前言 统计数据时这种是最常见的需求场景&#xff0c;今天写需求时发现按2小时进行分组统计也特别简单&#xff0c;特此记录下。 按1小时分组统计 sql&#xff1a; select hour(pass_time) …

【MySQL】使用C++连接数据库

目录 前置工作代码常用函数接口整体示例&#xff1a; 前置工作 创建数据库并选中 mysql> create database conn; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema…

安卓SDK开发的一些疑问

目前&#xff0c;公司需要开发一套iOS和安卓的sdk&#xff0c;主要包含蓝牙管理、网络请求、倒计时等方案执行、蓝牙数据交互等功能。之前没有过开发安卓sdk的经历&#xff0c;写个笔记用以记录。 现在iOS sdk已经写了一部分&#xff0c;安卓开发我也习惯从iOS的角度类比来开发…

灵眸:2023年上半年中国主要消费领域宏观数据概览报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 2023年上半年中国社会消费品零售总额22.8万化元。2023年上半年中国电商实体商品消费总额达6.1万亿元&#xff0c;同比增长10.8%。2023年上半年中国餐饮、汽车消费均超2万化元&#xff0c;餐饮、金银珠…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时&#xff0c;殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间&#xff0c;不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息&#xff0c;而这一切我们却毫不知情。这是一种网络上常见的“中间…

Mysql整理

一、基础概念 1. 索引 之前的文章已经写过了&#xff0c;比较细 数据库索引含义,类别,用法,创建方式_表结构加树形id和索引是为什么_马丁•路德•王的博客-CSDN博客 简单概括就是在表的某个列或者多个列或者联合表的时候加个索引&#xff0c;类似图书馆书本的索引编号&…

PK Nounique CASCADE DROP INDEX keep index

Explicit Control Over Indexes when Creating, Disabling, or Dropping PK/Unique Constraints (Doc ID 139666.1)​编辑To Bottom PURPOSEIn Oracle 9i, the DBA has an explicit control over how indexes are affectedwhile creating, disabling, or dropping Primary Ke…

AI Deep Reinforcement Learning Autonomous Driving(深度强化学习自动驾驶)

AI Deep Reinforcement Learning Autonomous Driving&#xff08;深度强化学习自动驾驶&#xff09; 背景介绍研究背景研究目的及意义项目设计内容算法介绍马尔可夫链及马尔可夫决策过程强化学习神经网络 仿真平台OpenAI gymTorcs配置GTA5 参数选择行动空间奖励函数 环境及软件…

数据结构与算法-排序

目录 数据结构与算法 为什么要学习数据结构和算法? 常见的数据结构 常用算法

【雕爷学编程】Arduino动手做(13)---TTP223B电容式触摸模块之通过串口监视器检测电容触摸键的状态与控制继电器

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

【OS】请问,一个需要运行内存10GB的游戏,可以运行在32位物理内存为64GB的电脑上吗?

答案&#xff1a; 可以 解释 操作系统虽然是32位&#xff0c;限制了电脑的虚拟内存最大值为 4GB。如果&#xff0c;电脑开启了虚拟内存&#xff0c;则该款10GB运存的游戏是不可能开启的。期望开启这款游戏的做法是&#xff0c;在这个物理内存为64GB的电脑上关闭虚拟内存机制&…