图像的归一化
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=-50
和 max=350
,那么执行第一种方法将不会成功很好 - 特别是 如果灰度强度有很大的差异。我所说的巨大差异的意思是,您将拥有高范围内的值,低范围内的值,除此之外别无其他。如果您使用第一种方法重新缩放,这将意味着最小值被推到 0,最大值被缩小到 255,其余强度在两者之间缩放,因此对于那些较低的值,它们被缩放以便它们'重新可视化为灰色。
问题 #3 - 我的图像是干净的还是有噪点的?
这是很多人都没有想到的事情。您的图像是否非常干净,或者是否有一些虚假的噪声点?当涉及到嘈杂的像素时,第一种方法非常糟糕。如果您只有几个具有非常大值的像素值,但其他像素在 [0,255]
范围内,这将使所有其他像素相应地重新缩放,从而降低图像的对比度.您可能想忽略这些像素的贡献,因此第二种方法更可取。
结论
因此,您所说的这两种方法都没有问题。您需要了解图像是什么、检查输出后看到的值的动态范围以及这是清晰图像还是嘈杂图像。您只需要在牢记这两个因素的情况下做出明智的选择。因此,在您的情况下,第一个输出可能不起作用,因为您有非常大的负值和大的正值,而且这些值中可能也很少。进行截断可能更适合您的应用程序。
我对灰度图像应用了一些操作,现在我得到了新值,但问题是强度值现在小于 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=-50
和 max=350
,那么执行第一种方法将不会成功很好 - 特别是 如果灰度强度有很大的差异。我所说的巨大差异的意思是,您将拥有高范围内的值,低范围内的值,除此之外别无其他。如果您使用第一种方法重新缩放,这将意味着最小值被推到 0,最大值被缩小到 255,其余强度在两者之间缩放,因此对于那些较低的值,它们被缩放以便它们'重新可视化为灰色。
问题 #3 - 我的图像是干净的还是有噪点的?
这是很多人都没有想到的事情。您的图像是否非常干净,或者是否有一些虚假的噪声点?当涉及到嘈杂的像素时,第一种方法非常糟糕。如果您只有几个具有非常大值的像素值,但其他像素在 [0,255]
范围内,这将使所有其他像素相应地重新缩放,从而降低图像的对比度.您可能想忽略这些像素的贡献,因此第二种方法更可取。
结论
因此,您所说的这两种方法都没有问题。您需要了解图像是什么、检查输出后看到的值的动态范围以及这是清晰图像还是嘈杂图像。您只需要在牢记这两个因素的情况下做出明智的选择。因此,在您的情况下,第一个输出可能不起作用,因为您有非常大的负值和大的正值,而且这些值中可能也很少。进行截断可能更适合您的应用程序。