图像处理算法调试

2015-06-09 00:16:44 jia20003 阅读数 8572

大概是四月底的时候,有人加我QQ问我是否做能做一些基于图像皮肤检测的算法,

主要是实现对皮肤六项指标:

1.      水分

2.      有份

3.      痤疮与痘痘

4.      色斑与肤色

5.      皱纹

6.      毛孔

听到这些内容,我稍微思考了一下,心里有了点思路,跟他交流了一下,关于怎么

做的思路就更加清晰起来,于是我先基于JAVA语言实现了第一版,然后把它改到

android上面,发现android代码改动很小,就可以在android上运行我的测试程序

了,但是感觉速度很慢,大概要十几秒才能出结果,发给了那个哥们,他测试了一

下也很郁闷,说速度太慢了,准确率也不是很高,怎么办,于是我仔细对照了一下

,发现我用Java语言实现时,在桌面版都是基于int来处理RGB像素的每个通道数

据,android上面DVM这么玩就有点卡,于是我就全部改成了每个通道基于BYTE

来实现处理,然后增加了皮肤检测,这样过滤非SKIN像素,再降采样处理整个

Bitmap数据,果然速度很快了,只要三秒左右就可以出结果,连我自己都觉得

自己是大神了,然后就想把android的人脸检测加上去,实现分块检测,这样

可以更好的检测人脸皱纹类型,经过一番各种坑之后,android上的人脸检测

API我学会了使用,但是发现速度不给力,加上去等于作茧自缚。于是我又放

弃了。又经过一番各种调试,别人帮忙把相机功能加上了,这样就实现了拍

照直接检测出结果,于是第二个问题出现了,经常出现APP闪退,我哭,经

过一番测试,发现低分辨率时候才会出现闪退,后来我才明白问题出在我对

低分辨率进行降采样,已经超出了像素范围,我哭!解决了之后闪退问题就

不见了,终于可以正常运行了,也可以正常测试了:

测试程序中的效果截屏:


这个就是拍照检测的结果,

原理都是常见的图像处理算法,可以说本人的博客文章已经包含了该应用的所有

图像处理算法知识,只是如何活学活用取决于大家都图像处理问题的认知与理解。

 通过该算法的开发,我第一次将我学到的图像处理知识应用到实践之中用于解决

实际问题,同时也发现真实图像处理问题,不是一步算法就可以实现的,而是一

系列图像处理算法的综合运用。



2015-03-13 22:42:54 liuuze5 阅读数 14578

整理了一下网上一些公司对图像处理算法工程师的招聘要求:

                                                            图像处理算法工程师

 

职位要求

编程技能:

1、 具有较强的编程能力和良好的编程习惯, 精通c/c++编程,并熟练使用VS 或matlab开发环境;

2、 在计算机技术领域拥有扎实的技术功底,尤其在数据结构、算法和代码、软件设计方面功力深厚;

    对数据结构有一定的研究基础如链表、堆杖、树等,熟悉数据库编程;

3、 出色的算法分析能力,对某一特定算法可以做广泛的综述,有实际算法实现经验;

4、 熟悉面向对象编程思想,精于windows下的C/C++、VC++程序设计,熟悉MATLAB,对MFC有相对的了解和应用经验;

专业技能:

1、扎实的数学功底和分析技能,精通计算机视觉中的数学方法;

     高等数学(微积分)、线性代数(矩阵论)、随机过程、概率论、

     摄影几何、模型估计、数理统计、张量代数、数据挖掘、数值分析等;

2、具备模式识别、图像处理、机器视觉、信号处理和人工智能等基础知识;

     对图像特征、机器学习有深刻认识与理解;

3、精通图像处理基本概念和常用算法包括图像预处理算法和高级处理算法;

     常见的图像处理算法,包括增强、分割、复原、形态学处理等; 

     熟悉常见的模式识别算法,特别是基于图像的模式识别算法,掌握特征提取、特征统计和分类器设计; 
4、熟练使用OpenCV、Matlab、Halcon中的一种或一种以上工具库;

5、熟悉机器视觉系统的硬体选型,包括CCD相机,镜头及光源;熟悉相机与镜头搭配;

 

外语:

1. 英文熟练,能够熟练阅读和理解专业英文资料,有英文文献检索和阅读能力;
2. 良好的英语沟通能力

综合能力:

1.对工作认真负责,积极主动,勤奋踏实;

2.做事严谨,注重细节,有耐心,能够在压力下独立工作;

3.学习钻研能力强,有较强的理解能力和逻辑思维能力和良好的创新意识;

4.良好的协调沟通能力和团队合作精神; 

经验要求:

1.两年以上C/C++ 程序设计经验;

2.具有2年以上在Linux/Unix环境下用C/C++语言开发图像处理软件的经验。

3.数字图像处理、模式识别的理论知识和实践经验;

  有基于OpenCV开发项目经验,机器视觉行业经验;

  具有图像处理算法设计和开发经验;

  参与过机器视觉系统分析和设计;

4. 在Matlab 或其它数学软件上开发算法的经验;

 

视觉算法经验:请提供实现的算法列表

    目标识别、图像配准、三维测量、标定和重建、手势识别; 

    表面缺陷检测;尺寸测量;特征识别;

    图像去噪、滤波、融合算法
    3A算法:如自动曝光、自动对焦、自动白平衡


【工作内容】: 


1.为解决实际问题而进行探索性研究和创新,设计与模式识别、图像/视频智能分析处理相关的算法。

  图形图像处理、计算机视觉相关算法的研发以及应用程序的编写;

  参与核心软件项目算法设计及算法实现;研究图像处理算法,开发和调试算法原型

  软件算法研发:算法的代码实现、优化以及移植及其测试;

  负责机器视觉系统图象处理、分析及识别算法的设计、实现及调试;

  参与图象算法视觉应用软件的设计与实现。参与图象处理技术研究与设计;

2、对已有的计算机视觉算法进行实用化开发和优化研究;
   精益求精,将算法做到极致,使算法真正实用化;

  参与预研性的算法分析和论证,为产品开发提供基础研究及论证;


岗位职责:

1、 协助工程师进行算法的测试.;C++语言验证、测试算法;

2、编写算法规格说明;
3、相关专业文献的查阅; 
4、将部分matlab程序转为C或C++语言程序。 

1) 辅助图像处理工作
2) 大规模图像搜集与分类 
3) 与开发人员等进行沟通,跟踪产品的体验效果并改进;
4)负责公司的机器视觉与传感器项目的技术支持(如项目可行性评估、现场DEMO、装机、培训等)

   和 维护工作;

 

岗位职责:

1、负责计算机视觉中的图像采集,处理面阵和线扫描相机的成像和控制 ;
2、针对特定的计算机视觉问题,设计目标识别与快速定位与检测算法的实现,并进行优化;
3、对彩色图像和灰度图像实现物体表面的污点划痕检测算法设计和实现;
4、处理三维物体表面数据获取和实现三维测量算法的实现;
5、处理点激光和线激光源的成像,散斑噪声滤波和轮廓检测;
6、负责算法与软件GUI开发工程师接口;
7、完成上级领导交办的其他的工作。




 

图像算法工程师三重境界



一、传统图像算法工程师: 
主要涉及图形处理,包括形态学、图像质量、相机成像之3A算法、去雾处理、颜色空间转换、滤镜等,主要在安防公司或者机器视觉领域,包括缺陷检测;

二、现代图像算法工程师: 
涉及模式识别,主要表现的经验为AdaboostSVM的研究与应用,特征选取与提取,包括智能驾驶的研究与应用、行人检测、人脸识别;

三、人工智能时代图像算法工程师: 
深度学习,主要在大型互联网公司或者研究所机构,具体体现在TensorFlow等开源库的研究与应用,包括机器人的研、基于深度学习的人脸识别;







2007-07-03 22:32:00 begtostudy 阅读数 8086

以往的图像处理函数实现,多是针对图像句柄。算法实现 需要操作复杂的图像文件。

但是,这种方式算法实现和调试的周期比较长。为了加速开外,我在中间插入的矩阵库。因为图像处理算法多是针对矩阵,所以实现和调试比较快。

 

PS:2009.10.27

这是我博客最烂的帖子,但是却有如此多的访问量,唉。

其实算法的代码是不可能公开的,因为算法的关键部分申请了软件著作权的。

不过,其基础图像库和矩阵类,两个部分早已在这个博客里公开了。

图像库:http://code.google.com/p/begtostudy-imagelib/

矩阵类:http://blog.csdn.net/begtostudy/archive/2006/12/18/1448216.aspx

至于核心算法只能去看我的硕士论文了。不过估计你们找不到,呵呵。

2018-09-12 15:24:30 p312011150 阅读数 1071

陆放翁诗云:“纸上得来终觉浅,绝知此事要躬行”,此乃亘古不变之真理也。

 

图像处理研究的一个很大特点就在于,它是一种和实际应用紧密联系的实用型学科。所有的算法都是针对实际中遇到的问题而存在的。无论是我们新提出了一个算法,还是我们新学习了一个算法,都可以直接写一个程序来检验它的处理效果。而且这种“效果”往往还是一目了然的。因为图像处理的输入和输出都是图像,图像就是用来给人看的。这种直观性是其它研究领域所很难具备的。例如,当年何恺明博士向CVPR提交其关于图像去雾算法的论文时,审稿人就很惊讶于这么简单的方法居然有这么意外的效果。于是其中就有好奇的审稿人直接动手编程实现了他的算法。正所谓,是骡子是马,拉出来溜溜。他算法的效果最终征服了审稿人,也征服了大会的评委会,最终那届的最佳论文奖就首次颁给了来自亚洲的研究者。

 

而之于正在学习或研究图像算法的同学而言,动手实践的意义就更大了。不要以为你听老师或别人讲了一些算法,或者自己看看冈萨雷斯书上的描述,就觉得自己好像已经get了什么。除非你真的自己能把程序写出了,否则其实你什么都没懂,最多也就是似懂非懂。这一点我最有发言权。很多算法我感觉我也学得不错,但其实我在写Magic House的时候仍然花了很多时间去调试,因为在写的过程中,其实问题是层出不穷的。例如,我在写图像傅立叶逆变换的时候,我感觉这个算法我已经理解的很到位了,但是做逆变换的时候就是得不到原图,而是一篇黑。问题到底出在哪里我其实断断续续想了挺长时间。有一天突然开窍了,因为傅立叶变换的结果存在文件里,其实只是保存了实数的部分,虚数部分根本就没存。因为你在屏幕上看傅立叶变换结果图的时候,看到的也只是实数部分。尽管你可能遇到的问题跟我不一样,但遇到这样或那样的问题总是肯定的。我总结了自己锻炼编写图像处理代码的几个原因:

 

1)一方面你会发现过去你的理解可能是有偏差的,因为按照你那个想法去实现的代码效果可能并不理想,那问题出在哪里就很值得你思索;

2)另一方面,你自己在实现的过程中很可能发现原作者算法的不足(比如我在实现暗通道算法时就发现这个算法处理大面积的天空时会有问题),然后你进一步研究的方向就来了!这在我看来似乎是发paper最容易的方法。

3)我不得不告诉你,很多paper是会骗人的!中国有学术腐败,国外也有学术造假。洛必达把他老师伯努利教给他的方法写进了自己的书里,于是便有了今天你所学到的洛必达法则。从这个角度来看,18世纪的欧洲就已经有学术腐败了。有些作者paper里的效果很可能是PS过的,所以你按照他的方法,无论怎么做也不可能得到他的效果,这一点如果你不试试,就很可能被骗。

4)写代码本身就是一项本领或者基本功。你将来还很有可能要靠他生存。曲不离口、拳不离手。你现在不好好练,将来很可能作茧自缚。

 

说到这里我就不禁要提一句。懒惰既是推动人类创新的两大动力之一,但也可能是害得你“啥都不会,只会坐等靠要”、最终一事无成的毒草。就像中国过去搞扶贫只会一味的输血,本来还有二亩薄田可以耕种,现在政府有救济款,索性连田也懒得种了,结果导致某些地方越扶越贫。现在很多人在网上一张嘴就是“有没有源代码下载”?或者买书看书也是挑那种“带光盘的”或者满篇满篇就只有代码的。抄来的过程当然轻松,但是知识、技术学会了是自己的,抄来的东西始终是别人的。不是说网上的代码、资源不可以参考,但是你绝对不应该对此产生依赖心理,人还是应该靠自己。如果你写不出来,只能说明你还没真正学会,学懂。何况真正有技术含量的东西,你永远也抄不来。两弹一星我们也曾想让苏联帮忙,但人家凭啥给你?结果怎么样,还不得靠中国人自己吗?要知道,这个技术积累的过程本身也很重要。

 

说道实践编程,你要么用C/C++,要么用Matlab,可能还有其他小众的(比如我有时也用R做图像处理),但大体上总逃不过这两大阵营。有人说他用Java或者Python, Anyway这其实并不重要。我的讨论还是以C/C++和Matlab为主体来讲。Matlab当然比较好用,什么卷积、直方图、高斯滤波,一个函数搞定!C/C++如果结合OpenCV基本可以达到同样的效果。当这绝对是后话。如果你是初学,最好能踏踏实实一点一滴把最基本的图像处理算法实现一下。千里之行,始于足下。九层之台,起于累土。因为建立一个完整的体系思维和拥有一个扎实的基础特别重要。一些看似高大上的算法都是在这些不起眼的算法的堆砌组合下实现的。比如SIFT特征构建时,你会遇到直方图、高斯滤波和图像金字塔这些非常基础的原件。当你看到这些东西的时候,你就应该有马上觉悟到它们的各种特性和作用的能力。这对于你理解SIFT很有帮助。如果你具备了这种素质,详细我,你再在matlab里调那些函数来写SIFT就非常容易。如果说你学了一遍SIFT,但是还是写不出来,结论就是因为最基本的高斯、金字塔、直方图你也没自己写过。跳过了锻炼基础的阶段,直接来高大上的东西,比如会无福消受。就像《天龙八部》里的番僧鸠摩智为了速成,不惜用道教的小无相功来催动少林72绝技,结果走后入魔,前功尽废。前两天有网友给我博客留言:“如果只是把现成的算法实现一遍那也没什么意思,原创算法的话就有技术含量了。”我当时觉得可能这位网友水平比较高,看我这些雕虫小技自然不能入法眼。但我这两天又在想抛开大家水平高低不谈,这句话到底对不对?我发现,这个说法还是有漏洞。你小学时候每天语文课上学了十个新汉字,老师就让你在方格本上每个抄10遍,这种事当然没意思了,但是大家不都是这么没意思过来的吗?如果不这样,你怎么能在高考的时候40分钟写一篇800字命题作文呢?可见没意思的事情未必没意义!

 

最后,用荀老夫子的一句话同大家共勉:无冥冥之志者,无昭昭之明,无昏昏之事者,无赫赫之功

 

2017-04-04 16:24:42 u013085897 阅读数 9992
       做了那么多滤镜,今天写一篇关于滤镜的博客。可能是现在滤镜太多了,现在所有的图像相关app,基本都有滤镜功能,同时还有很多开源滤镜程序。美食滤镜、风景滤镜、人像滤镜,每家滤镜都各有特色,可以说没有最好,只有更有特色的滤镜,不过身边很多人还是比较推崇VSCO的滤镜。
       那么滤镜程序都是如何实现的呢?我以前的工作流程是,滤镜效果由设计师使用ps设计,设计滤镜常用的ps功能是:调节饱和度及色相、调节曲线、叠加纹理等等,通过调节饱和度和色相,可以有针对性的调节某一个色系,使之变浓、变淡或者改变色调,而其他色系不变。同样,对rgb某一个通道进行曲线调节,可以非线性的拉伸或压缩某一颜色通道对整幅图像的影响,实现精细化的色调调节。叠加纹理要简单一些,将设计好的纹理,通过某种混合操作,叠加在原图上,实现各种特效,比如lomo滤镜,暗角除了可以通过算法生成外,也可以通过叠加纹理实现。而程序员拿到设计师的滤镜设计稿后,要做的就是编写程序高度还原设计效果。这一点多多少少还是有些挑战,因为ps经过多年发展后,不同版本有些功能效果还不一样,比如最为常见的亮度、对比度调节,算法很简单,但是要做到和ps效果一样,还是要花时间摸索、调试。我当时在实现过程中,比较难还原的是分色系:红、黄、绿、青、蓝、洋红进行饱和度及色相调节,比如整幅图像,只对红色部分进行调节,但是如果程序处理不佳,在红与黄、洋红颜色过渡带,会出现非常明显的色块、锯齿等各种非常差的效果,而ps就不会。这时就要反复推测ps的实现方式,努力做到自己的程序和ps效果一样。所以,滤镜其实也没什么复杂原理及公式推导,就是通过编写程序模拟ps各种操作,以还原设计师的设计效果。这里要提一下,对于图像处理算法工程师,如果ps不熟,那不及格的,哈哈。
       下面是一些滤镜效果图,主要包括黑白滤镜、美食滤镜、风景滤镜等。