在Android Studio中使用OpenCV对图片进行模糊度判断,选出好照片

有次,我旅游回来,想从一大堆照片中选出一部分照片来进行保存起来,打印出来,删掉一部分,但是很多照片有很相似,搞得没法下手,所以就想写段程序帮我选一下。

理论依据:每张照片都包含一些图形,每个图形都有形状,形状都有边界,如果边界有连续位移,一个边界线的组成像素点的值差较大,就说明手抖了,如果边界宽度的像素值过度很小,就说明手没抖,拍的是清晰的。

什么是图像的边缘?

图像的边缘是图像最基本的特征之一。所谓边缘(或边沿)是指周围像素灰度有跳跃性变化或“屋顶”变化的那些像素的集合。边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标、目标与背景、区域与区域之间,因此它是图像分割依赖的重要特征。从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变、纹理结构突变等)的反应,它标志着一个区域的终结和另一个区域的开始。

检测出的边缘并不等同于实际目标的真实边缘。由于图像数据是二维的,而实际物体是三维的,从三维到二维的投影必然会造成信息的丢失,再加上成像过程中的光照不均和噪声等因素的影响,使得有边缘的地方不一定能被检测出来,而检测出的边缘也不一定代表实际边缘。

图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈。边缘上的这种变化可以用微分算子检测出来,通常用一阶或两阶导数来检测边缘。一阶导数认为最大值对应边缘位置,而二阶导数则以过零点对应边缘位置。

实现,自己进行实现算法太麻烦,我们就采用OpenCV现成的算法进行图像处理。

太专业的东西,我们就不讲了,时域,频域,空间域,高斯变换,拉普拉斯算子啥的的比较专业都不说了,看懂这些废了我好多脑细胞,大家就可以节省了。

我们来说一下,咋样,毕竟技术是服务生活的。

第一步,从OpenCV官网下载,对应于Android开发环境的开发包。

OpenCV Android SDK 是OpenCV针对Android平台提供的开发工具包。Android应用开发一般采用Java或者Kotlin语言进行,而OpenCV主要模块采用C、C++语言编制,因此,我们需要通过JNI技术,实现JAVA或者Kotlin调用OpenCV算法模块的目的。

第二步,以模块的形式导入开发环境中

  • New Project
  • Import Module…
  • 选择OpenCV-android-sdk下的sdk目录,修改或者不修改module的名称
  • 添加app程序对sdk module的依赖
  • 期间可能会遇到一些问题,可能是NDK版本问题,可能是API LEVEL问题,也可能是build tools的问题,对应的稍作处理即可。

第三步,读取需要判断的照片,调用OpenCV算法进行分析,根据结果进行排序,获得最好照片。

总结,就这三步,就能知道那张照片对焦好,那张对焦不好。当你手机上有非常多的多照片的时候,我们也快成把这些照片根据算法排个队,把排在前的留下,排在后面的删掉,帮你节省手机存储空间。

详细功能,可以使用app体验。

发表评论

您的电子邮箱地址不会被公开。