matlab實現影象增強
阿新 • • 發佈:2019-01-27
下面是根據我自己的工作整理的空間域和頻率域的影象增強,首先將彩色影象轉化為灰度影象,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低通濾波器銳化');