《數字圖象處理——基本的灰度變化》


   基本的灰度變換是基於圖像的空間域(圖像空間域:即指的是圖像平面本身;對應的是圖像的變換域)進行像素點對點的操作,具體的變換有:圖像反轉、對數變換、冪律(伽馬)變換、分段線性變換等等。


1、圖像反轉:主要是依據公式:s = L - 1 - r   進行圖像的灰度範圍進行反轉。具體看代碼。

<span style="font-size:18px;">% 圖像反轉
% 適用於增強嵌入在一副圖像的暗區域中的白色或灰色細節
im = imread('1.tif');
figure;subplot(121); imshow(im);

im = 256 - 1 - im;

subplot(122); imshow(im);</span>

輸出:左邊是原圖,右邊爲反轉後圖像


2、圖像的對數變換


<span style="font-size:18px;">%%
% 對數變換
% 用來壓縮像素值變化較大的圖像的動態範圍
% 在傅里葉頻譜分析中,一般都要用對數變換對很大範圍的傅里葉頻譜值域進行壓縮,以便於顯示。

im = imread('2.tif');
figure;subplot(121); imshow(im);

c = 1;
im = c * log( 1 + double(im) );

subplot(122); imshow(im, []);</span>


運行結果:

3、冪律(伽馬)變換

<span style="font-size:18px;">% 冪律(伽馬)變換
% 常見應用:伽馬校正, 改變圖像的對比度
% 伽馬大於1時,得到的圖像比原圖像暗,相反gimgmimg值小於1時,得到的圖像比原始圖像亮

im = imread('3.tif');
figure;subplot(221);imshow(im);  title('原圖');

c = 1;

imf = double(im);
gamma = 0.6;
imf = c * ( imf ).^gamma ;
subplot(222);imshow(imf, []); title('gamma = 0.6');

gamma = 0.1;
imf = double(im);
imf = c * ( imf ).^gamma ;
subplot(223);imshow(imf, []); title('gamma = 0.1')

gamma = 1.6;
imf = double(im);
imf = c * ( imf ).^gamma ;
subplot(224);imshow(imf, []); title('gamma = 1.6');</span>



4、分段線性變換

     主要有對比度拉伸、灰度級分層、比特平面分層。其中比特平面分層:高階比特平面包含了視覺上很重要的大多數數據,而低階比特平面在圖像中貢獻了更精細的灰度細節。常常應用在圖像壓縮領域。


img  =imread('lena.bmp');
img1 = img;
figure;subplot(3,3,1);imshow( img ) ;title('原始圖像');

%比特平面編碼

%方法一:
for i = 8: -1: 1
    A_bitplane = bitshift( bitget(img,i), i - 1 );
    subplot( 3, 3, 9 - i + 1 );
    imshow( A_bitplane );
    title( ['位平面 ' num2str(i)] );
end 

%方法二:
img2 = img;
figure;subplot(3,3,1);imshow( img ) ;title('原始圖像');

imd = cell(1,8);  %新建元胞數組方便解碼使用
[m,n] = size(img);
for i = 8: -1:1 
    for x = 1: m
        for y = 1: n
            if ( bitget( img(x, y), i ) == 1 )
                img2(x,y) = 2.^(i - 1);    %將屬於該比特平面的像素點映射爲    2.^(i - 1)
            else
                img2(x,y) = 0;      %將不屬於該比特平面的像素點映射爲0   這樣,最後得到每一層的比特平面都只包含兩個灰度級。
            end
        end
    end
    subplot( 3, 3, 8 - i + 2 );
    imshow( img2 );
    title( ['My_ 位平面 ' num2str(i)] );
    imd{i} = img2;  
end

%比特平面解碼:編碼的逆過程,簡單的灰度相加就行。
figure;subplot(2, 2, 1);imshow(img);title('原始圖像');
for i = 6 : 8
    recover = zeros( size(img) );
    recover = uint8( recover );
    for j = i: 8
        tmp = imd{j} ;
        recover = recover +  tmp ;
    end
    subplot(2, 2, i - 5 + 1);imshow(recover);  title( ['位平面' num2str(i) '-----8合成']);
end


運行結果輸出:


方法一:充分利用matlab庫函數,簡單快捷而且速度快。

方法二:爲自己實現,原理同方法一,程序相對簡單容易理解,但速度較慢。

推薦使用方法一。


從解碼過程可以看出,僅用6、7、8比特平面就可以很好的實現原始圖像的恢復;也就是將8比特的原始圖像壓縮到3比特的圖像,實現了圖像的壓縮存儲。



發佈了23 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章