一些基本的灰度变换函数

时间:2024-05-20 21:46:38

1. 图像反转

灰度级范围[0, L - 1]的一幅图像的反转图像可以由下式给出:

s = L -1 -r .

图像反转可以用于处理特别适用于增强嵌入在一幅图像的暗区域中的白色或灰色细节,特别是当黑色面积在尺寸上占主导地位时。

 

如:数字乳房x射线照片

代码:

Image_original = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0304(a)(breast_digital_Xray).tif');
I = 255 - Image_original;
subplot(121)
imshow(Image_original)
subplot(122)
imshow(I)

显示:

一些基本的灰度变换函数

图像增强变换,需先做归一化处理,再做对数或指数变换,最后再反归一化。

2. 对数变换

通用形式:

s = c log(1 + r). / s = c logv+1(1+r * v)

其中c为常数,且假设r ≥ 0.

对数变换可以用来扩展图像中的暗像素的值,同时压缩更高灰度级的值。

对公式讲,v越大,则灰度部分增强越强。

如:值域为0~1.5*106的傅里叶频谱

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0305(a)(DFT_no_log).tif');
f_g = mat2gray(f);
f_log = log(1 + 10 * f_g)/log(1 + 10);
max =255;
min =0;
f_log_fg = uint8(f_log*(max - min) + min);
subplot(121)
imshow(f)
subplot(122)
imshow(f_log_fg)

显示:

一些基本的灰度变换函数

3.幂律变换

幂律变换基本形式: s = c rγ

其中c 和 γ 为正常数。幂律方程中的指数称为伽马(γ),用于校正这些幂律响应现象的处理称为伽马校正。 有时考虑到偏移量(即输入为0时的一个可度量输出),公式也可写为s = c(r + ε)γ

如:阴极射线管(CRT)的灰度-电压响应

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0307(a)(intensity_ramp).tif');
f_g = mat2gray(f);
f_gama = f_g.^0.4;
max =255;
min =0;
f_gama_fg = uint8(f_gama*(max - min) + min);
subplot(121)
imshow(f)
subplot(122)
imshow(f_gama_fg)

显示:

一些基本的灰度变换函数

可以使用幂律变换进行对比度增强。

如:对核磁共振(MRI)图像分别取不同的γ值,扩展灰度级。

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0308(a)(fractured_spine).tif');
gama06 = imageEnhance(f,0.6);
gama04 = imageEnhance(f,0.4);
gama03 = imageEnhance(f,0.3);
subplot(221)
imshow(f)
subplot(222)
imshow(gama06)
subplot(223)
imshow(gama04)
subplot(224)
imshow(gama03)

%%%子函数
function gama_transform = imageEnhance(image,gama)
f_g = mat2gray(image);
f_gama = f_g.^gama;
max =255;
min =0;
gama_transform = uint8(f_gama*(max - min) + min);

显示:

一些基本的灰度变换函数

利用幂律变换进行灰度级压缩。

如:航拍图像,取不同的γ值进行灰度级压缩

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0309(a)(washed_out_aerial_image).tif');
gama3 = imageEnhance(f,3);
gama4 = imageEnhance(f,4);
gama5 = imageEnhance(f,5);
subplot(221)
imshow(f)
subplot(222)
imshow(gama3)
subplot(223)
imshow(gama4)
subplot(224)
imshow(gama5)

%%子函数定义
function gama_transform = imageEnhance(image,gama)
f_g = mat2gray(image);
f_gama = f_g.^gama;
max =255;
min =0;
gama_transform = uint8(f_gama*(max - min) + min);

显示:

一些基本的灰度变换函数

4.分段线性变换函数

 (1).对比度拉伸

由于照明不足、成像传感器动态范围小或者在图像获取过程中镜头光圈设置错误引起的低对比度,可以进行对比度拉伸来扩展图像灰度级动态范围。

例如:实现将图片最低灰度级min到最高灰度级max拉伸到0:255.

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0310(b)(washed_out_pollen_image).tif');
[m,n,k] = size(f);
mid = mean(mean(f));
min = min(min(f));
max = max(max(f));
r1 = 91;
r2 = 138;
r3 = 120;
r4 = 120;
s1 = 0;
s2 = 255;
g = LinearEnhance(f,r1,r2,s1,s2);
g1 = LinearEnhance(f,r3,r4,s1,s2);

k1 = double(s1 / r1);
k2 = (s2 - s1) / (r2 - r1);
k3 = (255 - s2) / (255 - r2);

pixel_f=1:256; 
pixel_g=zeros(1,256);

for i = 1:255
if i <= r1
pixel_g(i) = k1 * i;
else if i <= r2 && i > r1
pixel_g(i) = k2 * (i - r1) + s1;
else 
pixel_g(i) = k3 * (i - r2) + s2;
end
end
end
subplot(221)
imshow(f)
subplot(222)
imshow(g)
subplot(223)
imshow(g1)
subplot(224)
plot(pixel_f,pixel_g)
text(91,0,'(r1,s1)');
text(138,255,'(r2,s2)')

 

子函数定义:

function stretch_image = LinearEnhance(image,r1,r2,s1,s2)
[height,width] = size(image);
stretch_image = uint8(zeros(height,width));
image = double(image);

%%%%%求斜率
k1 = s1 / r1;
k2 = (s2 - s1) / (r2 - r1);
k3 = (255 - s2) / (255 - r2);

for i = 1:height
for j = 1 : width
if image(i, j) <= r1
stretch_image(i ,j) = k1 * image(i, j);
else if image(i, j) <= r2 && image(i, j) > r1
stretch_image(i, j) = k2 * (image(i, j) - r1) + s1;
else 
stretch_image(i, j) = k3 * (image(i, j) - r2) + s2;
end
end
end
end
stretch_image = uint8(stretch_image);

显示:

一些基本的灰度变换函数

 

参考资源:http://blog.****.net/ebowtang/article/details/38236441

友好连接:http://www.cnblogs.com/MrZheng9511/p/Enhance.html

数字图像处理(第三版)冈萨雷斯