Android OpenCV应用篇二:图片处理

上篇我们成功搭建了OpenCV的Android开发环境,并简单介绍了一下OpenCV的相关应用:

Android OpenCV应用篇一:环境搭建,高斯差分

接下来我们继续探索OpenCV在Android上对应用。


在进行图像处理的一些高级操作时候,我们需要对图片进行预处理,以过滤一些不必要对信息,缩短计算时间,接下来我们就来介绍一些基本的图片处理操作

  • 灰度
  • 模糊
  • 降噪
  • 锐化
  • 腐蚀和膨胀
  • 阈值化、自适应阈值
  • 直方图均衡

OpenCV中图像对存储

开始之前,我们先来了解一些OpenCV中是如何保存操作图片对象对。对于Android系统API相信大家都知道系统有提供Bitmap,Drawable来临时保存图片对象供我们使用操作,相对都,OpenCV也有提供相关对工具类:Mat
Mat对象保存来图片对行数(高度)、列数(宽度)、通道(颜色通道)、图片数据等相关信息,并封装来一些图片等操作方法(后续会有用到再做介绍)。

灰度图像单通道表示 图像RGB三通道表示
上面两幅图简单介绍来一下**Mat**是如何表示衣服图像的,OK,简单了解这些后,我们开始进行图片的处理工作。

利用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图像,效果如下:

灰度图像单通道表示

二、线性滤波

线性滤波最常见对一种用途是降噪,噪声是图像中亮度或色彩信息对随机变化,我们用模糊操作来减少图像中对噪声。

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)

效果图:

2.2、中值模糊

噪声在图片是是一种比较常见对现象,尤其是椒盐噪声,该噪声是疏密分布与图片中对黑色白色像素点。我们可以利用中值滤波去除这一类噪声。

OpenCV给我们提供了medianBlur内置函数来进行中值滤波

medianBlur(Mat src, Mat dst, int ksize) 

例:

// 中值滤波
Imgproc.medianBlur(src, src, 3)

效果图:

2.3、均值模糊

均值模糊是最简单一中模糊处理方式
在OpenCV中,我们使用内置函数:blur来进行处理

blur(Mat src, Mat dst, Size ksize)

例:

// 均值模糊
Imgproc.blur(src, src, Size(8.0, 8.0))

效果图:

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)

效果图:

三 阈值化

阈值化是一种将我们想要在图像中分析的区域分割出来的方法,基本原理是把每个像

  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值