android opencv锐化,计算机视觉 OpenCV Android | 图像操作之 自定义滤波(模糊、锐化、梯度)、形态学操作(膨胀腐蚀、开闭操作、黑帽顶帽、形态学梯度)(更新ing)...

1. 自定义滤波

OpenCV中除了之前说的几种常见的滤波方法外,还支持自定义卷积核,用于实现自定义滤波。

这一节笔记就通过自定义卷积核与相关API函数实现图像卷积的模糊、锐化、梯度计算这三个典型的卷积处理功能。

卷积核本质是用Mat对象+put()置入数据实现的;

自定义卷积核普适步骤:

a.新建Mat对象;

b.新建用于存储数据的数组;

c.数据数组put进Mat对象;

自定义卷积核调用的滤波API与参数解释具体如下:

filter2D(Mat src, Mat dst, int ddepth, Mat kernel)

src:表示输入图像。

dst:表示输出图像。

ddepth:表示输出图像深度,-1表示与输入图像一致即可。

kernel:表示自定义图像卷积。

下面笔记几种常用的自定义卷积核。

1.1.模糊

最常见的均值模糊的卷积核如下:

dc3048553c8f

图为3×3均值模糊卷积核

自定义3×3的模糊卷积核代码如下:

Mat k = new Mat(3, 3, CvType.CV_32FC1);

float[] data = new float[]{1.0f/9.0f,1.0f/9.0f,1.0f/9.0f,

1.0f/9.0f, 1.0f/9.0f, 1.0f/9.0f,

1.0f/9.0f, 1.0f/9.0f, 1.0f/9.0f};

k.put(0, 0, data);

除了自定义均值模糊之外,

还可以实现自定义近似高斯模糊卷积核,卷积核如下:

dc3048553c8f

不同权重近似高斯卷积核模糊

近似高斯模糊卷积核实现如下:

Mat k = new Mat(3, 3, CvType.CV_32FC1);

float[] data = new float[]{0,1.0f/8.0f,0,

1.0f/8.0f, 0.5f, 1.0f/8.0f,

0, 1.0f/8.0f, 0};

k.put(0, 0, data);

1.2.锐化

图像锐化可以提高图像的对比度,

轻微去模糊,

提升图像质量;

通过自定义锐化算子可以实现图像的锐化,

对输入图像实现质量增强与提升;

常见的两个锐化算子如下:

dc3048553c8f

自定义锐化算子实现:

Mat k = new Mat(3, 3, CvType.CV_32FC1);

float[] data = new float[]{0,-1,0,-1, 5, -1,0, -1, 0};

k.put(0, 0, data);

1.3.梯度

图像边缘是图像像素变化比较大的区域(边缘在频域里属于高频部分),是图像特征表征的候选区域之一,

在图像特征提取、图像二值化等方面有很重要的应用。

而通过自定义卷积算子实现梯度图像是查找边缘的关键步骤之一,

最简单的计算图像梯度功能的卷积核为Robot算子,其表示如下:

dc3048553c8f

其中,左侧是Robert算子的X方向梯度、右侧是Y方向梯度。

自定义Robert算子实现如下:

Mat kx = new Mat(3, 3, CvType.CV_32FC1);

Mat ky = new Mat(3, 3, CvType.CV_32FC1);

// X方向梯度算子

float[] robert_x = new float[]{-1,0,0,1};

kx.put(0, 0, robert_x)

// Y方向梯度算子

float[] robert_y = new float[]{0,1,-1,0};

ky.put(0, 0, robert_y);

使用上述自定义的卷积核实现自定义滤波的代码如下:

Imgproc.filter2D(src, dst, -1, k);

完整的演示代码可查看文末的GitHub源代码;

dc3048553c8f

GitHub项目对应的目录

2. 形态学操作

OpenCV中提供了几个非常有用的图像形态学操作API,其工作原理与卷积类似,

不同的是,

我们称卷积核为结构元素、

计算方式也由算术运算改为简单集合运算与逻辑运算,

而且可以将结构元素定义为任意结构。

最常见的结构元素有矩形、线形、圆形、十字交叉形等。

OpenCV支持的图像形态学操作主要有膨胀、腐蚀、开操作、闭操作、黑帽、顶帽、形态学梯度。

2.1.腐蚀与膨胀

膨胀与腐蚀是最基本的图像形态学操作,

与卷积计算类似,其也需要一个类似卷积核的结构元素,与输入图像像素数据完成计算,

腐蚀与膨胀的常见操作对象主要是二值图像或者灰度图像,

OpenCV所有的形态操作都可以扩展到彩色图像,

而腐蚀与膨胀扩展到彩色图像就是前面提到的图像最小值与最大值滤波。

关于腐蚀与膨胀操作,本参考书中讲得比较概况,而这方面我之前上课学到过,课内讲得相对详细些,下面便参考我校授课的郭素梅教授的教学PPT,做一个总结:

首先是腐蚀操作:

dc3048553c8f

其意义便是说,对于输入图像A:

能完全包含结果元素B的区域,则把B嵌进去,并仅留下一个被B的核中心覆盖下的像素块;

不能的,则淘汰掉(腐蚀/削 掉);

结合上图应该很容易能够理解;

另外还有一个拓展技巧,如下:

dc3048553c8f

dc3048553c8f其意思是说,我们可以根据结构元素以及输入图像的形状和腐蚀操作“放入模板,只留中心”的原理,

在面对较大的输入图像时,可以先把最外层的(可放入B的)腐蚀边界画出来,即可预算出腐蚀结果;

下面是腐蚀效果(腐蚀操作的作用的一个实例):

dc3048553c8f

腐蚀操作的作用:

即同上篇笔记的最小值滤波一样,

可以去除小的图像噪声或者图像元素对象的大小丝黏连,抑制图像像素极大值;

接下来是膨胀操作:

dc3048553c8f以及其技巧:

dc3048553c8f

dc3048553c8f

其意义可以这样理解:

以结构元素B与输入图像A有交集为条件,

令B绕着A转一圈,这样B的途经的这一圈地方会形成一个外围区域,

这样一来,这个外围区域是由若干个结构元素B构成的,

而每个B都有一个核中心,若干个核中心会在A外围圈出一个B的“核中心边界”,

接下来,令A的像素块由A的边界拓展到B的“核中心边界”,即完成膨胀操作;

上面是比较正规地用边界交集去理解完成膨胀操作,

我们私自暂称它为“核边界交集法”;

其实这样的做法也等价于下面这种操作:

把B的核中心沿着A的边界走一圈,

每途经A的一个像素块,

都令A的像素块由A的边界拓展到B的“核边界”;

这种操作的结果其实也是等同于上面的“核边界交集法”;

为与“边界交集法”区分理解,这种方法暂称之“核中心交集法”,

下面是“核中心交集法”演示的gif图:

dc3048553c8f

下面是膨胀效果(膨胀操作的作用的一个实例):

dc3048553c8f

膨胀操作的作用:

即同上篇笔记的最大值滤波一样,

可以填充小的闭合区域以及狭窄的间断;

下面切回读书笔记。

腐蚀操作的定义如图4-8所示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值