Android OpenCV(十六):椒盐噪声

Stella981
• 阅读 671

椒盐噪声

椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。椒盐噪声是指两种噪声:盐噪声(salt noise)及椒噪声(pepper noise)。盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。

API

目前为止OpenCV 4中没有提供专门用于为图像添加椒盐噪声的函数。但是可以根据对椒盐的理解来手动生成。步骤如下图:

Android OpenCV(十六):椒盐噪声

生成步骤

操作

随着噪点数量的上升,添加噪声过程耗时也会增加。为了防止ANR,可自行考虑异步处理。

/** * 椒盐噪声 * author: yidong * 2020/3/31 */class SaltPepperNoiseActivity : AppCompatActivity() {    companion object {        fun launch(context: Context) {            val intent = Intent(context, SaltPepperNoiseActivity::class.java)            context.startActivity(intent)        }    }    private lateinit var mBinding: ActivitySaltPepperNoiseBinding    private lateinit var mRgb: Mat    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_salt_pepper_noise)        mBinding.presenter = this        val bgr = Utils.loadResource(this, R.drawable.lena)        mRgb = Mat()        Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB)        showMat(mBinding.ivLena, mRgb)    }    fun addNoise() {        hideKeyboard()        val source = mRgb.clone()        var number = 10000        try {            number = mBinding.etNoiseNumber.text.toString().toInt()        } catch (e: NumberFormatException) {        }        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.ivResult, source)        source.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)    }    private fun hideKeyboard() {        val inputMethodManager =            this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager        inputMethodManager.hideSoftInputFromWindow(            mBinding.ivLena.windowToken,            InputMethodManager.HIDE_NOT_ALWAYS        )    }    override fun onDestroy() {        mRgb.release()        super.onDestroy()    }}

效果

Android OpenCV(十六):椒盐噪声

椒盐噪声

源码

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年前
Android OpenCV(二十):高斯滤波
高斯滤波高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Android OpenCV(十七):高斯噪声
高斯噪声高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。这类噪声主要来源于电子电路噪声和低照明度或高温带来的传感器噪声,也成为正态噪声,是在实践中经常用到的噪声模型。区别于椒盐噪声随机出现在图像中的任意位置,高斯噪声出现在图像中的所有位置。且概率密度函
Stella981 Stella981
3年前
Inter Speech19
内容有很多是来之与论文,PPT,知乎的回答,侵权就加上您的信息~谢谢.1\.VQvae不懂.2. 噪声加权的一个主要用途是测量音频设备中的残余噪声,通常在节目材料的安静时刻以嘶嘶声或嗡嗡声的形式出现。这里加权的目的是为了强调我们的耳朵最容易感知到的听觉频谱部分,并减弱对我们响度感知影响较小的部分,以便得到一个与主观效果很好相关的测量数据
四儿 四儿
1年前
语音识别技术的挑战与机遇再探讨
一、引言随着科技的不断发展,语音识别技术得到了广泛应用。然而,语音识别技术在发展过程中面临着许多挑战,同时也带来了许多机遇。本文将再探讨语音识别技术的挑战与机遇。二、语音识别技术的挑战1.噪声干扰和口音差异:噪声干扰和口音差异是语音识别中最常见的挑战之一。
贾元春 贾元春
5个月前
Stable Diffusion 商业变现与绘画大模型多场景实战[完结12章]
前言:ai绘画软件StableDiffusion(软件下载,自己还原:/s/1Ayqx1caFcUluUFgflXEAg提取码:53h7)是一种通过模拟扩散过程,将噪声图像转化为目标图像的文生图模型,具有较强的稳定性和可控性,可以将文本信息自动转换成高质量