图像的归一化

Normalization of an image

我对灰度图像应用了一些操作,现在我得到了新值,但问题是强度值现在小于 0、介于 0 和 255 之间以及大于 255。对于 [[=12= 之间的值]] 没有问题,但对于强度值 < 0 和强度值 > 255 存在问题,因为这些值不会出现在灰度图像中。

因此,我需要对这些值进行归一化处理,使所有值(无论是负值还是大于 255 或任何其他值)都在 0 到 255 的范围内,以便可以显示图像。

为此我知道两种方法:

方法一

newImg = ((255-0)/(max(img(:))-min(img(:))))*(img-min(img(:)))

其中min(img(:))max(img(:))是对输入图像img进行一些操作后得到的最小值和最大值。 min 可以小于 0,max 可以大于 255。

方法二

我只是将所有小于0的值设为0,将所有大于255的值设为255,所以:

img(img < 0) = 0;
img(img > 255) = 255;

我尝试使用这两种方法,但使用第二种方法我得到了很好的结果,但使用第一种方法却没有。谁能告诉我问题出在哪里?

这完全取决于图像内容本身。这两种方法都有效确保值的范围在 [0,255] 之间。但是,在决定使用哪种方法之前,您需要问自己以下问题:

问题 #1 - 我的形象是什么

您需要问的第一个问题是您的图片代表什么?例如,如果这是边缘检测器的输出,您选择的方法将取决于结果中所见值的动态范围(更多内容见问题 #2)。例如,如果像素分布良好且方差较小,则最好使用第二种方法。但是,如果动态范围有点小,那么您将需要使用第一种方法来提高结果的对比度。

如果输出是图像减法,那么最好使用第一种方法,因为您希望可视化像素之间的确切差异。截断结果不会让您很好地看到差异。

问题 #2 - 值的动态范围是多少?

您需要注意的另一件事是最小值和最大值的动态范围有多宽。例如,如果最小值和最大值与 [0,255] 的限制相差不远,那么您可以使用第一种或第二种方法,您不会注意到太大的差异。但是,如果您的值在 [0,255] 的小范围内,那么执行第一种方法会增加对比度,而第二种方法不会做任何事情。如果您的目标是增加图像的对比度并且强度在有效 [0,255] 范围内,那么您应该使用第一种方法。

但是,如果您的最小值和最大值远离 [0,255] 范围,例如 min=-50max=350,那么执行第一种方法将不会成功很好 - 特别是 如果灰度强度有很大的差异。我所说的巨大差异的意思是,您将拥有高范围内的值,低范围内的值,除此之外别无其他。如果您使用第一种方法重新缩放,这将意味着最小值被推到 0,最大值被缩小到 255,其余强度在两者之间缩放,因此对于那些较低的值,它们被缩放以便它们'重新可视化为灰色。

问题 #3 - 我的图像是干净的还是有噪点的?

这是很多人都没有想到的事情。您的图像是否非常干净,或者是否有一些虚假的噪声点?当涉及到嘈杂的像素时,第一种方法非常糟糕。如果您只有几个具有非常大值的像素值,但其他像素在 [0,255] 范围内,这将使所有其他像素相应地重新缩放,从而降低图像的对比度.您可能想忽略这些像素的贡献,因此第二种方法更可取。

结论

因此,您所说的这两种方法都没有问题。您需要了解图像是什么、检查输出后看到的值的动态范围以及这是清晰图像还是嘈杂图像。您只需要在牢记这两个因素的情况下做出明智的选择。因此,在您的情况下,第一个输出可能不起作用,因为您有非常大的负值和大的正值,而且这些值中可能也很少。进行截断可能更适合您的应用程序。