2.图像作为函数 | 噪音概念、图像相减_7

目录

噪音概念

图像差异


如果图像只是函数,那么我们可以对图像做一些我们可以对函数做的事情。

就像我们可以相加一样,你可以添加两个函数,对吧?

那么,我们可以添加两个图像。

噪音概念

我们将稍微介绍一下噪音的概念。

所以图像中的噪音:是另一个函数,与原始图像结合,得到了一个新的函数,我们把它写成新的图像。如图:

 

我们称I为“素数”。就是I (x, y)加上这个噪声函数。你知道,这意味着什么。

好吧,我们必须看看这个噪音函数会是什么?

好的,有很多种不同的噪音功能。

第一种噪音:盐椒噪音

这是一个,这个东西是Steve Sites公司提供的,有一种叫盐椒噪音

这不需要火箭科学家让你弄清楚它可能是什么,它需要你的原始图片,它会偶尔出现白点和偶尔的黑点。

由于显而易见的原因,这被称为盐椒噪音。

第二种噪音: 脉冲噪声

相对于那个叫做脉冲噪音的东西,你偶尔会得到一点白色斑点。不同类型的成像系统可能会给你那种噪音。

第三种噪音:高斯噪声

但到目前为止,您最熟悉的噪声通常是高斯噪声或正常分布的噪声。

我们基本上假设在每个像素处我们拍摄原始图像,并且我们在这里坚持一些独立的相同的值,这就是高斯噪声。

所谓高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

我们基本上假设在每个像素处我们拍摄原始图像,并且我们在这里坚持一些独立的相同的值,这就是高斯噪声。

大多数时候,当我们谈论噪音时,我们会讨论这个功能。

我们实际上可以让Matlab让我们成为一个噪音函数。如下代码:

>> im = imread('image.png');
>>
>> noise = randn(size(im)) .* sigma;
>> output = im + noise;

所以在这里我们说,看看我们要制作一个噪声数组,我采用我的图像的大小,随机生成一个平均值为零且标准偏差为1的噪声信号,以及 我们通过某种sigma来扩大规模。

这将把它扩散并使其变大,以便基本上是均值为零的噪声和a,sigma的标准偏差。如图:

因为函数只是函数而图像是函数,所以我可以添加它们。我可以说让我的输出只是图像加噪声。

在右边你可以看到我们的辣椒里有很多噪音。

如果我们把这个画出来,你可以看到这里我们得到了这个漂亮的干净的图这里我们添加了额外的噪声。

这就是我们的噪声函数。

图像差异

如果您可以相加图像,也可以减去它们。两个图像之间的差异只是一个图像减去另一个图像。

>> dolphin = imread('dolphin.png');
>> bicycle = imread('bicycle.png');
>>
>> diff = dolphin - bicycle;
>> imshow(diff);

运行结果:

一开始可能很难理解发生了什么。差异图像中值越大表示两个图像之间的差异越大。

此结果中较亮的区域表示两个图像的差异更大。

请注意,这是海豚减去自行车。这里的顺序很重要。

自行车减去海豚给我们带来了不同的结果。

这是有道理的,因为差异操作正在做的是简单地减去相应位置中的像素。

如果两个这样的像素值是a和b,那么a - b与b - a不同。

但是在考虑两幅图像之间的差异时,我们往往不关心哪一幅更大,哪一幅更少?

注意b - a就是a - b的负数。

当我们考虑两个图像之间的差异时,我们常常不在乎这种差异的迹象,而只在乎其大小。

也就是说,我们对两幅图像之间的绝对差异感兴趣。

为此,您可以使用Octave ABS或ABS功能。让我们看看这两个结果有多么不同。

>> dolphin = imread('dolphin.png');
>> bicycle = imread('bicycle.png');
>>
>> diff = dolphin - bicycle;
>> imshow(diff);
>>
>> ads_diff = abs(bicycle - dolphin);
>> imshow(abs_diff);

运行结果:

这两个看起来并没有什么不同。事实上,它们完全相同。这是怎么回事?

让我们仔细看看我们的代码。

特别是这一行。

>> diff = dolphin - bicycle;

假设减去两个值是自行车的20,海豚的56。从理论上讲,结果应该是负36。

但是还记得uint8吗?

这些图像只能表示0到255之间的数字。它被截断为零。

请注意,即使在绝对差异的情况下,也首先执行减法。该中间结果与原始的相互加减相同。

这里的数字已经在0到255之间,所以绝对值运算符没有任何区别。

那么我们应该怎么解决这个问题?

我们可以使用一个非常有趣的公式:

(a - b) + (b - a)

如果a大于b,则减去b将给出正确的差值。如果是零,则b大于a。

类似地,b减去a将给出正确的差值,其中b大于a,并且当a大于b时为零。

因此,总和实际上是我们想要的绝对差异。

有朋友会说转成Unit16就可以了,千万不要在面试时候这么说。。。。

因为这是是不行的!首先转类型,你要考虑到是否增加了可以存储的值的范围(也增加了内存)。

但实际原因:u表示无符号,这意味着uint16也不能代表负数,我们最终会得到和uint8相同的结果。

不过这里可以使用浮点图像!浮点图像可以固有地存储负值。因此,转换到浮点会有所帮助。

回到例子,幸运的是,有一个内置函数来计算保留值的图像差异。

我们不必显式转换数据类型或使用任何时髦的表达式。

此功能包含在Octave中的图像包或Matlab中的图像处理工具包中。

您可以通过键入pkg load然后输入包名称来加载包:

>> dolphin = imread('dolphin.png');
>> bicycle = imread('bicycle.png');
>>
>> diff = dolphin - bicycle;
>> imshow(diff);
>>
>> abs_diff = abs(dolphin - bicycle);
>> imshow(abs_diff);
>>
>> pkg load image;
>>
>> abs_diff2 = imabsdiff(dolphin, bicycle);
>> imshow(abs_diff2);

您可以通过键入pkg load然后输入包名称来加载包。我们想要的功能叫做imabsdiff。

imabsdiff:它需要两个参数。要减去的图像。顺序无关紧要。

让我们看看这与我们之前的尝试相比如何。

如您所见,这可以保留整个图像中图像差异的大小。

image包提供了更多功能来执行常见操作。有时间需要去随意探索它们。


——学会编写自己的代码,才能练出真功夫。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LibNoise分形噪声函数库的JAVA翻译版,个人开发,仅供参考。 包中包含: 异常模块: noise.Exception noise.ExceptionInvalidParam 无效的参数异常。 noise.ExceptionNoModule 无模块异常,无法检索到该源模块 noise.ExceptionOutOfMemory noise.ExceptionUnknown 模型模块: noise.model.Line 线 noise.model.Plane 平面 noise.model.Sphere 球体 noise.model.Cylinder 圆柱 发生器模块: noise.module.Perlin 培林噪声 noise.module.RidgedMulti 脊多重分形噪声 noise.module.Billow 巨浪 value = |perlin_value|*2-1.0; noise.module.Voronoi 细胞噪声,Voronoi图 noise.module.Const 常量 value = const; noise.module.Cylinders 圆柱 noise.module.Checkerboard 棋盘格 value = (floor(x) & 1 ^ floor(y) & 1 ^ floor(z) & 1) != 0 ? -1.0 : 1.0; noise.module.Spheres 球体 选择器模块: noise.module.Select 选择 noise.module.Blend 混合 value = ((1.0 - (modules[3].value+1)/2) * modules[0].value) + ((modules[3].value+1)/2 * modules[1].value); 修饰器模块: noise.module.Invert 倒置 value = -value; noise.module.Abs 绝对值 value = |value|; noise.module.Clamp 截取 value = (value < lowerBound ?lowerBound : value) or (value > upperBound ?upperBound : value);lowerBound:下截取值;upperBound:上截取值 noise.module.Curve 曲线 value = noise.module.Curve.ControlPoint 控制点 noise.module.ScaleBias 偏移缩放, value = value*scale+offset noise.module.Turbulence 湍流 value = modules[0].getValue(x+modules[1].value * power,y+modules[2].value * power,z+modules[3].value * power); noise.module.Exponent 指数 value = (pow(abs((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); 组合模块: noise.module.Add 添加 value = modules[0].value+modules[1].value; noise.module.Max 最大值 value = max(value); noise.module.Min 最小值 value = min(value); noise.module.Multiply 乘法 value = modules[0].value * modules[1].value; noise.module.Power 权重 value = pow(modules[0].value , modules[1].value); 变压模块: noise.module.Displace 位移替换,扭曲 value = modules[0].getValue(x+modules[1].value,y+modules[2].value,z+modules[3].value); noise.module.RotatePoint 点旋转 noise.module.ScalePoint 点缩放,轴缩放 value = modules[0].getValue (x * xScale, y * yScale,z * zScale); noise.module.Terrace 露台,梯台 noise.module.TranslatePoint 位移变换 value = modules[0].getValue (x * xTranslation, y * yTranslation,z * zTranslation); 其他: noise.module.Cache 缓存 value = noise.module.Module 噪声模块基类 如果发现有要更改的地方,请发邮件给我,或者本人QQ:343179390,欢迎技术探讨
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值