1. 程式人生 > >matlab實現影象增強

matlab實現影象增強

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