图像的缩放之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.hqwc.cn/news/60293.html

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

相关文章

Java培训出来的好找工作吗?能拿多少工资?

作为编程界“泰斗”级别的语言&#xff0c;Java进可攻前端、后可守后端&#xff0c;还是很受市场青睐的&#xff0c;那为什么很多程序员抱怨太卷了&#xff0c;找工作难&#xff1f;这其实是企业业务需求的原因&#xff0c;产品更新、迭代速度极快&#xff0c;企业需要的是“来…

贝叶斯深度学习的温和介绍

一、说明 欢迎来到令人兴奋的概率编程世界&#xff01;本文是对这个领域的温和介绍&#xff0c;你只需要对深度学习和贝叶斯统计有一个基本的了解。如果像我一样&#xff0c;你听说过贝叶斯深度学习&#xff0c;并且你猜它涉及贝叶斯统计&#xff0c;但你不知道它是如何使用的&…

现代C++中的从头开始深度学习【1/8】:基础知识

一、说明 提及机器学习框架与研究和工业的相关性。现在很少有项目不使用Google TensorFlow或Meta PyTorch&#xff0c;在于它们的可扩展性和灵活性。也就是说&#xff0c;花时间从头开始编码机器学习算法似乎违反直觉&#xff0c;即没有任何基本框架。然而&#xff0c;事实并非…

汽车及汽车零部件行业云MES解决方案

汽配行业现状&#xff1a; 随着经济全球化进程加快&#xff0c;一直走在智能化改造&#xff0c;数字化转型前沿的汽车行业企业&#xff0c;面临的信息化需求也日益增加&#xff0c;不管德系&#xff0c;美系还是日系供应链的各大厂商&#xff0c;均将企业信息化&#xff0c;数字…

HTTP代理与HTTPS代理请求的方式揭秘

今天&#xff0c;我们要一起来揭秘HTTP代理与HTTPS代理请求的方式&#xff0c;帮助大家更好地理解和使用这两种代理。我们将分析它们的不同之处&#xff0c;并提供一些实际的例子和操作经验&#xff0c;让你轻松玩转网络请求&#xff01; HTTP代理请求方式&#xff1a; HTTP代…

linux程序保护机制gcc编译选项

预备知识&#xff1a; 计算机内存的结构通常包括以下几个主要部分&#xff1a; 1.代码段(Code Segment)&#xff1a;也称为文本段&#xff0c;存储程序的可执行指令。代码段是被标记为可执行的&#xff0c;程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…

AD19 基础应用技巧(PCB设置快捷键)

众所周知&#xff0c;学会一个软件的快捷键操作可以大大提高我们的工作效率。 那么&#xff0c;Altium Designer软件如何设置快捷键&#xff1f; 以设置走线/放置过孔为例。 菜单栏 - 【放置】- 然后【Ctrl 鼠标左键 单击过孔】进入【Edit Command】界面。 在快捷方式一栏…

发布属于自己的 npm 包

1 创建文件夹&#xff0c;并创建 index.js 在文件中声明函数&#xff0c;使用module.exports 导出 2 npm 初始化工具包&#xff0c;package.json 填写包的信息&#xff08;包的名字是唯一的&#xff09; npm init 可在这里写包的名字&#xff0c;或者一路按回车&#xff0c;后…

让三驾马车奔腾:华为如何推动空间智能化发展?

上个月&#xff0c;国务院常务会议审议通过了《关于促进家居消费的若干措施》&#xff0c;其中明确提出了“推动单品智能向全屋智能发展创新培育智能消费”“开展数字家庭建设试点”等推动全屋智能拼配发展的建议与方案。 可以说&#xff0c;以整屋为单位的空间智能品类&#x…

harbor搭建

回到目录 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务 通俗的讲&#xff0c;harbor是一个私人镜像存储服务器 1 下载安装 进入官网&#xff0c;下载一个离线安装包,harbor官网下载 这…

用AI工具生成短视频大片,1分钟详细教程教会你

Hi! 大家好&#xff0c;我是专注于AI项目实战的赤辰&#xff0c; 今天我要跟大家分享如何用AI工具1分钟内生成一个短视频大片&#xff0c;效果完全不输影视大V。 只需要用一句话就可以生成视频&#xff0c;或者用一张图就能生成视频&#xff0c;这就是最新推出的AI工具Pika L…

论文研读-SIMD系列-基于分区的SIMD处理及在列存数据库系统中的应用

基于分区的SIMD处理及在列存数据库系统中的应用 单指令多数据&#xff08;SIMD&#xff09;范式称为列存数据库系统中优化查询处理的核心原则。到目前为止&#xff0c;只有LOAD/STORE指令被认为足够高效&#xff0c;可以实现预期的加速&#xff0c;并且认为需要尽可能避免GATHE…