一些基本的灰度变换函数

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.csdn.net/ebowtang/article/details/38236441

友好连接:http://blog.csdn.net/zhengxiaoyang995926/article/details/79463463

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

转载于:https://www.cnblogs.com/MrZheng9511/p/Enhance.html

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是三种常见的灰度变换函数在MATLAB中的实现: 1. 线性变换函数 线性变换函数的数学公式为:g(x,y) = a * f(x,y) + b,其中a和b是常数,f(x,y)表示原始图像的像素值,g(x,y)表示变换后的像素值。 下面是一个简单的线性变换函数的MATLAB代码: ```matlab clc; % 清空命令窗口 close all; % 关闭所有图像窗口 img = imread('image.jpg'); % 读取图像 a = 1.5; b = 50; result = imadjust(img, [], [], a, b); % 线性变换函数 imshow(result); % 显示变换后的图像 ``` 在上面的代码中,我们使用imadjust()函数实现了线性变换。第4个参数代表a,第5个参数代表b。该函数将图像的每个像素值乘以a,然后再加上b,从而得到变换后的像素值。 2. 对数变换函数 对数变换函数的数学公式为:g(x,y) = c * log(1 + f(x,y)),其中c是常数,f(x,y)表示原始图像的像素值,g(x,y)表示变换后的像素值。 下面是一个简单的对数变换函数的MATLAB代码: ```matlab clc; % 清空命令窗口 close all; % 关闭所有图像窗口 img = imread('image.jpg'); % 读取图像 c = 255 / log(1 + double(max(img(:)))); result = c * log(1 + double(img)); % 对数变换函数 result = uint8(result); % 将浮点数转换为整数 imshow(result); % 显示变换后的图像 ``` 在上面的代码中,我们首先计算了常数c。然后使用MATLAB自带的log()函数实现对数变换。最后使用uint8()函数将浮点数转换为整数。 3. 幂律变换函数 幂律变换函数的数学公式为:g(x,y) = c * f(x,y)^gamma,其中c和gamma是常数,f(x,y)表示原始图像的像素值,g(x,y)表示变换后的像素值。 下面是一个简单的幂律变换函数的MATLAB代码: ```matlab clc; % 清空命令窗口 close all; % 关闭所有图像窗口 img = imread('image.jpg'); % 读取图像 gamma = 0.5; c = 255 / max(max(double(img).^gamma)); result = c * double(img).^gamma; % 幂律变换函数 result = uint8(result); % 将浮点数转换为整数 imshow(result); % 显示变换后的图像 ``` 在上面的代码中,我们首先计算了常数c和gamma。然后使用MATLAB自带的.^运算符实现幂律变换。最后使用uint8()函数将浮点数转换为整数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值