下面是根据我自己的工作整理的空间域和频率域的图像增强,首先将彩色图像转化为灰度图像,matlab 代码如下:
<span style="font-size:18px;">clear all
I1=imread('1.jpg');
imshow(I1)
title('输入的彩色JPG图像')
I = rgb2gray(I); %灰度化后的数据存入数组
imwrite(I,'image_gray.bmp'); %保存灰度图像
figure,imshow(I);
title('灰度图') </span>
1、灰度变换
灰度变换可以调整图像的灰度动态范围或图像对比度,是图像增强的重要手段之一。
1.1线性变换
在图像曝光不足或过度的情况下,图像灰度可能会局限在一个很小的范围内。这时在显示器上看到的是一个模糊不清、似乎没有灰度层次的图像。对这种图像采用线性变换方法对像素灰度做线性拉伸,可有效改善图像视觉效果。
matlab代码如下:线性转化函数就是k*X+b
function [ new ] = LinearTransformFunc( original, k, d )
new = original * k + b;
end
<span style="font-size:18px;">original = imread('2.bmp');
transformed = LinearTransformFunc(original, 2, 6);
figure
imshow(transformed)
imwrite(transformed,'lineartrans.jpg')</span>
1.2 分段线性变换
为了突出感兴趣目标所在的灰度区间,相对抑制那些不感兴趣的灰度空间可以采用分段性变换
<span style="font-size:18px;">function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
new = original;
w = size(new, 1);
h = size(new, 2);
k1 = y1 / x1;
dk1 = (y2 - y1) / (x2 - x1);
dk2 = (255 - y2) / (255 - x2);
for i = 1 : w
for j = 1 : h
x = new(i, j);
if x < x1
new(i, j) = k1 * x;
elseif x < x2
new(i, j) = dk1 * (x - x1) + y1;
else
new(i, j) = dk2 * (x - x2) + y2;
end
end
end
end
original = imread('image_gray.bmp');
transformed = StretchFunc(original,93,0,255,255);
figure
imshow(transformed)
imwrite(transformed,'stretch.jpg')</span>
1.3 非线性灰度变换
当用某些非线性函数如对数函数、指数函数等,作为映射函数时,可实现凸显灰度的非线性变换。
对数变换:对图像的低灰度区有较大的拉伸,而对高灰度区进行压缩。
指数变换:对图像的高灰度区进行较大的拉伸。
2、直方图均衡化
I = imread('3.jpg');
m = 16;
H = histeq(I,m);
imshow(H,[]);
title('均衡后的图像');
3、图像平滑
figure(2)
subplot(3,2,1);
imshow(I);
title('原图像');
% 加入椒盐噪声并显示
II = imnoise(I,'salt & pepper');
subplot(3,2,2);
imshow(II);
title('加入椒盐噪声后的图像');
% 低通滤波平滑
[B,A] = butter(6,0.2,'low');
J = filter(B,A,double(II));
subplot(3,2,3);
imshow(J,[]);
title('低通滤波平滑');
% 中值滤波平滑
J = medfilt2(II);
subplot(3,2,4);
imshow(J,[]);
title('中值滤波平滑');
% 同态滤波
[I0,M] = imread(fineName);
%I0 = II;M=[];
I1 = log(double(I0)+1);
I2 = fft2(I1);
N=2;D0=0.05*pi;rh=0.8;r=0.5;
[row,col]=size(I2);
for m=1:row
for n=1:col
D1(m,n)=sqrt(m^2+n^2);
H(m,n)=r+(rh/(1+(D0/D1(m,n))^(2*N)));
end
end
I3=I2.*single(H);
I4=ifft2(I3);
I5=exp(I4)-1;
subplot(3,2,5);
imshow(I0,M);
title('原图像');
subplot(3,2,6);
imshow(I5,M);
title('同态滤波后的图像');
4、图像锐化
ima=double(I);
h=fspecial('sobel');
bw1 = imfilter(ima,h); %sobel算子锐化
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');%图像显示
subplot(122);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(bw1);title('sobel算子锐化');
bw2 = edge(ima,'prewitt');%prewitt算子锐化
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');
subplot(122);imshow(bw2);title('prewitt算子锐化');
bw3 = edge(ima,'roberts');%roberts算子锐化
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');
subplot(122);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(bw3);title('roberts算子锐化');
bw4 = edge(ima,'log');%log算子锐化
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');
subplot(122);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(bw4);title('log算子锐化');
bw5 = edge(ima,'canny');%canny算子锐化
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');
subplot(122);imshow(bw5);title('canny算子锐化');
h1=fspecial('gaussian',[9 9]);%gaussian低通滤波器锐化
bw6 = imfilter(ima,h1);
figure;subplot(121);</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">imshow(uint8(ima));title('原始图像');
subplot(122);
imshow(uint8(bw6));
title('gaussian低通滤波器锐化');