Android OpenCV(十六):椒盐噪声

椒盐噪声

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

API

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

生成步骤

操作

随着噪点数量的上升,添加噪声过程耗时也会增加。为了防止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()    }}

效果

椒盐噪声

源码

https://github.com/onlyloveyd/LearningAndroidOpenCV

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

OpenCV 应用(1)卡尔曼滤波跟踪

0卡尔曼OPENCV预测鼠标位置卡尔曼滤波不要求信号和噪声都是平稳过程的假设条件。对于每个时刻的系统扰动和观测误差(即噪声),只要对它们的统计性质作某些适当的假定,通过对含有噪声的观测信号进行处理,就能在平均的意义上,求得误差为最小的真实信号的估计值。因此,自从卡尔曼滤波理论问世以来,

Android OpenCV(二十):高斯滤波

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