图像缩放算法及速度优化——(一)最近邻插值

C++图像缩放实战:从零实现最近邻与双线性插值算法 图像缩放是计算机视觉和图形处理中的基础操作,其核心原理是坐标映射与像素重采样。通过建立源图像与目标图像之间的几何对应关系,并利用插值算法计算新像素值,可以实现尺寸变换。最近邻插值算法速度极快,直接取最近像素,但会产生锯齿;双线性插值则通过周围四个像素的加权平均实现平滑过渡,在速度与质量间取得平衡。这两种经典算法在嵌入式系统、游戏开发、计算机视觉预处理等场景中具有重要工程价值。本文以C++实战为例,深入剖析了图像缩放中坐标映射、边界处理及性能优化的关键技术细节,为开发高性能图像处理组件提供了完整解决方案。 阅读详情

第0节 简介

 

  图像缩放算法是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。OpenCV中的Resize() 函数非常方便而且效率非常高。下面是OPENCV提供的cvResize函数原型。

复制代码
/****************************************************************************************************/
图像大小变换 
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
src 
输入图像. 
dst 
输出图像. 
interpolation 
插值方法: 
CV_INTER_NN - 最近邻插值, 
CV_INTER_LINEAR - 双线性插值 (缺省使用) 
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法.. 
CV_INTER_CUBIC - 立方插值. 
函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.
/****************************************************************************************************/
复制代码

  相信使用过Opencv的朋友都知道如何使用此函数。下面根据我自己的理解,用VC++ 来实现图像缩放算法 ,希望大家能从中理解图像缩放算法的原理。

 


第1节 最近邻插值

 

  最简单的图像缩放算法就是最近邻插值。顾名思义,就是将目标图像各点的像素值设为源图像中与其最近的点。假设源图像的宽度和高度分别为w0和h0, 缩放后的目标图像的宽度和高度分别为w1和h1, 那么比例就是float fw = float(w0)/w1; float fh = float(h0)/h1; 对于目标图像中的(x,y)点坐标对应着源图像中的(x0, y0)点。其中:x0 = int(x*fw), y0 = int(y*fh)。

  示例1:现在将一张670*503的BMP图像缩放到200*160,代码和效果如下。

复制代码
void ResizeNear01(CImage &src, CImage &dst)
{
    int w0 = src.GetWidth();
    int h0 = src.GetHeight();

    int w1 = dst.GetWidth();
    int h1 = dst.GetHeight();

    float fw = float(w0) / w1;
    float fh = float(h0) / h1;

    int x0, y0;
    for(int y=0; y<h1; y++)
    {
        y0 = int(y * fh);
        for(int x=0; x<w1; x++)
        {
            x0 = int(x * fw);
            dst.SetPixel(x, y, src.GetPixel(x0, y0));
        }
    }
}
复制代码

分析:对于此程序,我们将执行此ResizeNear01函数的语句加上一个for循环,使其执行100次,看它的速度怎么样。

复制代码
#include <time.h>
void CResizeDemoDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    CImage src, dst;
    src.Load(L"d:\\1.bmp");
    dst.Create(200, 160, 24);

    clock_t start = clock();
    for(int i=0; i<100; i++)
    {
        ResizeNear01(src, dst);
    }
    float end = float(clock() - start)/CLOCKS_PER_SEC;
    CString str;
    str.Format(L"%6.2f", end);
    MessageBox(str);


    dst.Save(L"d:\\rs.jpg");
}
复制代码

  显示程序执行所用的时间为20.59秒,平均一次需要0.2秒,看起来速度还可以,是因为时间复杂度较低。目标图像的尺寸大小是200*160。


  示例2:示例1中的算法可以改进速度的地方有两个。第一,因为最近邻插值算法求源图像中的坐标是固定的,可以把每个目标每个x和每个y对应的值通过一次循环先求出来,再利进入双重循环。第二,使用指针效率更高,如果使用CImage提供的GetPixel和SetPixel是费时间的。

  

复制代码
//优化后的最近邻插值算法
void ResizeNear02(CImage &src, CImage &dst)
{
    int w0 = src.GetWidth();
    int h0 = src.GetHeight();
    int pitch0 = src.GetPitch();

    int w1 = dst.GetWidth();
    int h1 = dst.GetHeight();
    int pitch1 = dst.GetPitch();

    float fw = float(w0) / w1;
    float fh = float(h0) / h1;

    int *arr_x = new int[w1];
    int *arr_y = new int[h1];
    for(int y=0; y<h1; y++)
    {
        arr_y[y] = int(y*fh);
    }
    for(int x=0; x<w1; x++)
    {
        arr_x[x] = int(x*fw);
    }

    BYTE* pSrc = (BYTE*)src.GetBits();
    BYTE* pDst = (BYTE*)dst.GetBits();
    BYTE* p0, *p1;
    for(int y=0; y<h1; y++)
    {
        p0 = pSrc + pitch0 * arr_y[y];
        p1 = pDst + pitch1 * y;
        for(int x=0; x<w1; x++)
        {
            //dst.SetPixel(x, y, src.GetPixel(arr_x[x], arr_y[y]));
            memcpy(p1 + 3*x, p0 + arr_x[x]*3, 3);
        }
    }

    delete []arr_x;
    delete []arr_y;
}
复制代码

  同样执行示例1中的测试程序,让ResizeNear02也循环一百次,在我机器上测试得到的结果是0.05秒,速度提高了400倍,这是一件多么让人兴奋的事情啊。
本人接触图像处理虽然也快一年了,但还是新手,望大家多多指正。

原文网址: http://www.cnblogs.com/sdlypyzq/archive/2012/03/02/2375072.html
VS2010(MFC)图片缩放显示 用Visual Studio2010将小图片拉伸显示,适合登陆界面,并且有详细说明 立即下载

相关推荐

gnuradio+b210实现FM收音机

gnuradio+b210实现FM收音机环境介绍FM接收1 Flow Graph2 变量参数FM发射1 Flow Graph 环境介绍 Name Version gnuradio 3.7.14.0 uhd 3.15.0.0 ubuntu 18.04 usrp b210 参考 https://www.ijedr.org/papers/IJEDR1702038.pdf Audio File Transmission using GNURADIO and USRP FM接

u011745228的博客 5124

在VC++中使用CxImage库读写图像实现像素操作

最近做了一个项目最后要把算法整成C++的DLL方式给别人调用,朋友给我推荐了用CxImage这个库来读写图像文件,所以我就用了,基于CxImage做了调用算法的Demo程序,已经给别人测试了,现在总结一下CxImage使用中遇到的那些坑。坑一:我是VS2015上面用CxImage这个库的,而且是别人已经编译好的LIB与头文件直接给我了,他还是VC6.0上...

weixin_33719619的博客 449

PX4 磁罗盘干扰分析

无人机上的电机电流会干扰无人机上搭载的磁罗盘,PX4官方提供了一些方式,通过分析飞行日志,判断电机是否对磁罗盘有严重影响。

Zecet的博客 3357

C++图像缩放

VC++中自带的图像缩放函数两个: 1、 BOOL StretchBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); 2、 int StretchDIBits(

1万+

银河麒麟V10开机卡Logo?别慌,手把手教你进单用户模式修复(附详细命令)

本文详细解析银河麒麟V10操作系统启动时卡Logo的故障原因,并提供进入单用户模式的完整解决方案。通过GRUB引导菜单修改启动参数,执行文件系统检查、图形服务修复等关键命令,帮助用户快速恢复系统正常运行,适用于运维人员和普通用户应对紧急启动问题。

weixin_30522183的博客 391

AI训练加速30%!用numactl玩转多显卡绑核的隐藏技巧

本文深入探讨了如何利用Linux系统的numactl工具,通过精确的NUMA绑核策略优化多GPU AI训练性能。文章详细解析了NUMA架构对性能的影响,提供了从拓扑探查、命令实战到多卡脚本化部署的完整指南,并分享了性能验证与常见陷阱,帮助开发者实现高达30%的训练加速。

web99的专栏 448

图像处理与机器视觉_第三篇

图像的几何变换

qq_56942034的博客 1731

【WILEY】从Revision到Online:逐层拆解投稿状态更新与关键文件提交实战

本文详细解析了学术论文从返修到在线发表的全过程,重点拆解了投稿系统状态更新背后的含义与应对策略。文章提供了返修稿与回复信的准备技巧、关键补充文件(如图文摘要)的提交要点,并分享了校对校样与处理出版协议的实战经验,帮助作者高效、专业地完成发表流程。

weixin_29209805的博客 711

最近邻插值算法java代码_图像缩放算法及速度优化——(一)最近邻插值

第0节 简介图像缩放算法是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。OpenCV中的Resize() 函数非常方便而且效率非常高。下面是OPENCV提供的cvResize函数原型。/*******************************************************************************...

weixin_34688479的博客 767

2023-2024深度学习框架之争——选pytorch还是tensorflow?

深度学习是人工智能领域的一个重要分支,它利用多层神经网络来模拟人类的学习和推理能力,解决各种复杂的问题,如图像识别、自然语言处理、语音识别、推荐系统等。深度学习框架是一种软件工具,它提供了构建、训练、测试和部署深度学习模型的便利,使得开发者和研究者可以更高效地进行深度学习的开发和应用。目前,市场上有许多不同的深度学习框架,如PyTorch、TensorFlow、Keras、MXNet、Caffe2等,它们各有优劣,适用于不同的场景和需求。

flchen_nchu的博客 6752

OpenHarmony AI系列:神经网络处理单元(NPU)驱动架构与实现详解

NPU(Neural Processing Unit,神经网络处理单元)是专门为神经网络计算设计的硬件加速器。在OpenHarmony系统中,NPU驱动是通过NNRT(Neural Network Runtime,神经网络运行时)框架实现的,它作为中间桥梁连接上层AI推理框架和底层NPU硬件,实现AI模型的跨芯片推理计算。

m0_67505153的博客 665

图像缩放算法及速度优化

原文来自:博客园 小欣子 图像缩放算法及速度优化——(一)最近邻插值 图像缩放算法及速度优化——(二)双线性插值 ————————————————————以下为原文—————————————————— 第0节 简介   图像缩放算法是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。OpenCV中的Resize() 函数非常方便

Luke的专栏 6289

LDO参数解读、特性、参考设计

目录 一、工作原理 二、基本参数解释 三、LDO的一些特性 1、输出自放电 2、软启动 3、LDO效率 4、动态负载调整(∆VOUT) 5、线性瞬态响应 6、压差(Dropout Voltage) 四、参考设计 1、输入输出电容选择 2、Layout参考 一、工作原理 LDO是Low Dropout Regulator的缩写,意思是低压差线性稳压器,下面是LDO的内部框图,大致的工作原理就是:参考电压Vref和反馈电压FB(VOUT通过两个电阻分压)分别接在误差放大器的反向和正向

记得诚 1万+

图像缩放算法终极对比:最近邻 vs 双线性插值,哪个才是你的菜?(附FPGA硬件实现秘诀)

图像缩放算法对比:最近邻与双线性插值 本文深入对比两种常用图像缩放算法: 最近邻插值 - 速度最快但质量较差,适合实时处理 双线性插值 - 速度与质量的平衡,通用性最佳 文章涵盖: 图像缩放的基础概念与数学原理 两种算法的核心差异与实现细节 实际应用场景与性能对比 FPGA硬件实现的优化技巧 通过分析坐标映射、插值计算等关键环节,帮助开发者根据质量与速度需求选择合适算法。文末提供扩展学习资源,包括OpenCV源码分析、FPGA实现经验等专业参考资料。

weixin_44413306的博客 1238

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用cuda加速图像缩放的例子

一、前言 本文主要讲解了cuda并行加速的一个小例子,对图像缩放的最近邻插值算法做加速。 二、代码实现 由于进行缩放时,每个新像素点的计算方法均一致,故可使用并行计算,opencv中的resize也是这么做的。 //main.cu//// #include "cuda_runtime.h" #include #include #include #include #incl

AP1005834的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

插值

图像缩放算法是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。OpenCV中的Resize() 函数非常方便而且效率非常高。下面是OPENCV提供的cvResize函数原型。 /*****************************************************************************

shirley的专栏 915

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenCV的resize函数优化

背景 在使用OpenCV做图像处理的时候,最常见的问题是c++版本性能不足,以resize函数为例来说明,将size为[864,1323,3]的函数缩小一半: Mat img0; gettimeofday(&t4, NULL); cv::resize(source, img0, cv::Size(cols_out,rows_out)); gettimeofday(&...

gaussrieman123的博客 8685

LabVIEW图像缩放算法实战:从插值原理到性能优化

图像重采样是计算机视觉与图像处理中的基础技术,其核心在于通过插值算法解决源图像与目标图像像素网格不对应的问题。常见的插值方法包括计算速度最快的最近邻插值、在速度与质量间取得平衡的双线性插值,以及能更好保持边缘锐利度的双三次插值。这些算法的选择直接影响后续特征提取、定位与测量的精度,是保证机器视觉系统可靠性的关键技术。在工业自动化检测、视觉引导等高实时性要求的应用场景中,工程师需结合图像金字塔、内存复用等工程优化手段,在LabVIEW等开发平台上实现高效的图像预处理流程。本文聚焦LabVIEW视觉开发模块,深

weixin_29047545的博客 263

OpenCV图像缩放实战:5大插值算法性能对比与应用指南

本文深入探讨了OpenCV图像缩放中的5大插值算法,包括最近邻、双线性、双三次、区域插值和Lanczos插值,详细分析了它们的性能差异和应用场景。通过实际测试数据对比,提供了针对不同需求的算法选择策略和优化技巧,帮助开发者在图像处理项目中实现最佳效果。

pz8901234的博客 645

如何选择合适的图像插值算法?nfnt/resize性能对比与最佳实践指南

在图像处理开发中,选择合适的**图像插值算法**对处理质量和性能至关重要。nfnt/resize 是一个纯Go语言实现的图像缩放库,提供了六种不同的插值算法,从最简单的最近邻插值到复杂的Lanczos重采样。本文将详细介绍这些算法的性能对比、适用场景和最佳实践,帮助您做出明智的选择。😊 ## 🔍 图像插值算法基础 **图像插值算法**是图像缩放的核心技术,它决定了如何根据原始像素计算新像素

gitblog_01059的博客 857

c语言通过像素值重建图像,Image Scaling

在图像处理技术中,图像缩放是一个比较常见和简单的算法。虽然说简单,但是如果要做到效果好而且速度快还是有一定难度的。最近有涉及到图像缩放的东西,对一些常用的算法进行一些简单的介绍和总结。在移动上平台上,一般拍照的分辨率都非常大,要对拍照后的图像进行处理则非常耗时,一般需要进行下采样。如果下采样质量较差则会影响后处理的效果,所以要采用一种效率高和质量好的插值算法。最近邻插值最简单的一种算法,其思想是通...

weixin_32421193的博客 424

smartcrop性能优化指南:如何快速提升大图片处理速度

smartcrop是一款高效的图像裁剪工具,能够为任意尺寸的图片找到最佳裁剪区域。在处理大图片时,优化性能可以显著提升处理速度,让你在短时间内获得高质量的裁剪结果。本文将分享几个实用的smartcrop性能优化技巧,帮助你轻松应对大图片处理挑战。 ## 一、启用预缩放功能减少计算量 预缩放是提升smartcrop处理速度的关键技巧之一。通过在分析前缩小图片尺寸,可以大幅减少后续的计算量。在sm

gitblog_00106的博客 372

深度学习篇---图像缩放与分辨率处理

图像缩放是深度学习预处理的关键步骤,通过调整图像尺寸让AI模型高效处理视觉信息。下采样(缩小)用于捕捉整体特征,上采样(放大)则恢复细节。常用224×224等标准尺寸,采用双线性插值等方法保持质量。需注意长宽比处理(填充/裁剪)避免变形,配合归一化和数据增强提升效果。不同任务有最佳尺寸选择(如分类224px、检测608px),需平衡分辨率、精度和计算成本。未来趋势包括动态分辨率、神经缩放等智能优化。核心原则是根据任务需求选择合适缩放策略,使AI看得清关键信息。

在你不想做的时候,正是应该做的时候。 977
上一篇: vs2008读取位图
下一篇: 图像缩放算法及速度优化——(二)双线性插值
willian0621
博客等级 码龄17年 50粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值