A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

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

噪音概念

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

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


我们称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将给出正确的差值。如果是零,则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包提供了更多功能来执行常见操作。有时间需要去随意探索它们。


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马