Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android图像处理 - 高斯模糊的原理及实现

Android图像处理 - 高斯模糊的原理及实现

作者头像
天天P图攻城狮
发布于 2018-02-02 08:41:47
发布于 2018-02-02 08:41:47
4.7K2
举报
文章被收录于专栏:天天P图攻城狮天天P图攻城狮

前言

高斯模糊是图像处理中几乎每个程序员都或多或少听过的名词,但是对其原理大家可能并不了解,只知道通过高斯模糊能实现图像毛玻璃效果。

本文首先介绍图像处理中最基本的概念:卷积;随后介绍高斯模糊的核心内容:高斯滤波器;接着,我们从头实现了一个Java版本的高斯模糊算法,以及实现RenderScript版本。由于我们自己实现的Java版本的高斯模糊算法的效率太低,因此最后介绍比较有名的高斯模糊的开源项目:Blurry以及BlurKit-Android。

BlurDemo是本文的配套Demo:

  • Demo1:Java版本的高斯模糊的简单实现。
  • Demo2:RenderScript的高斯模糊实现。
  • Demo3:BlurKit-Android的基本使用。
  • Demo4:Blurry的基本使用。

卷积

本文只讨论图像,而图像可以表示为二维矩阵,其中每个元素为ARGB像素值,因此这里讨论二维矩阵的卷积操作。卷积(Convolution)是图像处理中最基本的操作,就是一个二维矩阵A(M*N)和一个二维矩阵B(m*n)做若干操作,生成一个新的二维矩阵C(M*N),其中m和n远小于M和N,B称为卷积核(kernel),又称滤波器矩阵或模板。

这里举个卷积的例子,如图:

上图中,最左边的是源矩阵(8*8),中间是卷积核(3*3,半径为1),最右边是通过对前面两个矩阵做卷积生成的结果矩阵。图中,如果我们要求出结果矩阵中第二行第二列的元素的值,则把卷积核的中心元素(值为0)和源矩阵的第二行第二列(值为6)对齐,然后求加权和,即图中的公式,最后得到-3。

我们再举一个例子:

上图也展示了如何做卷积的过程,比如要求出结果矩阵中第一行第一列的值,则把卷积核的中心对准源矩阵的第一行第一列,发现部分区域超出源矩阵的范围了(图中红色部分),解决方法有很多,这里的方案是:用边界值填充。接着做加权和,结果为-5。接着用同样的方法依次计算结果矩阵的每个元素即可。

通常来说卷积核需要满足:

  • 宽和高都为奇数,这样才会有半径和中心的概念。
  • 元素总和为1。

滤波器

均值滤波器

均值滤波器(Mean Filter)是最简单的一种滤波器,它是最粗糙的一种模糊图像的方法,高斯滤波是均值滤波的高级版本。实际上不同的滤波器就是通过改变卷积核(滤波器),从而改变最后的结果矩阵,中间步骤都一样,都是求加权和。均值滤波器的卷积核通常是m*m的矩阵,其中每个元素为1/(m^2),可以看出卷积核的元素总和为1。比如3*3的均值滤波器,卷积核的每个元素就是1/9。

高斯滤波器

高斯滤波器是均值滤波器的高级版本,唯一的区别在于,均值滤波器的卷积核的每个元素都相同,而高斯滤波器的卷积核的元素服从高斯分布。

高斯滤波器是基于二维的高斯分布函数,因此首先介绍二维高斯分布函数。二维高斯分布函数和图如下:

其中x和y表示卷积核中某个元素横坐标和纵坐标距离中心点的距离。sigma控制曲线的平缓程度,值越大,越平缓,最高点越低。我们可以轻易看出当x=0且y=0时值最大,即卷积核的中心点权重最大。

比如卷积核中一个元素距离中心点,横向距离2,纵向距离1,那么x=2,y=1,就能求出该元素的值。当然为了保证卷积核元素总和为1,最后每个元素都需要除以卷积核中所有元素之和。

怎么确定卷积核的大小呢?确定sigma之后,虽然不管距离中心点多远,该元素的高斯分布函数值总为非负数,但是根据经验,卷积核的半径定为3*sigma,因此宽高为6*sigma+1。

如果高斯滤波器的卷积核是二维的(m*n),则算法复杂度为O(m*n*M*N),复杂度较高,因此接下来我们对算法复杂度进行优化。

一维的高斯分布函数和图如下:

实际上,二维高斯分布函数可以分解为两个一维高斯分布函数相乘,如下:

因此原本的源矩阵和二维卷积核做卷积等价于源矩阵先与1*m的一维卷积核做卷积,再与m*1的一维卷积核做卷积。一维卷积核的半径仍定为3*sigma。此时算法复杂度变为O(2*m*M*N)。

高斯模糊的实现

Java版本

这里实现了简单版本的高斯模糊,通过使用横向和纵向的一维高斯滤波器分别对源矩阵卷积,通过设置sigma的大小能控制图片的模糊程度,值越大越模糊。但是算法速度仍比较慢,建议直接使用RenderScript版本或直接使用成熟的开源项目。

由于代码过长,不能截图,因此直接给出Gist地址:https://gist.github.com/xiazdong/d57bf5441f56db197163a5de69dfa65f

效果如下:

RenderScript版本

RenderScript是Android提出的一个计算密集型任务的高性能框架,能并行的处理任务,他可以充分利用多核CPU和GPU,你不需要管怎么调度你的任务,只需要管任务具体做什么。这里不深入介绍RenderScript,因为RenderScript已经提供了一个实现高斯模糊的类:ScriptIntrinsicBlur。

实现起来非常简单:

开源项目

关于Android图像模糊的开源项目有很多,比如Blurry是专门针对Bitmap或View做模糊,可以设置模糊的基底色,而且还能对模糊操作异步化;BlurKit-Android也能对Bitmap做高斯模糊(内部通过RenderScript实现),但最吸引人的是实现了毛玻璃的遮罩,效果如下:

BlurKit-Android支持的最低版本是Android 4.1(API 16),因此如果应用需要支持的最低版本是4.0,则不能使用该库,Blurry支持的最低版本是3.0。

BlurKit-Android

配置过程如下:

  • 在build.gradle中设置:compile 'com.wonderkiln:blurkit:1.0.0',并在defaultConfig中设置renderscriptTargetApi 24renderscriptSupportModeEnabled true
  • 在Application的onCreate()最开始处加入BlurKit.init(this);

配置完成后,通过调用BlurKit.getInstance().blur(Bitmap src, int radius);实现高斯模糊,并会把高斯模糊的结果图写入src,其中0<radius<=25。

该库还提供了fastBlur()实现速度更快的高斯模糊,和blur()的区别在于,fastBlur()在高斯模糊之前对图片采样,使得图片大小缩小好几倍,从而加快高斯模糊的速度。这种加快速度的方法是合理的,因为高斯模糊并不需要原图像很精确的信息。

BlurKit-Android最吸引人的是提供高斯模糊的遮罩(BlurLayout),随着遮罩下面的内容的变化,高斯模糊效果也会随之改变。使用如下:

该Layout能够实现实时的对该Layout下面的内容做高斯模糊。

Blurry

配置方法:在build.gradle中添加compile 'jp.wasabeef:blurry:2.1.1'

使用方法如下:

总的来说,这两个库都使用起来非常方便。


作者简介:damonxia(夏正冬),天天P图Android工程师

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 天天P图攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
感谢,学习了
感谢,学习了
回复回复点赞举报
原来是这样形成的
原来是这样形成的
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Task04 图像滤波
图像的实质是一种二维信号,滤波是信号处理中的一个重要概念。在图像处理中,滤波是一种非常常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图像滤波对理解卷积神经网络也有一定帮助。
致Great
2020/04/30
7040
理解图像中卷积操作的含义
大家好,又见面了,我是你们的朋友全栈君。 原文地址:https://blog.csdn.net/chaipp0607/article/details/72236892?locationNum=9
全栈程序员站长
2022/09/01
9300
理解图像中卷积操作的含义
FPGA图像处理之高斯滤波算法理论篇
对计算机视觉、多媒体应用、通信技术等领域来说,实时的数字图像处理是其中的重点学科之一。传统的前端数字信号处理(Digital SignalProcessing,DSP)算法,例如 FFT、FIR、IIR 滤波器,大多都是利用 ASIC 或者 PDSP 来构建的,在硬件的实现中很难满足实时性的要求。现场可编程逻辑门阵列(Field ProgrammableGate Arrays, FPGA)技术在数字信号处理中的应用,将逐渐成为前端信号处理的主流。而滤波器算法在信号处理、信号检测、通信领域有着重要的作用,在实时信息处理系统中,对滤波器的性能和处理速度有着严格的要求,特别是在满足系统性能的条件下,处理速度至关重要。
FPGA开源工作室
2019/10/29
1.9K0
FPGA图像处理之高斯滤波算法理论篇
图像处理算法其实都很简单「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。要学习高斯模糊我们首先要知道一些基本概念:
全栈程序员站长
2022/08/30
5890
图像处理算法其实都很简单「建议收藏」
CV学习笔记(六):均值滤波与高斯滤波
过滤是信号和图像处理中基本的任务。其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息。过滤可以移除图像中的噪音、提取感兴趣的可视特征、允许图像重采样等等。频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分.
云时之间
2020/02/12
1.2K0
图像滤波算法总结[通俗易懂]
该篇主要是对图像滤波算法一个整理 1:图像滤波既可以在实域进行,也可以在频域进行。图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。 图像滤波可以通过公式: O(i,j)=∑m,nI(i+m,j+n)∗K(m,n) O ( i , j ) = ∑ m , n I ( i + m , j + n ) ∗ K ( m , n ) O(i,j) = \sum_{m,n}^{ }I(i+m,j+n)*K(m,n) 其中K为滤波器,在很多文献中也称之为核(kernel)。常见的应用包括去噪、图像增强、检测边缘、检测角点、模板匹配等。
全栈程序员站长
2022/06/29
2K0
图像滤波算法总结[通俗易懂]
【计算机视觉】三、图像处理——实验:图像去模糊和去噪、提取边缘特征
  二维卷积运算是信号处理和图像处理中常用的一种运算方式,当给定两个二维离散信号或图像
Qomolangma
2024/07/30
2500
【计算机视觉】三、图像处理——实验:图像去模糊和去噪、提取边缘特征
高斯模糊
一、高斯模糊的概念 高斯模糊,也叫高斯平滑,英文为:Gaussian Blur,是图像处理中常用的一种技术,主要用来降低图像的噪声和减少图像的细节。高斯模糊在许多图像处理软件中也得到了广泛的应用。
Tyan
2022/05/09
4.6K0
高斯模糊
机器视觉检测中的图像预处理方法
本文以Dalsa sherlock软件为例,一起来了解一下视觉检测中平滑模糊的图像处理方法。
智能算法
2020/08/28
2.7K0
机器视觉检测中的图像预处理方法
图像卷积与滤波参考资料:
首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。 注意:卷积和协相关的差别是,卷积需要先对滤波矩阵进行180的翻转,但如果矩阵是对称的,那么两者就没有什么差别了。
keloli
2018/09/13
1.1K0
【OpenCV入门之十六】多种方式模糊图像
其中:f()表示一副图像,i、j表示图像的行和列,h(k,l)表示卷积算子(和)(也可以叫掩膜),k l又可以叫窗口大小(掩膜的大小,比如3*3),g()表示输出的像素值;
小白学视觉
2019/06/02
5930
传统图像处理算法总结
normalize = true 时,方框滤波就变成了均值滤波。也就是说,均值滤波是方框滤波归一化(normalized)后的特殊情况。
全栈程序员站长
2022/08/29
2.2K0
传统图像处理算法总结
理解图像卷积操作的意义
chaibubble
2018/01/02
3.9K0
理解图像卷积操作的意义
数字图像处理中常见的变换核及其用途
图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
zy010101
2020/03/18
1.7K0
数字图像处理中常见的变换核及其用途
Java实现高斯模糊和图像的空间卷积
其中r是模糊半径,r^2 = x^2 + y^2,σ是正态分布的标准偏差。在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果。
fengzhizi715
2018/08/24
1.5K0
Java实现高斯模糊和图像的空间卷积
图像降噪有哪些方法?
图像增强是图像处理和计算机视觉中的重要研究课题。它主要用作图像预处理或后处理,以使处理后的图像更清晰,以便随后进行图像分析和理解。本期我们主要总结了图像增强中图像去噪的主要方法以及对不同算法的基本理解。
小白学视觉
2020/09/29
2.8K0
图像降噪有哪些方法?
图像处理算法 之 滤波 模糊(基于OpenCV)
高斯噪声是指幅值的概率密度函数服从高斯分布的噪声,如果其功率谱密度服从均匀分布,则为高斯白噪声。
233333
2020/11/11
9440
图像处理算法 之 滤波 模糊(基于OpenCV)
图像卷积与滤波的一些知识点
之前在学习CNN的时候,有对卷积进行一些学习和整理,后来就烂尾了,现在稍微整理下,先放上来,以提醒和交流。
bear_fish
2018/09/19
1.3K0
图像卷积与滤波的一些知识点
一文轻松学会图形失真修复-图像去噪滤波算法汇总(Python)
看完本篇文章的所有操作和实践,就不需要去花钱修复照片了自己也能做到而且保证十分便捷!本篇文章将介绍常用到的图像去噪滤波算法,采用实例代码和处理效果一并展现的方式进行介绍,能够更直观的看到每种算法的效果。本篇文章偏实战,所以不会涉及到过多每种算法的原理理论计算公式,以一篇文章快速了解并实现这些算法,以效率最高的方式熟练这些知识。
fanstuck
2024/01/24
1.7K0
一文轻松学会图形失真修复-图像去噪滤波算法汇总(Python)
opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波[通俗易懂]
方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。 通用的滤波kernel如下:
全栈程序员站长
2022/07/25
1.5K0
opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波[通俗易懂]
推荐阅读
相关推荐
Task04 图像滤波
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档