Nav*_*eep 4 matlab image image-processing
我在灰度图像上应用了一些操作,现在我得到了新值,但问题是强度值现在小于0,0到255之间且大于255.对于[ 0-255
] 之间的值,没有问题,但对于强度值<0和强度值> 255存在问题,因为这些值不能出现在灰度图像中.
因此,我需要对值进行标准化,以使所有值无论是负数还是大于255或其他任何值都在0到255范围内,以便可以显示图像.
为此,我知道两种方法:
newImg = ((255-0)/(max(img(:))-min(img(:))))*(img-min(img(:)))
Run Code Online (Sandbox Code Playgroud)
where min(img(:))
和max(img(:))
是在输入图像上执行某些操作后获得的最小值和最大值img
.所述min
可小于0,并且max
可以是大于255.
我只是将小于0的所有值设为0,将所有大于255的值设为255,所以:
img(img < 0) = 0;
img(img > 255) = 255;
Run Code Online (Sandbox Code Playgroud)
我尝试使用这两种方法,但我使用第二种方法获得了良好的结果,但没有使用第一种方法.你能有人告诉我这是什么问题吗?
这完全取决于图像内容本身.这两种方法都有效,以确保值范围介于两者之间[0,255]
.但是,在您决定使用何种方法之前,您需要问自己以下问题:
你要问的第一个问题是什么没有你的形象代表?例如,如果这是边缘检测器的输出,则您选择的方法将取决于结果中所见值的动态范围(更多内容见问题#2).例如,如果像素分布良好且方差较小,则最好使用第二种方法.但是,如果动态范围稍微小一些,那么您将需要使用第一种方法来提高结果的对比度.
如果输出是图像减法,则最好使用第一种方法,因为您想要可视化像素之间的确切差异.截断结果不会让您很好地了解差异.
您需要注意的另一件事是最小值和最大值的动态范围有多宽.例如,如果最小值和最大值距离极限值不远[0,255]
,那么您可以使用第一种或第二种方法,并且您不会注意到很大的差异.但是,如果您的值在一个小范围内[0,255]
,那么第一种方法会增加对比度,而第二种方法则不会做任何事情.如果你的目标是增加图像的对比度,如果强度在有效[0,255]
范围内,那么你应该做第一种方法.
但是,如果你的最小值和最大值离这个[0,255]
范围很远,比如min=-50
和max=350
,那么第一种方法就不会很好 - 特别是如果灰度强度有很大的差异.我的意思是巨大的差异是你会有高范围的值,低范围的值,没有别的.如果你使用第一种方法重新缩放,这意味着最小值被推到0,最大值缩小到255,其余强度在两者之间缩放,因此对于那些较低的值,它们会被缩放以便它们'重新显示为灰色.
这是很多人都没有想到的事情.你的形象很干净,还是有几个虚假的嘈杂斑点?对于噪声像素,第一种方法非常糟糕.如果您只有几个像素值具有非常大的值但其他像素在范围内[0,255]
,则会使所有其他像素相应地重新缩放,从而降低图像的对比度.您可能希望忽略这些像素所做的贡献,因此第二种方法更可取.
因此,您所谈到的任何一种方法都没有错.您需要了解图像是什么,检查输出后看到的动态值范围以及图像是否清晰或嘈杂.你只需要做出明智的选择,牢记这两个因素.所以在你的情况下,第一个输出可能不起作用,因为你有非常大的负值和大的正值,也许这些值也很少.对您的应用程序执行截断可能更好.
归档时间: |
|
查看次数: |
5031 次 |
最近记录: |