冈萨雷斯数字图像处理-数字图像基础(Matlab)-图像的灰度变换

前面两节介绍了图像的空间操作,包括图像的缩放旋转,图像的加减乘除及其应用。这里主要介绍图像的灰度变换。

图像的灰度变换是在图像的单个像素上操作,主要是以对比度和阈值处理为目的。因此,这里的灰度变换是在空间域中进行的。

图像反转

图像反转通过反转图像的灰度值,得到照片底片,以使得当黑色面积占主导地位时,通过该操作来增强图像中的白色或灰色细节。其可以通过下面的公式表示。其中r为原图像灰度值,L为图片的灰度级,当图片数据格式为uint8时,L=256s为反转后的像素值。


Matlab实现代码如下,imadjust用来对图像进行灰度变换。其语法是g=imadjust(f,[low_in high_in],[low_out high_out],gamma),其中f为原图像灰度数据,[low_in high_in],[low_out high_out]表示将low_inhigh_in之间的值映射到[low_out high_out]。该值取值范围为[0,1]实际根据数据格式乘以相应的灰度级。例如当数据为uint8[0,1]相当于[0,255]。

Breast=imread('原始数字乳房X射线照片.jpg');
Breast_gray=rgb2gray(Breast);
g1=imadjust(Breast_gray,[0,1],[1,0]);

figure(1)
subplot(1,2,1)
imshow(Breast_gray)
title('原始数字乳房X射线照片')
subplot(1,2,2)
imshow(g1)
title('反转后照片')

执行上述程序,我们可以得到下图。原图像是一幅数字乳房X射线照片,其中显示有一小块病变。通过反转操作,我们可以很清晰方便的观察到该病变位置。


图像对数变换

图像的对数变换可以用下列公式表示:


扫描二维码关注公众号,回复: 1609746 查看本文章


图像的对数变换可以将输入范围较窄的低灰度值映射到输出较宽范围的灰度值。通过该操作,我们可以扩展图像中的暗像素的值,同时压缩高灰度级的值。


例如在对图像进行频谱分析时,由于原始相机通过感光元件可以获得0~10^6频谱范围,甚至更高,尽管计算机可以处理这一范围的数字,但是图像的显示系统往往不能如实的刻画如此大范围的灰度值,因此导致许多灰度细节在傅里叶频谱显示中丢失。而解决该问题的方法之一就是改线性横坐标为对数坐标。

Matlab代码如下,这里由于需要将原图像数据进行对数计算,因此首先将数据格式变为double,其次通过mat2gray函数,将其函数值映射到[0,1]范围内,再通过im2uint8将数据映射为uint8格式,即为[0,255]。

fft_data=imread('傅里叶频谱.jpg');
g=im2uint8(mat2gray(log(1+double(fft_data))));
figure(1)
subplot(1,2,1)
imshow(fft_data)
title('傅里叶频谱')
subplot(1,2,2)
imshow(g)
title('对数变化后图像')

我们可以看到原始傅里叶变换频谱由于范围很宽(0~1.5×10^6),导致在显示系统中进行线性缩放显示时,最亮的像素支配整个图像,频谱的低值将损失掉。这里通过图像的对数操作,我们可以看到更多的低频点的细节。



图像幂律(伽马)变换

图像的幂律(伽马)变换可以用下面的公式表示:



其中c和γ为正常数。与对数变换相类似,图像的幂律(伽马)变换对于不同的γ取值会使得原图像的灰度伸展或压缩。



我们可以看到,当0<γ<1时,较窄的暗色低灰度值映射到较宽范围的输出值,较高灰度值则映射到较窄的输出范围。而当γ>1时则于此相反。

伽马变换常用于由于图像获取、打印和显示的设备不同而进行的伽马校正和对比度增强等。

spinal_cord=imread('人体脊髓骨折的核磁共振图像.jpg');
g=im2uint8(mat2gray(double(spinal_cord)).^0.4);
figure(1)
subplot(1,2,1)
imshow(spinal_cord)
title('人体脊髓骨折的核磁共振图像')
subplot(1,2,2)
imshow(g)
title('幂律变换后图像')

如图为γ=0.4的幂律变换前后图像。可以看到对低灰度值的暗区域得到了提升。

这里以一张航拍图为例,选择γ=3.

spinal_cord=imread('航拍图.jpg');
g=im2uint8(mat2gray(double(spinal_cord)).^3);
figure(1)
subplot(1,2,1)
imshow(spinal_cord)
title('航拍图')
subplot(1,2,2)
imshow(g)
title('幂律变换后图像')

运行上述代码,可以看到通过幂律变换将高灰度值的输入映射到较窄的范围内输出,可以很清晰的观察出航拍效果图。


猜你喜欢

转载自blog.csdn.net/u010936286/article/details/80051033