高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。这类噪声主要来源于电子电路噪声和低照明度或高温带来的传感器噪声,也成为正态噪声,是在实践中经常用到的噪声模型。
区别于椒盐噪声随机出现在图像中的任意位置,高斯噪声出现在图像中的所有位置。且概率密度函数如下所示:
其中z表示图像像素灰度值,μ表示像素值的平均值或期望值,σ表示像素值的标准差。标准差的平方σ2称为方差。μ是正态分布的位置参数,描述正态分布的集中趋势位置。概率规律为取与μ邻近的值的概率大,而取离μ越远的值的概率越小。正态分布以X=μ为对称轴,左右完全对称。正态分布的期望、均数、中位数、众数相同,均等于μ。
σ描述正态分布资料数据分布的离散程度,σ越大,数据分布越分散,σ越小,数据分布越集中。也称为是正态分布的形状参数,σ越大,曲线越扁平,反之,σ越小,曲线越瘦高。
API
目前为止OpenCV 4中没有提供专门用于为图像添加高斯噪声的函数。步骤如下图:
操作
/**
* 高斯噪声
* author: yidong
* 2020/4/4
*/
class GaussianNoiseActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityGaussianNoiseBinding
private lateinit var mRgb: Mat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_gaussian_noise)
val bgr = Utils.loadResource(this, R.drawable.lena)
mRgb = Mat()
Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB)
showMat(mBinding.ivLena, mRgb)
buildGaussian()
}
private fun buildGaussian() {
val noise = Mat(mRgb.size(), mRgb.type())
val result = Mat()
val mean = MatOfDouble()
val dev = MatOfDouble()
Core.meanStdDev(mRgb, mean, dev)
Core.randn(noise, mean[0, 0][0], dev[0, 0][0])
showMat(mBinding.ivGaussian, noise)
Core.add(mRgb, noise, result)
showMat(mBinding.ivResult, result)
noise.release()
result.release()
}
override fun onDestroy() {
mRgb.release()
super.onDestroy()
}
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)
}
}