数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的
空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像
这两种方法均属于图像增强。

邻域基本增强变换

定义

邻域为1×1: Basic intensity transformation
邻域n×n: 基于空间滤波的增强
整幅图像的统计特性: 基于直方图的增强

数学表达

g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] g(x,y)=T[f(x,y)] s = T [ r ] s=T[r] s=T[r]
r : r: r:原图像 f ( x , y ) f(x,y) f(x,y) ( x , y ) (x,y) (x,y)处的灰度值
s : s: s:增强图像 g ( x , y ) g(x,y) g(x,y) ( x , y ) (x,y) (x,y)处的灰度值

三种基本灰度变换技术

  1. 线性: 正比, 反比
  2. 对数: 对数, 反对数
  3. 幂次: n次幂, n次方根

例子

图像反转

在这里插入图片描述

I = imread('lena.jpg');
subplot(1,4,1);imshow(I);xlabel('原图');
I_gray = rgb2gray(I);
subplot(1,4,2); imshow(I_gray);xlabel('灰度图');
I_reverse2 = 255 - I_gray;
% I_reverse2 = imcomplement(I);
subplot(1,4,3); imshow(I_reverse2);xlabel('灰度反转');
I_reverse3 = imcomplement(I);
subplot(1,4,4); imshow(I_reverse3);xlabel('颜色反转');

在这里插入图片描述

对数变换

表达式: s = l o g ( 1 + r ) s=log(1+r) s=log(1+r)

把窄范围的低灰度级映射到宽范围的灰度级 (增强低灰度级)
把宽范围的高灰度级映射到低范围的灰度级 (抑制高灰度级)

clear;
img = imread('lena.jpg');
f=rgb2gray(img); %对于RGB图像必须做的一步,也可以用im2double函数
g = im2uint8(mat2gray(log(1 + double(f)))); % 使用对数变换
ff2=fftshift(fft2(f));
subplot(131),imshow(ff2,[]);title('原始图像');
subplot(132),imshow(log(abs(ff2)+1),[]);title('对数变换');
subplot(133),imshow(g,[]);title('对图像对数变换');

在这里插入图片描述
代码中可能会遇到的问题:
参考博客Matlab傅里叶变换实例
1、关于imshow函数:
使用imshow函数显示图像时要注意图像矩阵类型,当图像是double类型时要使用imshow(I,[ ])来根据数据矩阵的数值范围自动设置灰度图像显示范围。
2、关于运行时可能出现的警告:
如果图像进行傅里叶转换后立即用imshow函数显示,则在命令行可能会显示:Warning: Displaying real part of complex input(警告: 显示复数输入项的实部)。这是因为经过傅里叶变换后的图像矩阵大多是复数矩阵,包含实部和虚部。此时如要显示图像则需要先用abs取复数矩阵的模,再进行显示。
取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数
3、关于开头im2double和rgb2gray函数的使用:
对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型,或者使用rgb2gray将其转换为灰度图像。
使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。

幂律(伽马)变换

表达式:
s = c r γ s=cr^{\gamma} s=crγ
γ \gamma γ<1: 扩展暗像素值, 压缩亮像素值
γ \gamma γ>1: 压缩暗像素值, 扩展亮像素值
应用: 用于各种图像获取、打印和显示等设备的伽马校正(Gamma correction)
在这里插入图片描述
在这里插入图片描述

%扩展亮灰度级
clear;
img = imread('Fig0308(a)(fractured_spine).tif');
f=mat2gray(img); 
a=1;
gamma=0.6;
gamma1=0.3;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('0.6');
subplot(223),imshow(s1,[0 1]);title('0.3');
subplot(224),imshow(s2,[0 1]);title('对数变换');

在这里插入图片描述
可以看到当 γ = 0.6 \gamma =0.6 γ=0.6到0.3后,出现轻微苍白外观,对比度开始下降。

%压缩图像亮度
clear;
img = imread('Fig0309(a)(washed_out_aerial_image).tif');
f=mat2gray(img); 
a=1;
gamma=3;
gamma1=4;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('\gamma =3');
subplot(223),imshow(s1,[0 1]);title('\gamma =4');
subplot(224),imshow(s2,[0 1]);title('对数变换');


在这里插入图片描述

可以看到当 γ > 1 \gamma >1 γ>1时,可实现灰度级压缩。

对比度拉伸

提高图像灰度级的动态范围
在这里插入图片描述
在这里插入图片描述

clear all;clc;
%分段线性灰度变换
f=imread('Fig0310(b)(washed_out_pollen_image).tif');
% f=rgb2gray(img);  %将彩色图像数据R转换为灰度图像数据J
a=max(max(f));
b=min(min(f));
[m,n]=size(f);  %获得灰度图像J的行列数M,N
H=zeros(m,n);
for x=1:m
    for y=1:n
        if (f(x,y)<=110);  %对灰度图像J进行分段处理,处理后的结果返回给矩阵H
            H(x,y)=b;
        else
            H(x,y)=a;
        end
    end
end
figure,
subplot(121),imshow(f,[]);
subplot(122),imshow(H,[]);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fcxgfdjy/article/details/130458276