图像算法的工程优化技术 您所在的位置:网站首页 图像算法股票有哪些 图像算法的工程优化技术

图像算法的工程优化技术

2024-07-16 12:49| 来源: 网络整理| 查看: 265

图像算法的工程优化技术

当一个很酷的图像算法实现之后,我们希望集成到软件中去,这时将会遇到最大的拦路虎:性能。 Origin 可以想像一下,如果美图秀秀做一个美颜效果要转圈圈转个30秒,还会有多少人用呢。 学术界喜欢推出复杂度更低的算法,去解决性能问题,而在实际工程应用中,对代码的优化和硬件的良好运用效果来得更快更显著,这里就对不改动算法,纯工程方面做性能优化的技术作一个简介。 opt

流程优化——节能减排

对初始的算法代码进行优化,减少不必要的计算步骤,合理安排循环位置,减少过度的函数调用,尽可能保证内存访问连续等等,统称流程优化。

普适性:5 这个一般是进行工程性优化的第一步骤,即使找不到可优化的流程,也要分析出来性能瓶颈来,可以在什么地方进一步优化。

有效性:2 原来的代码写得越差,优化余地越大,但如果在一开始算法代码就是由资深软件工程师写的,就基本上没有什么优化余地了。

易用性:5 经验丰富的程序员,对慢代码有天然的敏感,并能够改造它,而资历尚浅的程序员,尽管看不出来代码的好坏,也可以去发现性能瓶颈。

图像反色的代码示例:

/*优化前代码*/ void reverse(Bitmap* src) { for (int y=0; yheight(); ++y) { for (int x=0; xwidth(); ++x) { /*每个像素都调函数,编译器无法优化*/ Color c = src->getColor(x, y); c.r = 0xFF - c.r; c.g = 0xFF - c.g; c.b = 0xFF - c.b; src->setColor(c, x, y); } } } /*优化后代码*/ /*针对RGBA格式的图像*/ void reverse(Bitmap* src) { int h = src->height(); int w = src->width(); const int bpp = 4;//每个像素所占字节 for (int y=0; ygetAddr(0, y); for (int x=0; xwidth()==src->width()); GLASSERT(dst->height()==src->height()); auto w = dst->width(); auto h = dst->height(); auto bpp = dst->bpp(); auto _dst = (unsigned char*)(dst->pixels()); auto _src = (unsigned char*)(src->pixels()); _run(_dst, _src, 0,0,w,h,bpp); }

采用C++11标准中的线程优化:

/*优化后*/ void GLBrightFilter::vFilter(GLBmp* dst, const GLBmp* src) const { //GPCLOCK; GLASSERT(NULL!=dst); GLASSERT(NULL!=src); GLASSERT(dst->width()==src->width()); GLASSERT(dst->height()==src->height()); auto w = dst->width(); auto h = dst->height(); auto bpp = dst->bpp(); auto _dst = (unsigned char*)(dst->pixels()); auto _src = (unsigned char*)(src->pixels()); if (h < 500) { _run(_dst, _src, 0,0,w,h,bpp); return; } int hunit = h /4; int hoffset[] = {0, hunit, 2*hunit,3*hunit, h}; std::vector queues; for (int i=0; ijoin(); delete t; } queues.clear(); }

这个例子中的优化有一个缺点,就是每次都要创建、销毁线程。进一步提升性能的方案是创建线程池,但这样的话线程池的管理就要费点脑筋。

OpenCL/CUDA/OpenGL——挖掘GPU

图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器。 由于GPU功能越来越强,加以GPU上编程的实现,人们开始使用GPU去执行一些原本跑在CPU上的算法,这就是所谓的GPGPU(前一个GP则表示通用目的General Purpose)。 要使用GPU进行通用计算,需要基于一个框架,目前的框架主要有 CUDA、OpenGL 和 OpenCL。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。这个架构只能在装配了NVIDIA显卡的机器上使用。 OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器。 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口,它主要用于图形渲染,但一些图像算法也可以使用它来完成。

普适性:3 平台方面:CUDA只适用于NVDIA的GPU,OpenCL在移动设备上目前还没有被完全支持,OpenGL一般设备都可使用。 算法方面:使用CUDA和OpenCL技术一般都要求算法能做到数据并行,OpenGL的使用条件更为苛刻,仅适用于可以像素级算法。

有效性:4 在PC、服务器上采用GPU优化,非常有效而且性能提升明显,动不动就是百千倍的效率增幅,但在手机上,这个效率就不高了,因为手机端内存带宽少而且GPU性能不那么强。手机上一般用到的只有OpenGL对图像滤镜的优化。

易用性:2 CUDA/OpenCL/OpenGL的编程都是大工程,幸运的是,有很多地方是可重用的,因此,它们有相应的框架/开源库支持,如使用GPU实现滤镜,有GPUImage,这使得开发难度下降不少。 尽管如此,要理解 GPU 和 CPU 的硬件差异和编程方式差异,还是需要一点功夫的(CPU编程是串行思维,GPU编程需要有数据并行思维)。而且,由于这些标准在不同设备上的支持程度不一样,也会有很多问题要解决。

图像反色在OpenGL的实现(仅写出片断着色器)

precision mediump float; varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; void main() { vec4 color = texture2D(inputImageTexture, textureCoordinate); gl_FragColor = vec4((vec3(1.0)-color.rgb), color.a); } 专用芯片

当算法足够重要时,值得为了它设计集成电路,添加新芯片。比如Jpeg图像格式的编解码算法,由于Jpeg格式应用非常广泛,一般做集成芯片的厂商都会加一块专业实现该算法的芯片。 数字信号处理器DSP(digital signal processor)是一种专用于(通常为实时的)数字信号处理的微处理器。 dsp

普适性:1 仅在有DSP芯片,或者对特定的算法,值得添加专用芯片去做时,可以采用。仅适用于开发集成芯片系统的技术人员使用,做第三方App的是用不了的。

有效性:5 绝大部分情况下,算法改成DSP或专业芯片特定实现,都可以极大提升性能。在有DSP处理器,或确实是很重要的算法,值得加芯片的话,就可实现。

易用性:1 既需要硬件人员设计电路,又需要软件人员去编写驱动,打通流程,实现难度最高,DSP上面的编程比在GPU上编程还困难。

参考资料

http://www.ruanyifeng.com/blog/2011/08/amazing_algorithms_of_image_processing.html http://www.arm.com/zh/products/processors/technologies/neon.php http://www.cnblogs.com/hrlnw/p/3723072.html https://en.wikipedia.org/wiki/OpenMP http://blog.csdn.net/firefly_2002/article/details/8545236 http://junzhuivs.blog.51cto.com/7446454/1249404/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有