2004毕业于山东大学齐鲁软件学院,软件工程专业。主要专注于图像处理算法学习与研究,计算机视觉技术开发应用,深度学习在计算机视觉领域应用。两本书籍《Java数字图像处理-编程技巧与应用实践》、《OpenCV On Android编程实践》作者
使用TensorFlow进行简单的图像处理 概述 作为计算机视觉开发者,使用TensorFlow进行简单的图像处理是基本技能,而TensorFlow在tf.image包中支持对图像的常见的操作包括: 亮度调整 对比度调整 饱和度调整 图像采样插值放缩 色彩空间转换 Gamma校正 标准化 图像的读入与显示我们通过OpenCV来实现,这里需要注意一点,OpenCV中图像三个通道是BGR,如果你是通过tensorflow读取的话三个通过顺序是RGB。
图像各向异性滤波 各向异性概念 各向异性(英文名称:anisotropy)是指材料在各方向的力学和物理性能呈现差异的特性。晶体的各向异性即沿晶格的不同方向,原子排列的周期性和疏密程度不尽相同,由此导致晶体在不同方向的物理化学特性也不同,这就是晶体的各向异性。
OpenCV实现手写体数字训练与识别 机器学习(ML)是OpenCV模块之一,对于常见的数字识别与英文字母识别都可以做到很高的识别率,完成这类应用的主要思想与方法是首选对训练图像数据完成预处理与特征提取,根据特征数据组成符合OpenCV要求的训练数据集与标记集,然后通过机器学习的KNN、SVM、ANN等方法完成训练,训练结束之后保存训练结果,对待检测的图像完成分割、二值化、ROI等操作之后,加载训练好的分类数据,就可以预言未知分类。
基于OpenCV实现二维码发现与定位 在如今流行扫描的年代,应用程序实现二维码扫描检测与识别已经是应用程序的标配、特别是在移动端、如果你的应用程序不能自动发现检测二维码,自动定位二维码你都不好意思跟别人打招呼,二维码识别与解析基于ZXing包即可。
这个是我们去年想做的一个项目,后来因为各种原因就此搁浅了。但是算法部分我已经把它基本成型了,对各种光线条件下都可以准确的找到嘴唇,提取唇形、然后通过色彩渲染自动变化颜色,实现各种颜色的口红实时渲染,基于OpenCV与Android NDK完成的算法演示。
线性回归(Linear Regression) 梯度下降算法在机器学习方法分类中属于监督学习。利用它可以求解线性回归问题,计算一组二维数据之间的线性关系,假设有一组数据如下下图所示 其中X轴方向表示房屋面积、Y轴表示房屋价格。
一:介绍 图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉与人工智能的常见方法之一。图像反向投影通常是彩色图像投影效果会比灰度图像效果要好,原因在于彩色图像带有更多对象细节信息,在反向投影的时候更加容易判断、而转为灰度图像会导致这些细节信息丢失、从而导致分割失败。
直方图反向投影算法介绍与实现 概念介绍 直方图反向投影简单的说就是可以通过它来实现图像分割,背景与对象分离,对已知对象位置进行定位。反向投影在模式匹配、对象识别、视频跟踪中均有应用,OpenCV中经典算法之一CAMeanShift就是基于反向投影实现对已知对象的位置查找与标记、从而达到连续跟踪。
程序员学好英语是伪命题 我写这篇文章的起因是因为在其它IT网站看到一篇文章上面讲程序员学英语如何重要,看完之后感觉如鲠在喉、不吐不快。感觉有些人已经是别有用心,是非颠倒,在他们眼中作为程序员英语的重要性已经远远超过技术。
图像处理之高斯混合模型 一:概述 高斯混合模型(GMM)在图像分割、对象识别、视频分析等方面均有应用,对于任意给定的数据样本集合,根据其分布概率, 可以计算每个样本数据向量的概率分布,从而根据概率分布对其进行分类,但是这些概率分布是混合在一起的,要从中分离出单个样本的概率分布就实现了样本数据聚类,而概率分布描述我们可以使用高斯函数实现,这个就是高斯混合模型-GMM。
计算样本数据的方差, 标准方差与协方差 在图像处理中有时候会涉及计算图像像素数据的方差,标准方差与协方差等统计学属性作为中间数据。因此知道什么是方差、标准方差、协方差很重要。 二:代码实现 Java代码实现计算数据的方差,标准方差、协方差 package com.
Android Studio上NDK编程步骤与演示 在AndroidStudio(AS)上搞NDK编程首先要下载与安装NDK,搞好了这步之后。只需要以下几步配置与操作就可以轻松开始NDK编程与运行。
Apache HTTP配置反向代理入门 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器或者外部网络上其它IP地址服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
基于一维级联快速膨胀与腐蚀算法 一:基本原理 膨胀与腐蚀是图像形态学两个基本操作之一,传统的代码实现都是基于二维窗口卷积模式,对于正常的3x3窗口要八次与运算,而基于一维级联方式先X方向后Y方向只需要4次与运算即可。
Java使用OpenCV3.2实现视频读取与播放 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务。
UMat对象起源 OpenCV3中引入了一个新的图像容器对象UMat,它跟Mat有着多数相似的功能和相同的API函数,但是代表的意义却太不一样。要说到UMat对象的来龙去脉,必须首先从OpenCL来开始说,OpenCL是一个面向异构系统通用的并行编程标准,这个标准最早是苹果公司提出,后来变成了一个国际标准,目的是通过它开发通用的GPU计算软件,中国的华为是该标准的成员之一。
一:准备 前几天在写代码的时候发现周围有人都换到了OpenCV3.2上面去啦,我当时就把OpenCV3.1包给删啦,立马下载OpenCV3.2,下载地址在这 里:http://opencv.org/opencv-3-2.html。
OpenCV概述 OpenCV做为功能强大的计算机视觉开源框架,包含了500多个算法实现,而且还在不断增加,其最新版本已经更新到3.2。其SDK支持Android与Java平台开发,对于常见的图像处理需求几乎都可以满足,理应成为广大Java与Android程序员的首先的图像处理框架。
OpenCV 3.1.0编译与添加扩展模块 最近在弄个东西,需要把OpenCV的扩展模块中的xfeatures给包含进来,发现要自己编译OpenCV3.1.0与其扩展模块才可以实现。
图像处理之局部二值特征 一:局部二值模式(LBP)介绍 局部二值模式(Local Binary Pattern)主要用来实现2D图像纹理分析。其基本思想是用每个像素跟它周围的像素相比较得到局部图像结构,假设中心像素值大于相邻像素值则则相邻像素点赋值为1,否则赋值为0,最终对每个像素点都会得到一个二进制八位的表示,比如11100111。
图像处理之积分图应用四(基于局部均值的图像二值化算法) 基本原理 均值法,选择的阈值是局部范围内像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作: pixel = (pixel > (mean - c)) ? object : background 其中默认情况下参数C取值为0。
图像处理之三角法图像二值化 三角法求阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究,该方法是使用直方图数据,基于纯几何方法来寻找最佳阈值,它的成立条件...
关河无尽处,风雪有行人 - 我的2016年总结 2016年我做为个人独立开发者渡过的完整一年,用一句话说理想是丰满的,现实是骨感的,本来计划在2016年想自己做个图像处理方面的产品,但是迫于生活压力,不得不接下一个又一个的小项目以维持生计,还没有摆脱生存压力,这个也是个人开发者来说最重要的一课,首先要生存下去,然后才是自我发展。
图像处理之角点检测与亚像素角点定位 角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分析结果就越接近真实。
OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作分别是图像点操作与块操作,简单点说图像点操作就是图像每个像素点的相关逻辑与几何运算、块操作最常见就是基于卷积算子的各种操作、实现各种不同的功能。
Android Studio 2.2 中支持NDK开发HelloJNI例子 首先说一下运行的开发环境 * Win7 64位 * Android Studio 2.2 * NDK版本是64位 r13b 首先在AndroidStuido中创建一个空白项目,创建好之后,选择【File】->【project structure】显示如下: 添加好NDK支持,记得提前下载安装好就行啦。
Tesseract OCR集成Android Studio实现OCR识别 介绍 Tesseract OCR谷歌开源的OCR识别引擎,支持多国文字包括中文简体与繁体。最新的版本是3.x。
在Android Studio 2.2上集成OpenCV4Android SDK OpenCV官方的教程是基于Eclipse配置开发环境,但是Eclipse已经被Google抛弃了,所以我是写这篇文章的前三天刚刚开始用Android Studio 2.2版本,很多Gradle脚本也不熟悉,只能各种查找。
在Android Studio中如何调整字体大小 在Android Studio中如何删除项目 相信刚开始用Android Studio的开发者都没有少被这两个问题折磨 本人以前都是用Eclipse做安卓程序开发的,前两天心血来潮决定抛弃Eclipse转而使用使用谷歌的开发工具Android Studio。
图像处理之积分图应用三(基于NCC快速相似度匹配算法) 基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象检测与识别均有应用。
一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现。其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.
图像处理之形态学梯度计算 源代码基于OpenCV实现,原因是太懒了,不想再用Java从头写了! 一:概念介绍 形态学操作膨胀与腐蚀图像形态学中最基本的两个形态学操作、常常被组合起来一起使用实现一些复杂的图像形态学操作,计算图像的形态学梯度是形态学重要操作之一是有膨胀和腐蚀基础操作适当的组合形成。
图像处理之图像内插值与外插值 两张图像混合时通过内插与外插值方法可以实现图像亮度、对比度、饱和度、填色、锐化等常见的图像处理操作。在两张图像混合时最常见是线性插值方法,使用的混合权重公式如下: 这个就是两张图像最常见的混合公式,其实我们很少考虑到值大于1的情况,当这个时候得到的效果跟在值属于[0,1]之间相反,我们称之为两张图像混合的外插值方法,而常见的值属于[0,1]之间称之为内插值方法。
JavaJNI开发时常用数据类型与C++中数据类型转换 常见的数据类型对应关系如下: 此外我们经常用String类型,它可以通过如下的API实现jstring到char*之间的相互转换constchar* szString = env-> GetStringUTFChars(jstring, 0);这种转换出来的char*类型数据,使用完之后一定要调用 env-> ReleaseStringUTFChars(jstring, szString);释放掉,不然会导致内存泄漏,如果忘记JVM会崩溃的。
图像处理之积分图像应用一(半径无关的快速模糊算法) 一:基本原理概述 传统的图像空间域卷积模糊算法,当窗口大小改变时卷积模糊时间也会变化,而且随着窗口尺寸越大计算量也越大,算法运行时间约越长。在很多时候无法满足实时性要求。
图像处理之积分图算法 一:积分图来源与发展 积分图像是Crow在1984年首次提出,是为了在多尺度透视投影中提高渲染速度。随后这种技术被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。
一: Mat介绍 OpenCV刚出来的时候图像加载内存之后的对象是IplImage作为数据对象,里面存储了图像的像素数据和宽、高、位图深度、图像大小、通道数等基本属性。IplImage结构是C语言体系下定义出来的接口,使用它时候最大的问题是要自己负责内存管理,控制内存分配和释放,很容易导致内存问题。
Java通过JNI实现调用C++程序 好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用到它了,因此总结一下给自己留个记号!省下下次再用到到处查资料。Java通过JNI实现调用C或者C++写的程序,实现对底层或者下位机的读写通讯,在桌面开发中是经常遇到的。
OpenCV3.1中读写图像与读写像素 一:读图像,显示到窗口 从本地目录读写一张RGB图像到内存对象Mat中并把它显示到指定窗口。 相关函数: - imread 加载图像文件 - imshow 显示图像 - namedWindow 创建窗口 相关代码: #include #include u...
在二值图像处理特别是OCR识别与匹配中,都要通过对字符进行细化以便获得图像的骨架,通过zhang-suen细化算法获得图像,作为图像的特征之一,常用来作为识别或者模式匹配。 一:算法介绍 Zhang-Suen细化算法通常是一个迭代算法,整个迭代过程分为两步: Step One:循环所有前景像素点,对符合如下条件的像素点标记为删除: 1.
最近做了一个项目最后要把算法整成C++的DLL方式给别人调用,朋友给我推荐了用CxImage这个库来读写图像文件,所以我就用了,基于CxImage做了调用算法的Demo程序,已经给别人测试了,现在总结一下CxImage使用中遇到的那些坑。
一:基本原理 图像卷积处理实现锐化有一种常用的算法叫做Unsharpen Mask方法,这种锐化的方法就是对原图像先做一个高斯模糊,然后用原来的图像减去一个系数乘以高斯模糊之后的图像,然后再把值Scale到0~255的RGB像素值范围之内。
关于图像处理方面的收获: 五月中旬的时候接了个细胞检测的活,要求识别白细胞、红细胞、脂肪球、霉菌几种 细胞,大致看了客户发给我显微镜上的图片,发现能做,于是就接了下来,客户告诉 我最终的程序要是C++的编译成DLL给他们的应用程序调用才可以,本人因为一直做 Java,做C++还是12年前毕业设计的时候做了图像相关的东西。
图像处理之HOG特征提取算法 HOG(Histogram of Oriented Gradient)特征在对象识别与模式匹配中是一种常见的特征提取算法,是基于本地像素块进行特征直方图提取的一种算法,对象局部的变形与光照影响有很好的稳定性,最初是用HOG特征来来识别人像,通过HOG特征提取+SVM训练,可以得到很好的效果,OpenCV已经有了。
图像处理之基于泛红算法的二值图像内部区域填充 一:基本原理 在二值图像处理中有个常用的操作叫做Hole Fill意思是填充所有封闭区域的内部,这种算法在二值图像基础上的对象识别与提取有很大作用。基于泛红填充算法实现二值图像内部区域填充是一直快速填充算法。
在《Java数字图像处理-编程技巧与应用实践》一书的第九章讲到了Canny边缘检测的代码实现,在求取梯度与角度处理,非最大信号压制之后,有一步是通过两个阈值(高低阈值)实现边缘断线的连接,得到完整的边缘,之前给出的代码是固定阈值,这个有两个改动: 改动一: 改为自动阈值了,高的阈值是梯度的平均值means的两倍,低阈值是平均值的二分之一。
基于查找表的快速Gamma校正 在图像预处理中经常通过Gamma校正实现像素修正,常见的Gamma校正是按照公式 对每个像素进行校正,这样做对一张图片还好,当你有大量图片需要做相同处理的时 候计算量就会变得很大,这个时候可以通过建立查找表,然后根据查找表映射实现快 速的Gamma校正。
一:JVM中内存 JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用执行线程方法 存放本地临时变量与线程中方法执行时候需要的引用对象地址。JVM所有的对象信息都 存放在堆内存中,相比栈内存,堆内存可以所大的多,所以JVM一直通过对堆内存划分 不同的功能区块实现对堆内存中对象管理。
Spring3 MVC中使用Swagger生成API文档 一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring restful风格的接口文档, 同时swagger-ui还可以测试spring restful风格的接口功能。
Java线程学习经典例子-读写者演示 Java线程学习最经典的例子-读写者,主要用到Thread相关知识如下: - 线程的start与run - 线程的休眠(sleep) - 数据对象加锁(synchronized) - 数据对象的等待与释放(wait and notify) 程序实现: -ObjectData数据类对象,通过synchronized关键字实现加锁,在线程读写者中使用。