我在灰度图像上应用了一些操作,现在我得到了新值,但问题是强度值现在小于0,0到255之间且大于255.对于[0-255
]之间的值没有问题,但强度值<1。 0和强度值&gt; 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 :(得分:7)
这完全取决于图像内容本身。这两种方法都有效,可确保值范围介于[0,255]
之间。但是,在您决定使用何种方法之前,您需要问自己以下问题:
您需要问的第一个问题是您的图片代表什么?例如,如果这是边缘检测器的输出,则您选择的方法将取决于结果中看到的值的动态范围(更多见于问题#2)。例如,如果像素分布良好且方差较小,则最好使用第二种方法。但是,如果动态范围稍微小一些,那么您将要使用第一种方法来提高结果的对比度。
如果输出是图像减法,那么最好使用第一种方法,因为您想要可视化像素之间的确切差异。截断结果不会让您很好地了解差异。
您需要注意的另一件事是有多宽最小值和最大值的动态范围。例如,如果最小值和最大值与[0,255]
的限制相差不远,那么您可以使用第一种或第二种方法,但您不会注意到差异。但是,如果您的值在[0,255]
范围内的小范围内,那么第一种方法会增加对比度,而第二种方法不会做任何事情。如果你的目标是增加图像的对比度,如果强度在有效[0,255]
范围内,那么你应该采用第一种方法。
但是,如果您的最小值和最大值距离[0,255]
范围相当远,例如min=-50
和max=350
,则第一种方法不会出现问题很好 - 如果灰度强度有很大差异,尤其。我的意思是巨大的差异是你会有高范围的值,低范围的值,没有别的。如果你使用第一种方法重新缩放,这意味着最小值被推到0,最大值被缩小到255,其余的强度在两者之间缩放,因此对于那些较低的值,它们会被缩放以便它们&# 39;重新显示为灰色。
这是很少有人想到的。你的形象很干净,还是有几个虚假的嘈杂斑点?当涉及到噪声像素时,第一种方法非常糟糕。如果您只有几个像素值具有非常大的值但其他像素在[0,255]
范围内,则会使所有其他像素相应地重新缩放,从而降低图像的对比度。您可能希望忽略这些像素所做的贡献,因此第二种方法更可取。
因此,您所谈到的这两种方法都没有错。您需要了解图像是什么,检查输出时看到的值的动态范围以及这是否是清晰或嘈杂的图像。你只需要做出明智的选择,牢记这两个因素。所以在你的情况下,第一个输出可能不起作用,因为你有非常大的负值和大的正值,也许这些值也很少。对您的应用程序执行截断可能更好。