上篇我们成功搭建了OpenCV的Android开发环境,并简单介绍了一下OpenCV的相关应用:
Android OpenCV应用篇一:环境搭建,高斯差分
接下来我们继续探索OpenCV在Android上对应用。
在进行图像处理的一些高级操作时候,我们需要对图片进行预处理,以过滤一些不必要对信息,缩短计算时间,接下来我们就来介绍一些基本的图片处理操作
- 灰度
- 模糊
- 降噪
- 锐化
- 腐蚀和膨胀
- 阈值化、自适应阈值
- 直方图均衡
OpenCV中图像对存储
开始之前,我们先来了解一些OpenCV中是如何保存操作图片对象对。对于Android系统API相信大家都知道系统有提供Bitmap,Drawable来临时保存图片对象供我们使用操作,相对都,OpenCV也有提供相关对工具类:Mat
Mat对象保存来图片对行数(高度)、列数(宽度)、通道(颜色通道)、图片数据等相关信息,并封装来一些图片等操作方法(后续会有用到再做介绍)。
![灰度图像单通道表示](https://i-blog.csdnimg.cn/blog_migrate/974220dc13ebe6b9088e07fa5ec5e4e2.png)
![图像RGB三通道表示](https://i-blog.csdnimg.cn/blog_migrate/3d1a77b02f9f23e70977d7b7682324d9.png)
利用OpenCV处理图片
一、灰度处理
在进行许多复杂的图像处理之前,我们都需要将图像转换成灰度单通道。
在没有使用OpenCV之前,我们在Android上操作Bitmap是如何得到一张RGBA图片的灰度图像的:
Android转化为bitmap类得到灰度图像,并对其数据做如下操作:
A通道保持不变,然后逐像素计算:X = 0.3×R+0.59×G+0.11×B,并使这个像素的值新R,G,B值为X,即:
new_R = X, new_G = X, new_B = X
例如:原来一个像素是4个byte,分别为ARGB,现在这个像素应该为AXXX
没错,我们通过重新计算每个像素点的颜色值,然后重新绘图得到,得到的图片的通道仍然与原图保持一致,归根揭底还是一个RGBA的图片,只是颜色值为gray而已。
OpenCV给我们提供来更为彻底的处理函数:
Imgproc.cvtColor(Mat src, Mat dst, ind code)
- src为要处理的图片
- dst为处理后输出图片
- code为转换模型
例如我们要将一个RGBA的图片转换成GRAY,如下处理
Imgproc.cvtColor(src, src, Imgproc.COLOR_RGBA2GRAY)
得到的是一个单通道的GRAY图像,效果如下:
![灰度图像单通道表示](https://i-blog.csdnimg.cn/blog_migrate/9621a9a5c3a4acf52b4e734644cc0071.png)
二、线性滤波
线性滤波最常见对一种用途是降噪,噪声是图像中亮度或色彩信息对随机变化,我们用模糊操作来减少图像中对噪声。
2.1、高斯模糊
高斯模糊是比较常用的模糊算法,在许多图片美化工具中都用经常用到。具体的高斯模糊函数以及原理我们这里不做介绍(高数实在是全部换回去了,无力研究),感兴趣的可以自己去找资料研究一下。
OpenCV为我们提供了内置函数用来在应用中执行高斯模糊:GaussianBlur
Imgproc.GaussianBlur(
Mat src, // 要处理的图像
Mat dst, // 输出图像
Size kSize, // 高斯内核大小
double sigmax, // 高斯函数在x方向上的标准偏差
double sigmay // 高斯函数在y方向上的标准偏差
)
例如我们对图片进行一次高斯模糊处理:
// 高斯模糊
Imgproc.GaussianBlur(src, src, Size(3.0, 3.0), 0.0,0.0)
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/4825b97e2686998bb6b4742cb70054ed.png)
2.2、中值模糊
噪声在图片是是一种比较常见对现象,尤其是椒盐噪声,该噪声是疏密分布与图片中对黑色白色像素点。我们可以利用中值滤波去除这一类噪声。
OpenCV给我们提供了medianBlur内置函数来进行中值滤波
medianBlur(Mat src, Mat dst, int ksize)
例:
// 中值滤波
Imgproc.medianBlur(src, src, 3)
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/f87d1d602c63b281238de38b90c6e66f.png)
2.3、均值模糊
均值模糊是最简单一中模糊处理方式
在OpenCV中,我们使用内置函数:blur来进行处理
blur(Mat src, Mat dst, Size ksize)
例:
// 均值模糊
Imgproc.blur(src, src, Size(8.0, 8.0))
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/f9d30d75c01b7c56c5f4036bb0173248.png)
2.4、锐化
锐化可以看作是一种线性滤波操作,具体原理性质的概念不做赘述。通常我们在处理沙滩、毛发之类的图片时会经常用到锐化的操作,可以给人一中更有质感的感觉。
话不多说,OpenCV 中的内置函数:filter2D 可以帮助我们实现这一效果
filter2D(Mat src, Mat dst, int ddepth, Mat kernel)
例:
//锐化处理,做卷积
val kernel = Mat(3, 3, CvType.CV_16SC1)
kernel.put(
0, 0,
0.0, -1.0, 0.0,
-1.0, 5.0, -1.0,
0.0, -1.0, 0.0
)
Imgproc.filter2D(src, src, src.depth(), kernel)
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/2b72d0c3321f22e81b863bf15fcd27dc.png)
三 阈值化
阈值化是一种将我们想要在图像中分析的区域分割出来的方法,基本原理是把每个像