首页 > 编程语言 >qt图像算法—图像的缩放之c++实现(不调包)

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

时间:2024-10-20 15:20:11浏览次数:3  
标签:QColor 缩放 int image unsigned 调包 oldcolor1 图像 y1

 1.基本原理

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

   1.最临近插值法

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

dc3b566e65febe8c150902969ec9f634.png

0d3153f912eee2ada000a5c71cd4e021.png

    2.双线性插值法

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

86b15bc2b4862084368769995b36974a.png

1b5e93bed0494f7be64a5e1f4d491bc2.png

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.项目源码下载:
整套算法系列:
https://blog.csdn.net/u013289254/category_12811658.html?spm=1001.2014.3001.5482icon-default.png?t=O83Ahttps://blog.csdn.net/u013289254/category_12811658.html?spm=1001.2014.3001.5482项目源码下载地址:关注WX【AI街潜水的八角】,回复【qt图像算法】即可下载

整套项目源码内容包含

[1].根据算法原理,编写纯c++源码,不调用外源库opencv 等;
[2].包括各种图像处理的基本算法,包含腐蚀膨胀,缩放,转置,镜像,平移,均衡变化,灰度拉升,灰度阈值,灰度非线性,转灰度,灰度线性,旋转,简单平滑,高斯平滑,轮廓跟踪,种子算法,hough直线检测,拉普拉斯,带方向边缘检测,常规边缘检测(梯度算子、Roberts算子和Sobel算子),中值滤波,反色操作等;
[3].程序中有完整的注释,便于大家很好理解代码。

标签:QColor,缩放,int,image,unsigned,调包,oldcolor1,图像,y1
From: https://blog.csdn.net/u013289254/article/details/143079819

相关文章

  • qt图像算法—图像的种子算法之c++实现(不调包)
     1.基本原理  相互连通且颜色相近的像素集合可以被看成图像的区域,而区域填充就是将每一块图像区域用指定颜色填充,填充的算法有很多种,但今天的猪脚是种子算法。在使用种子算法的时候,我们要注意两点,第一点:连通像素的搜索分为四方向和八方向,根据应用自己选择就行;第二点:边界......
  • 仅十亿参数!AI图像生成模型Meissonic AI在手机上就能生成高质量图像
    最近,科研团队联合推出了一款名为Meissonic的开源AI图像生成模型。惊喜的是,这款模型仅使用了十亿个参数,却能生成高质量的图像。这种紧凑的设计让Meissonic有潜力在移动设备上实现本地化的文本转图像应用。这项技术的背后,研发团队包括阿里巴巴、SkyworkAI以及多所大......
  • YOLOv11改进策略【卷积层】| ECCV-2024 Histogram Transformer 直方图自注意力 适用于
    一、本文介绍本文记录的是利用直方图自注意力优化YOLOv11的目标检测方法研究。在目标检测任务中,清晰准确的图像对于目标检测至关重要,本文创新方法通过恢复图像质量,可以减少因图像质量低导致的误检和漏检,实现有效涨点。专栏目录:YOLOv11改进目录一览|涉及卷积层、轻量化......
  • 基于双路神经网络的滚动轴承故障诊断融合了原始振动信号 和 二维信号时频图像 的多输
    基于双路神经网络的滚动轴承故障诊断融合了原始振动信号和二维信号时频图像的多输入(多通道)故障诊断方法单路和双路都可时频图像算法可选小波变换,短时傅里叶变换,马尔可夫变迁场,格拉姆角场,S变换,递归图,灰度图等基于双路神经网络的滚动轴承故障诊断融合了原始振动信号和......
  • Qt中使用DXGI截取桌面图像
    文章目录一、概要二、DXGI图像截取的实现步骤三、DXGI常用接口介绍1.D3D11CreateDevice接口参数说明D3D_DRIVER_TYPE常见类型D3D11CreateDevice函数的使用示例2.QueryInterface接口参数说明3.GetAdapter4.EnumOutputs5.DuplicateOutput代......
  • ai图像描摹的作用是什么
    ai图像描摹的作用是可以将图画中的简单线条进行裁剪出来,对于一些设计方面的素材提取非常的方便。Ai图像描摹可以基于纸上或另一图形程序中存储的栅格图像上绘制的铅笔素描创建图形。一、ai图像描摹的作用作用ai图像描摹的作用是可以将图画中的简单线条进行裁剪出来,对于一些......
  • 20241019医学图像的K空间
    空间频率:二维平面上明暗相间的条纹......
  • OpenCV图像处理——形态学操作
    1.形态学操作图像形态学操作:基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学。形态学有四个基本操作:膨胀、腐蚀、开、闭。2.膨胀与腐蚀2.1.膨胀跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的......
  • 【PS2024】编辑修改、图像制作、广告创意等 PS软件下载安装Adobe Photoshop
    目录一、软件简介1.1AdobePhotoshop概述1.2版本历史1.3系统要求二、下载与安装2.1下载方式2.2安装步骤三、功能介绍3.1基本图像编辑功能3.2高级图像处理功能3.3设计与排版功能四、操作指南4.1界面布局4.2常用快捷键4.3操作技巧一、软件简介1.1......
  • 26备战秋招day8——基于cifar10的diffusion图像生成
    博客标题:扩散模型入门与实战:基于CIFAR-10的数据生成引言扩散模型(DiffusionModel)是生成式模型中的一种新兴方法,近年来广泛应用于图像生成领域。与生成对抗网络(GAN)和变分自编码器(VAE)等模型不同,扩散模型通过模拟数据的随机扩散过程,逐步将噪声添加到数据中,最终生成出高质量......