目前大多数智能手机和平板电脑的照相机有明显的图像噪声,这通常可接受,但对于5×5的Laplacian边缘滤波器影响很大。椒盐噪声黑色边缘掩码(比如:素描模式)经常会有很多被称为“椒盐”噪声的黑色小斑点,它是在白色背景下由几个相邻黑色像素构成的。使用均值滤波通常可以很好地去除这种噪声,但在本章的项目中,均值滤波却不能有效去除椒盐噪声,因为边缘掩码大多数情形都是边缘和噪声点都为黑色(值为0),而背景为纯白色(值为255)。若使用标准的闭形态学算子,会删除很多边缘。因此,本项目采用一个自定义滤波器,它可删除被白色像素完全包围的小黑域。这样就可以去掉很多噪声点,同时对实际边缘影响不大。
通过遍历图像的每个黑色像素,以该像素为中心,检查5×5正方形区域的边界像素是否为白色,如果它们都为白色,则说明有一个黑色噪声小岛,可用白色像素来填充整个块以删除黑色噪声。为了简化这个5×5的滤波器,可忽略掉图像周围的两个边界像素。
下图左边的图像来自Android平板电脑,中间那幅图为素描模式下的图像(该图像有小的黑色椒盐噪声点),右边那幅图为使用上述方法删除椒盐噪声的结果,这幅图的皮肤看起来更加清晰。
下面是函数removePepperNoise()的实现代码。为简便起见,该函数会对图像适当处理。椒盐噪声黑色
1.显示应用的每秒帧数(FPS)
每秒帧数(fps)对于运行慢的应用(比如本应用)来讲不太重要,但在屏幕上显示它还是有意义,如果想显示每秒帧数(fps)是多少,请执行如下步骤:
1)将文件src\org\opencv\samples\imagemanipulations\FpsMeter.java从示例项目文件夹(例如:C:\OpenCV-2.4.1\samples\android\image-manipulations)复制到本项目的src\com\Cartoonifier文件夹。
2)将包名FpsMeter.java替换为com.Cartoonifier。
3)在文件CartoonifierViewBase.java中在语句private byte[] mBuffer;后定义成员变量mFps:
4)在构造函数CartoonifierViewBase()的mHolder.addCallback(this) ;语句后面初始化mFps对象:
5)在run()函数的try/catch块后面测量每帧的FPS:
6)用下面的代码在屏幕上显示FPS,该代码添加在run()函数的canvas.drawBitmap()函数后面。
2.使用不同的摄像机分辨率
如果让应用运行得更快,则效果会变差,因此可考虑从设备上获取更小的视频图像或在获取图像时就缩小它。基于示例代码的卡通化程序会使用最靠近摄像机预览的分辨率,该分辨率的高与屏幕高度一样。若设备是一个500万像素,屏幕仅为640×480的摄像机,卡通化应用使用的分辨率可能为720×480等。如果想对摄像机设置不同的分辨率,需修改CartoonifierViewBase.java文件的suceChanged()函数中setupCamera()的参数。例如:
一种获取摄像机最高分辨率的简易方法是传递一个很大的分辨率给函数,例如
10 000×10 000,它将选择最大的有效分辨率(注意:函数选择的是最大预览分辨率,摄像机视频的分辨率通常小于单幅静止图像的分辨率)。或者为了让应用运行较快,可传递1×1的分辨率给函数,它将采用最小的摄像机分辨率(例如:160×120)。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40865-1.html
9