1. 程式人生 > >影象增強--影象對比度、線性展寬、灰級窗、線性動態範圍調整、直方圖均衡化

影象增強--影象對比度、線性展寬、灰級窗、線性動態範圍調整、直方圖均衡化

影象對比度:

%% 計算影象對比度——4近鄰
%  @matrix -- 輸入的影象為灰度圖
% 處理方式:構造一個一維差數[1,max+1],組沿著矩陣row軸,當前畫素值與右一個畫素做差取絕對值
%                 將其累加1在一維差陣列對應位置上,到row-1。沿col軸同理。
%                 對一維陣列除以總共差個數,得到灰度差分佈概率陣列,再用公式求解:∑(m^2*temp[m])

%該方法是對一張影象對比度的求解
function C=m_contrast4(matrix)
[row,col] = size(matrix);
num = max(max(matrix));%矩陣中最大值
temp = zeros(1,double(num)+1); %一維畫素間的灰度差陣列 for i = 1:row %沿col for j = 1:col-1 num_y = abs(matrix(i,j)-matrix(i,j+1)); temp(1,num_y+1) = temp(1,num_y+1)+1; end end for i = 1:row-1 %沿row for j = 1:col num_x = abs(matrix(i,j)-matrix(i+1,j)); temp(1
,num_x+1) = temp(1,num_x+1)+1; end end temp_cop = temp/sum(temp); %灰度差分佈概率陣列 C=0; for m = 1:num C = C + (m^2)*temp_cop(1,m+1); end
%% 計算影象對比度——8近鄰
%  @matrix -- 輸入的影象為灰度圖
%處理方式:中心畫素灰度值與周圍8近鄰畫素灰度值之差的平方之和,除以以上之差的個數。

%{
%介紹函式 padarray
功能:填充影象或填充陣列。
用法:B = padarray(A,padsize,padval,direction)    A為輸入影象,B為填充後的影象

padsize->給出了給出了填充的行數和列數,通常用[r c]
來表示。 padval->表示填充方法。它的具體值和描述如下:    'symmetric'表示影象大小通過圍繞邊界進行映象反射來擴充套件; 'replicate'表示影象大小通過複製外邊界中的值來擴充套件; 'circular'影象大小通過將影象看成是一個二維周期函式的一個週期來進行擴充套件。 direction->表示填充的方向。它的具體值和描述如下: 'pre'表示在每一維的第一個元素前填充; 'post'表示在每一維的最後一個元素後填充; 'both'表示在每一維的第一個元素前和最後一個元素後填充,此項為預設值。 若參量中不包括direction,則預設值為'both'。 若參量中不包含padval,則預設用零來填充。 若參量中不包括任何引數,則預設填充為零且方向為'both'。在計算結束時,影象會被修剪成原始大小。 %} function C = m_contrast8(matrix) %matrix為輸入影象 [row, col] = size(matrix); %求原始影象的行數和列數 %對原始影象進行擴充套件,比如50*50的影象,擴充套件後變成52*52的影象 matrix_cop = padarray(matrix,[1 1],'symmetric','both'); %擴充套件只是對原始影象的周邊畫素進行復制的方法進行 [row_cop,col_cop] = size(matrix_cop);%求擴充套件後圖像的行數r和列數 %C = double(matrix_cop); %把擴充套件後圖像轉變成雙精度浮點數 k=0; %定義一數值k,初始值為0 for i=2:row_cop-1 for j=2:col_cop-1 k = k+(matrix_cop(i-1,j-1)-matrix_cop(i,j))^2+(matrix_cop(i-1,j)-matrix_cop(i,j))^2+(matrix_cop(i-1,j+1)-matrix_cop(i,j))^2+... (matrix_cop(i,j+1)-matrix_cop(i,j))^2+(matrix_cop(i+1,j+1)-matrix_cop(i,j))^2+(matrix_cop(i+1,j)-matrix_cop(i,j))^2+... (matrix_cop(i+1,j-1)-matrix_cop(i,j))^2+(matrix_cop(i,j-1)-matrix_cop(i,j))^2; end end C =double( k/(8*(row-2)*(col-2)+6*(2*(row-2)+2*(col-2))+4*3));%求原始影象對比度

%% 對比度線性展寬
%影象關注區域的畫素範圍[fa,fb]由beld擴充套件到[ga,gb],
% [0,fa]由alf控制
% [fb,255]由gamma
% alf<1,gamma<1,beld>1
% fb-fa

%% 灰級窗
%  @matrix -- 輸入的影象為灰度圖
% 原理:只對[fa,fb]對映到[0,255]
function G = m_GrayWindow(matrix,fa,fb)
[row,col] = size(matrix);
beld = 255/(fb-fa);%對影象素
G = zeros(row,col);
%G = matrix;
for i=1:row
    for j=1:col
        if (matrix(i,j)>=fa) && (matrix(i,j)<fb)
            G(i,j) = beld*(matrix(i,j)-fa);
        end    
    end
end
%% 灰級窗切片
%  @matrix -- 輸入的影象為灰度圖
%  原理:畫素在[fa,fb]範圍值賦為255
function G = m_GrayWindowSection(matrix,fa,fb)
[row,col] = size(matrix);
G =zeros(row,col);
for i =1:row
    for j=1:col
        if (matrix(i,j)>=fa && matrix(i,j)<fb)
            G(i,j) = 255;  %對影象處理
        end
    end
end 
%% 線性動態範圍調整
% 影象中 畫素在[fa,fb]範圍對映到[0,255],小於fa的賦0,大於fbd的賦255
function G = m_LinearAdjust(matrix,fa,fb)
[row,col] = size(matrix);
beld = 255/(fb-fa);%對影象素處理
G = zeros(row,col);
%G = matrix;
for i=1:row
    for j=1:col
        if (matrix(i,j)>=fa) && (matrix(i,j)<fb)
            G(i,j) = round(beld*(matrix(i,j)-fa));
        end
        if matrix(i,j)>=fb
            G(i,j) = 255;
        end
    end
end
%% 線性動態範圍調整
%  @matrix -- 輸入的影象為灰度圖
% 影象中對畫素用對數運算進行平滑處理:
function G = m_ULinearAdjust(matrix)
[row,col] = size(matrix);
%matrix = im2double(matrix);
c = 255/log(255+1);%對影象素處理
G = zeros(row,col);
%G = matrix;
for i=1:row
    for j=1:col
            G(i,j) = round(c*log(1+double(matrix(i,j))));
    end
end
%% 直方圖均衡化
%   @image-輸入的影象為灰度圖
%   1.求image的灰度直方圖向量H
%   2.由H/row*col  得到灰度分佈概率Pi,及計算累計分佈概率Pa
%   3.求得255*Pa後,從原圖image畫素對映到Gi畫素
%   @Gi-輸出處理後圖像
function Gi = m_HistogramEqualiza(image)
[row,col] = size(image);
num = max(max(image));  %矩陣中最大值
H = zeros(1,double(num)+1);  %灰度直方圖向量
PI = zeros(1,double(num)+1);  %灰度分佈概率
Pa = zeros(1,double(num)+1);  %累計分佈概率
Gi = zeros(row,col);
format rat  %分數形式
for i=1:row
    for j=1:col
        H(double(image(i,j))+1)  = H(double(image(i,j))+1)+1; 
    end
end
PI = H/(row*col);

Pai = 0;
for m=2:double(num)+1
    Pai = Pai+PI(m);
    Pa(m) = Pai+PI(1);
end
Pa = round(double(num)*Pa);

for i=1:row
    for j=1:col
        Gi(i,j) = Pa(image(i,j)+1);
    end
end

imhist(image);title('輸入影象的灰度直方圖');
figure;
imhist(uint8(Gi));
title('直方圖均衡化後圖像的灰度直方圖');