Android OpenCV(二十):高斯滤波

Stella981
• 阅读 904

高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

高斯滤波是利用高斯核的一个2维的卷积算子,用于图像模糊化(去除细节和噪声)。

API

public static void GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX, double sigmaY, int borderType)
  • 参数一:src,待高斯滤波图像,图像可以具有任意的通道数目,但是数据类型必须为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。

  • 参数二:dst,输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。

  • 参数四:ksize,高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。

  • 参数五:sigmaX,X方向的高斯滤波器标准偏差。

  • 参数六:sigmaY,Y方向的高斯滤波器标准偏差; 如果输入量为0,则将其设置为等于sigmaX,如果两个轴的标准差均为0,则根据输入的高斯滤波器尺寸计算标准偏差。

  • 参数七:borderType,像素外推法选择标志。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

操作

/** * 高斯滤波 * author: yidong * 2020/4/25 */class GaussianFilterActivity: AppCompatActivity() {    private lateinit var mBinding: ActivityGaussianFilterBinding    private lateinit var mRgb: Mat    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_gaussian_filter)        val bgr = Utils.loadResource(this, R.drawable.lena)        mRgb = Mat()        Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB)        bgr.release()        showMat(mBinding.ivLena, mRgb)    }    override fun onCreateOptionsMenu(menu: Menu?): Boolean {        menuInflater.inflate(R.menu.menu_gaussian_filter, menu)        return true    }    override fun onOptionsItemSelected(item: MenuItem): Boolean {        when (item.itemId) {            R.id.menu_5_5 -> {                showMat(mBinding.ivLena, mRgb)                val result = Mat()                Imgproc.GaussianBlur(mRgb, result, Size(5.0, 5.0), 10.0, 20.0)                showMat(mBinding.ivResult, result)                result.release()            }            R.id.menu_9_9 -> {                showMat(mBinding.ivLena, mRgb)                val result = Mat()                Imgproc.GaussianBlur(mRgb, result, Size(9.0, 9.0), 10.0, 20.0)                showMat(mBinding.ivResult, result)                result.release()            }            R.id.menu_salt_pepper_noise_9_9 -> {                saltPepperNoiseAndMeanFilter(9.0)            }            R.id.menu_salt_pepper_noise_5_5 -> {                saltPepperNoiseAndMeanFilter(5.0)            }            R.id.menu_gaussian_noise_9_9 -> {                gaussianNoiseAndMeanFilter(9.0)            }            R.id.menu_gaussian_noise_5_5 -> {                gaussianNoiseAndMeanFilter(5.0)            }        }        return true    }    private fun saltPepperNoiseAndMeanFilter(size:Double) {        val source = mRgb.clone()        val number = 10000        for (k in 0..number) {            val i = (0..1000).random() % source.cols()            val j = (0..1000).random() % source.rows()            when ((0..100).random() % 2) {                0 -> {                    when (source.channels()) {                        1 -> {                            source.put(j, i, 255.0)                        }                        2 -> {                            source.put(j, i, 255.0, 255.0)                        }                        3 -> {                            source.put(j, i, 255.0, 255.0, 255.0)                        }                        else -> {                            source.put(j, i, 255.0, 255.0, 255.0, 255.0)                        }                    }                }                1 -> {                    when (source.channels()) {                        1 -> {                            source.put(j, i, 0.0)                        }                        2 -> {                            source.put(j, i, 0.0, 0.0)                        }                        3 -> {                            source.put(j, i, 0.0, 0.0, 0.0)                        }                        else -> {                            source.put(j, i, 0.0, 0.0, 0.0, 0.0)                        }                    }                }            }        }        showMat(mBinding.ivLena, source)        val result = Mat()        Imgproc.GaussianBlur(mRgb, result, Size(size, size), 10.0, 20.0)        showMat(mBinding.ivResult, result)        result.release()        source.release()    }    private fun gaussianNoiseAndMeanFilter(size:Double) {        val source = mRgb.clone()        val noise = Mat(source.size(), source.type())        val gaussian = Mat()        Core.randn(noise, 20.0, 50.0)        Core.add(source, noise, gaussian)        showMat(mBinding.ivLena, gaussian)        val result = Mat()        Imgproc.GaussianBlur(mRgb, result, Size(size, size), 10.0, 20.0)        showMat(mBinding.ivResult, result)        source.release()        noise.release()        gaussian.release()        result.release()    }    private fun showMat(view: ImageView, source: Mat) {        val bitmap = Bitmap.createBitmap(source.width(), source.height(), Bitmap.Config.ARGB_8888)        Utils.matToBitmap(source, bitmap)        view.setImageBitmap(bitmap)    }    override fun onDestroy() {        mRgb.release()        super.onDestroy()    }}

效果

Android OpenCV(二十):高斯滤波

高斯滤波

可以很明显的看到,针对椒盐噪声或者高斯噪声,5*5的高斯核就能起到很好的抑制作用,并且图片不会太模糊

源码

https://github.com/onlyloveyd/LearningAndroidOpenCV

本文分享自微信公众号 - 微卡智享(VaccaeShare)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
OpenCV 应用(1)卡尔曼滤波跟踪
0卡尔曼OPENCV预测鼠标位置卡尔曼滤波不要求信号和噪声都是平稳过程的假设条件。对于每个时刻的系统扰动和观测误差(即噪声),只要对它们的统计性质作某些适当的假定,通过对含有噪声的观测信号进行处理,就能在平均的意义上,求得误差为最小的真实信号的估计值。因此,自从卡尔曼滤波理论问世以来,
Stella981 Stella981
3年前
OpenCV+Python 文字识别(重点图像透视变换)
1Author:WinterLiuiscoming!2importcv2ascv3importnumpyasnp4importpytesseract567预处理,高斯滤波(用处不大),4次开操作8过滤轮廓唯一
Stella981 Stella981
3年前
OpenCV 之 空间滤波
1 空间滤波 1.1 基本概念空间域,在图像处理中,指的是像平面本身;空间滤波,则是在像平面内,对像素值所进行的滤波处理。!(https://oscimg.oschina.net/oscnet/0daafa04976ff550daa79ae366f301bdfac.png)如上图所示,假
Stella981 Stella981
3年前
Android OpenCV(十八):均值滤波
均值滤波均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)∑f(x,y)/mm为该模板中
Stella981 Stella981
3年前
Python OpenCV学习笔记之:图像滤波处理
\\coding:utf8\图像滤波'''图像处理也支持低通滤波(LPF)和高通滤波(HPF)处理OpenCV提供filter2D函数对图像进行滤波处理'''importcv2ascvimportnumpyasnpimportmatplotlib.pyplotasplt读取图像img
Stella981 Stella981
3年前
Android OpenCV(十七):高斯噪声
高斯噪声高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。这类噪声主要来源于电子电路噪声和低照明度或高温带来的传感器噪声,也成为正态噪声,是在实践中经常用到的噪声模型。区别于椒盐噪声随机出现在图像中的任意位置,高斯噪声出现在图像中的所有位置。且概率密度函