主頁 > 前端設計 > 【數字影像處理】(二)全面! 影像的點運算

【數字影像處理】(二)全面! 影像的點運算

2020-10-08 15:33:40 前端設計

文章目錄

  • 影像的點運算
    • 1 灰度直方圖
      • 1.1 理論基礎
      • 1.2 MATLAB實作
    • 2 灰度的線性變換
      • 2.1 理論基礎
      • 2.2 MATLAB程式的實作
    • 3 灰度對數變換
      • 3.1 理論基礎
      • 3.2 MATLAB實作
    • 4 伽瑪變換
      • 4.1 理論基礎
      • 4.2 MATLAB編程實作
    • 5 灰度閾值變換
      • 5.1 理論基礎
      • 5.2 MATLAB編程實作
    • 6 分段線性變換
      • 6.1 理論基礎
      • 6.2 MATLAB編程實作
    • 7 直方圖均衡化
      • 7.1 理論基礎
      • 7.2 MATLAB編程實作
    • 8 直方圖規定化(匹配)
      • 8.1 理論基礎
      • 8.2 MATLAB編程實作

影像的點運算

對于一個數字影像處理系統來說,一般可以將處理流程分為3個階段,在獲取原始影像后,首先是影像預處理階段,第二是特征抽取階段,最后才是識別分析階段,預處理階段尤為重要,這個階段處理不好則后面的作業根本無法展開,

點運算指的是對影像中的每個像素依次進行同樣的灰度變換運算,設r和s分別是輸入影像 f ( x , y ) f(x,y) f(x,y)和輸出影像 g ( x , y ) g(x,y) g(x,y)在任一點 ( x , y ) (x,y) (x,y)的灰度值,則點運算可以使用下式定義,
在這里插入圖片描述
其中, T T T為采用的點運算算子,表示了在原始影像和輸出影像之間的某種灰度級映射關系,

點運算常常用于改變影像的灰度范圍及分布,是影像數字化及影像顯示時常常需要的工具,點運算因其作用的性質有時也被稱為對比度增強、對比度拉伸或灰度變換

1 灰度直方圖

灰度直方圖描述了一幅影像的灰度級統計資訊,主要應用于影像分割和影像灰度變換等處理程序中,

1.1 理論基礎

從數學上來說,影像直方圖描述的是影像的各個灰度級的統計特性,它是影像灰度值的函式,統計一幅影像中各個灰度級出現的次數或概率,有一種特殊的直方圖叫作歸一化直方圖,可以直接反映不同灰度級出現的比率

從圖形上來說,灰度直方圖是一個二維圖,橫坐標為影像中各個像素點的灰度級別,縱坐標表示具有各個灰度級別的像素在影像中出現的次數或概率,

灰度直方圖的計算是根據其統計定義進行的,影像的灰度直方圖是一個離散函式,它表示影像每一灰度級與該灰度級出現頻率的對應關系,假設一幅影像的像素總數為 N N N,灰度級總數為 L L L,其中灰度級為 g g g的像素總數為 N g N_g Ng?,則這幅數字影像的灰度直方圖橫坐標即為灰度 g ( 0 ≤ g ≤ L ? 1 ) g(0≤g≤L-1) g0gL?1,縱坐標則為灰度值出現的次數 N g N_g Ng?,實際上,用像素總數N去除以各個灰度值出現的次數 N g N_g Ng?即得到各個灰度級出現的概率 P g = N g / N = N g / Σ N g P_g=N_g/N=N_g/ΣN_g Pg?=Ng?/N=Ng?/ΣNg?,從而得到歸一化的灰度直方圖,其縱坐標為概率 P g P_g Pg?

1.2 MATLAB實作

MATLAB中的imhist函式可以進行影像的灰度直方圖運算,呼叫語法如下:

imhist(I)
imhist(I,n)
[counts,x]=imhist(...)

引數說明:

  • I為需要計算灰度直方圖的影像;
  • n為指定的灰度級數目,如果指定引數n,則會將所有的灰度級均勻分布在n個小區間內,而不是將所有的灰度級全部分開,

回傳值:

  • counts為直方圖資料向量,counts(i)表示第i個灰度區間中的像素數目;
  • x是保存了對應的灰度小區間的向量,

若呼叫時不接收這個函式的回傳值,則直接顯示直方圖;在得到這些回傳資料之后,也可以使用stem(x, counts)來手工繪制直方圖,

(1)一般直方圖
下面使用了MATLAB中的一張內置示例圖片演示灰度直方圖的生成與顯示,程式如下,

I=imread('pout.tif');     % 讀取影像pout.tif
figure                    % 打開新視窗
imshow(I);title('Source');% 顯示原影像
figure                    % 打開新視窗
imhist(I);title('Graph')  % 顯示直方圖

運行結果:

示例圖片灰度直方圖
在這里插入圖片描述在這里插入圖片描述

上圖為未經歸一化的灰度直方圖,縱軸表示影像中所有像素取到某一特定灰度值的次數;橫軸對應從0到255的所有灰度值,覆寫了uint8存盤格式的灰度影像中的所有可能取值

因為相近的灰度值所具有的含義往往是相似的,所以常常沒有必要在每個灰度級上都進行統計,下面的命令將0~255總共256個灰度級平均劃分為64個長度為4的灰度區間,此時縱軸分別統計每個灰度區間中的像素在影像中的出現次數,其編程代碼如下,

imhist(I,64)   % 生成有64個小區間的灰度直方圖

運行結果:
在這里插入圖片描述

由于要統計落入每個灰度區間內的像素數目,灰度區間常常被形象地稱為“收集箱”,在上圖所示的直方圖中,由于減少了收集箱的數目,使得落入每個收集箱的像素數目有所增加,從而使直方圖更具統計特性,收集箱的數目一般設為2的整數次冪,以保證可以無需圓整,

(2)歸一化直方圖
在imhist函式的回傳值中,counts保存了落入每個區間的像素的個數,通過計算counts與影像中像素總數的商可以得到歸一化的直方圖,

I=imread('pout.tif');        % 讀取影像pout.tif
figure                       % 打開新視窗
[M,N]=size(I);               % 影像大小
[counts,x]=imhist(I,32);     % 32個小區間的灰度直方圖
counts=counts/(M*N);         % 計算歸一化灰度直方圖各區間的值
stem(x,counts);              % 繪制歸一化直方圖

在這里插入圖片描述

分析影像的灰度直方圖往往可以得到很多有效的資訊,下面一系列灰度直方圖上,可以很直觀地看出影像的亮度和對比度特征,實際上,直方圖的峰值位置說明了影像總體上的亮暗:如果影像較亮,則直方圖的峰值出現在直方圖的較右部分;如果影像較暗,則直方圖的峰值出現在直方圖的較左部分,從而造成暗部細節難以分辨,如果直方圖中只有中間某一小段非零值,則這張影像的對比度較低;反之,如果直方圖的非零值分布很寬而且比較均勻,則影像的對比度較高

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述

2 灰度的線性變換

2.1 理論基礎

線性灰度變換函式 f ( x ) f(x) f(x)是一個一維線性函式,
在這里插入圖片描述

式中,引數 f A f_A fA?為線性函式的斜率, f B f_B fB?為線性函式在 y y y軸的截距, D A D_A DA?表示輸入影像的灰度, D B D_B DB?表示輸出影像的灰度,

  • f A > 1 f_A>1 fA?1時,輸出影像的對比度將增大;當 f A < 1 f_A<1 fA?1時,輸出影像的對比度將減小,

  • f A = 1 f_A=1 fA?=1 f B ≠ 0 f_B≠0 fB??=0時,操作僅使所有的像素的灰度值上移或下移,其效果是使整個影像更暗或更亮;如 f A < 0 f_A<0 fA?0,暗區域將變亮,亮區域將變暗,這種線性改變亮度的變換可能由于像素亮度達到飽和(小于0或超過255)從而丟失一部分細節,

  • 特殊情況下,當 f A = 1 , f B = 0 f_A=1, f_B=0 fA?=1,fB?=0時,輸出影像與輸入影像相同;當 f A = ? 1 , f B = 255 f_A=-1,f_B=255 fA?=?1,fB?=255時,輸出影像的灰度正好反轉,灰度反轉處理適用于增強暗色影像中的亮度較大的細節部分,這也是由人的視覺特性決定的,

線性變換的示意圖如下圖所示
在這里插入圖片描述

2.2 MATLAB程式的實作

用MATLAB對影像執行線性變換無需專門的函式:

I=imread('coins.png');
I=im2double(I);          % 轉換資料型別
[M,N]=size(I);
%% 原影像
figure(1)
imshow(I)
title('原影像')
figure(2)
[H,x]=imhist(O,64);
stem(x,(H/(M*N)), '.');        % 顯示原影像直方圖
title('原影像')
%% 增加對比度
Fa=2;Fb=-55;
O=Fa.*I+Fb/255;
figure(3)
subplot(2,2,1);
imshow(O);
title('Fa=2 Fb=-55 增加對比度');
figure(4)
subplot(2,2,1);
[H,x]=imhist(O,64);
stem(x,(H/(M*N)), '.');   
title('Fa=2 Fb=-55 增加對比度');
%% 減小對比度
Fa=0.5;Fb=-55;
O=Fa.*I+Fb/255;
figure(3)
subplot(2,2,2)
imshow(O)
title('Fa=0.5 Fb=-55 減小對比度')
figure(4)
subplot(2,2,2)
[H,x]=imhist(O,64);
stem(x,(H/(M*N)), '.');  
title('Fa=0.5 Fb=-55 減小對比度')
%% 線性增加亮度
Fa=1;Fb=55;
O=Fa.*I+Fb/255;
figure(3)
subplot(2,2,3)
imshow(O)
title('Fa=1 Fb=55 線性平移增加亮度')
figure(4)
subplot(2,2,3)
[H,x]=imhist(O,64);
stem(x,(H/(M*N)),'.');
title('Fa=1 Fb=55 線性平移增加亮度')
%% 線性增加亮度
Fa=-1;Fb=255;
O=Fa.*I+Fb/255;
figure(3)
subplot(2,2,4)
imshow(O)
title('Fa=-1 Fb=255 反相顯示')
figure(4)
subplot(2,2,4)
[H,x]=imhist(O,64);
stem(x,(H/(M*N)),'.');
title('Fa=-1 Fb=255 反相顯示')
原影像歸一化直方圖
在這里插入圖片描述在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

從結果圖可以看到,改變影像的對比度是對直方圖的縮放與平移,改變影像的亮度則只是平移直方圖在橫軸上的位置,而反相則是將直方圖水平鏡像,

3 灰度對數變換

3.1 理論基礎

對數變換的一般運算式如下

在這里插入圖片描述
其中, c c c為尺度比例常數, s s s為源灰度值, t t t為變換后的目標灰度值,在如圖3.8所示的對數曲線上,函式自變數為低值時,曲線的斜率很高;自變數為高值時,曲線斜率變小,
在這里插入圖片描述

由對數函式曲線可知,這種變換可以增強一幅影像中較暗部分的細節,從而可用來擴展被壓縮的高值影像中的較暗像素,因此對數變換被廣泛地應用于頻譜影像的顯示中,一個典型的應用是傅里葉頻譜(,其動態范圍可能寬達 0 ~ 1 0 6 0~10^6 0106,直接顯示頻譜時,影像顯示設備的動態范圍往往不能滿足要求,從而丟失了大量的暗部細節,而在使用對數變換之后,影像的動態范圍被合理地非線性壓縮,從而可以清晰地顯示,

3.2 MATLAB實作

對數變換不需要專門的影像處理函式,可以使用如下數學函式實作對影像I的對數變換
在這里插入圖片描述

下面的程式比較了對傅里葉頻譜影像進行對數變換前后的效果(不必關注代碼中生成傅里葉頻譜的部分)

I=imread('coins.png');
F=fft2(im2double(I));  % 計算頻譜
F=fftshift(F);
F=abs(F);
T=log(F+1);
subplot(1,2,1);
imshow(F,[]);
title('未經變換的頻譜')
subplot(1,2,2)
imshow(T,[])
title('對數變換后')

結果:
在這里插入圖片描述

在結果圖中未經變換的頻譜可見,影像中心絕對高灰度值的存在壓縮了低灰度部分的動態范圍,從而無法在顯示時表現出細節;而經過對數灰度處理的影像,其低灰度區域對比度將會增加,暗部細節被增強,

4 伽瑪變換

伽瑪變換又名指數變換或冪次變換,是另一種常用的灰度非線性變換,

4.1 理論基礎

伽瑪變換的一般運算式如下
在這里插入圖片描述

其中, x x x與y的取值范圍均為 [ 0 , 1 ] [0,1] [0,1], e s p esp esp為補償系數, γ γ γ則為伽瑪系數,與對數變換不同,伽瑪變換可以根據 γ γ γ不同取值選擇性地增強低灰度區域的對比度或是高灰度區域的對比度

γ γ γ是影像灰度校正中非常重要的一個引數,其取值決定了輸入影像和輸出影像之間的灰度映射方式,即決定了是增強低灰度(陰影區域)還是增強高灰度(高亮區域),

  • γ > 1 γ>1 γ1時,影像的高灰度區域對比度得到增強,
  • γ < 1 γ<1 γ1時,影像的低灰度區域對比度得到增強,
  • γ = 1 γ=1 γ=1時,這一灰度變換是線性的,即不改變原影像,

伽瑪變換的映射關系如圖3.10所示,在進行變換時,通常需要將0~255的灰度動態范圍首先變換到0~1的動態范圍,執行伽瑪變換后再恢復原動態范圍,
在這里插入圖片描述

4.2 MATLAB編程實作

MATLAB中為使用者提供了實作灰度變換的基本工具imadjust,它有著非常廣泛的用途,其呼叫的一般語法如下
在這里插入圖片描述
該函式將輸入影像 I I I中從low_inhigh_in之間的值映射到輸出影像J的low_outhigh_out之間的值,low_in以下和high_in以上的值則被裁減掉,

引數說明:

  • [low_in, high_in]和[low_out, high_out]確定源灰度范圍到目標灰度范圍的映射,在給定[low_in, high_in][low_out, high_out]時,需要按照double型別給定,即取值范圍在0~1之間;
  • 使[low_in, high_in][low_out, high_out]為空([ ]),相當于默認值[0 1],若high_out小于low_out,則輸出影像 J J J的亮度將會反轉;
  • 引數gamma指定了變換曲線的形狀(類似于圖3.10中的形狀),其默認值為1,表示線性映射,若gamma<1,則映射被加權至更高的輸出值;若gamma>1,則映射被加權至更低的輸出值;
  • gamma取1時,通過設定合適的[low_in,high_in][low_out, high_out]的取值,imadjust函式可以實作灰度線性變換;
  • 而當[low_in, high_in][low_out,high_out]的取值均為[0, 1]時,以不同的gamma呼叫imadjust函式則可以實作圖3.10中所示的各種伽瑪變換,
  • I I I為輸入影像,可以是uint8, uint16或者double型別,

回傳值:

  • J J J為經過處理的影像,與I具有同樣的型別,

imadjust函式用于Gamma變換的呼叫語法如下,
在這里插入圖片描述
gamma分別取不同值時的伽瑪變換的程式實作

I=imread('pout.tif');
%gamma取0.75
subplot(1,4,1)
imshow(imadjust(I,[],[],0.75));
title('gamma:0.75')
%gamma取1
subplot(1,4,2)
imshow(imadjust(I,[],[],1));
title('gamma:1')
%gamma取1.5
subplot(1,4,3)
imshow(imadjust(I,[],[],1.5));
title('gamma:1.5')
%原影像
subplot(1,4,4)
imshow(I);
title('原影像')

運行結果

在這里插入圖片描述

可以看出不同伽瑪因子給影像的整體明暗程度帶來的變化,以及對影像暗部和亮部細節清晰度的影響,當伽瑪因子取1的時候,影像沒有任何改變,

下面的程式生成了各個影像的灰度直方圖,

I=imread('pout.tif');
%gamma取0.75
subplot(1,4,1)
imhist(imadjust(I,[],[],0.75));
title('gamma:0.75')
%gamma取1
subplot(1,4,2)
imhist(imadjust(I,[],[],1));
title('gamma:1')
%gamma取1.5
subplot(1,4,3)
imhist(imadjust(I,[],[],1.5));
title('gamma:1.5')
%原影像
subplot(1,4,4)
imhist(I);
title('原影像')

結果:
在這里插入圖片描述

注意圖中直方圖非零區間位置的變化,以及這些變化給影像帶來的影響,由于伽瑪變換并不是線性變換,所以它不僅可以改變影像的對比度,還能夠增強細節,從而帶來整體影像效果的增強和改善,

5 灰度閾值變換

灰度閾值變換可以將一幅灰度影像轉換成黑白的二值影像,用戶指定一個起到分界線作用的灰度值,如果影像中某像素的灰度值小于該灰度值,則將該像素的灰度值設定為0,否則設定為255,這個起到分界線作用的灰度值稱為閾值,灰度的閾值變換也常被稱為閾值化或二值化,

5.1 理論基礎

灰度閾值變換的函式運算式如下
在這里插入圖片描述
其中, T T T為指定的閾值,

灰度閾值變換的示意圖如下
在這里插入圖片描述
灰度閾值變換的用途和可擴展性都非常廣泛,通過將一幅灰度影像轉為二值影像,可以將影像內容直接劃分為讀者關心的和不關心的兩個部分,從而在復雜背景中直接提取出感興趣的目標,因此它是影像分割的重要手段之一

5.2 MATLAB編程實作

MATLAB中和閾值變換有關的函式主要有兩個——im2bwgraythresh
1.函式im2bw可用于實作閾值變換,呼叫語法如下,
在這里插入圖片描述
引數說明:

  • 引數I為需要二值化的輸入影像;
  • 引數level給出了具體的變換閾值,它是一個0~1之間的雙精度浮點數,例如輸入影像I為灰度范圍在0~255之間的uint8影像,如果level=0.5則對應于分割閾值為128,

回傳值:

  • BW為二值化后的影像,

2.函式graythresh可以自適應地確定變換所用的“最優”閾值,呼叫形式如下,
在這里插入圖片描述
引數說明:

  • 引數I為需要計算閾值的輸入影像,

回傳值:

  • thresh是計算得到的最優化閾值

灰度閾值level既可以由經驗確定,也可以使用graythresh()函式來自適應地確定,
下面的程式分別展示了如何利用graythresh函式獲得的閾值和自行設定的閾值進行閾值變換

I=imread('rice.png');
thresh=graythresh(I);    % 自適應確定閾值
bw1=im2bw(I,thresh);     % 二值化
bw2=im2bw(I,130/255);    %130為閾值實作二值化,注意要將此閾值轉換至[0,1]之間
subplot(1,3,1);imshow(I);title('原影像')
subplot(1,3,2);imshow(bw1);title('自適應選擇閾值')
subplot(1,3,3);imshow(bw2);title('閾值130')

結果:
在這里插入圖片描述

6 分段線性變換

6.1 理論基礎

利用分段線性變換函式來增強影像對比度的方法實際上是增強原圖各部分的反差,即增強輸入影像中感興趣的灰度區域,相對抑制那些不感興趣的灰度區域,分段線性函式的主要優勢在于它的形式可任意合成,而其缺點是需要更多的用戶輸入,
分段線性變換的函式形式如下
在這里插入圖片描述
式中最重要的引數是[x1, x2][y1, y2],根據演算法函式的描述,讀者可以發現,其中x1x2是給出需要轉換的灰度范圍,y1y2引數決定線性變換的斜率,

x1, x2, y1, y2分別取不同的值的組合時,可得到不同的變換效果,例如以下情況,

  • 如果 x 1 = y 1 , x 2 = y 2 x_1=y_1, x_2=y_2 x1?=y1?,x2?=y2?,則 f ( x ) f(x) f(x)為1條斜率為1的直線,增強影像將和原影像相同,
  • 如果 x 1 = x 2 , y 1 = 0 , y 2 = 255 x_1=x_2, y_1=0, y_2=255 x1?=x2?,y1?=0,y2?=255,則增強影像只剩下2個灰度等級,分段線性變換起到了閾值化的效果,此時的對比度最大,但是細節丟失最多,
  • x 1 、 x 2 、 y 1 、 y 2 x_1、x_2、y_1、y_2 x1?x2?y1?y2?取一般值時的分段線性變換函式的圖形如下圖所示,

在這里插入圖片描述

分段的灰度拉伸可以更加靈活地控制輸出灰度直方圖的分布,可以有選擇地拉伸某段灰度區間,以改善輸出影像,如果一幅影像灰度集中在較暗的區域而導致影像偏暗,可以用灰度拉伸功能來擴展(斜率>1)物體的灰度區間以改善影像;同樣,如果影像灰度集中在較亮的區域而導致影像偏亮,也可以用灰度拉伸功能來壓縮(斜率<1)物體灰度區間以改善影像質量

灰度拉伸是通過控制輸出影像中灰度級的展開程度來達到控制對比度的效果的,一般情況下都限制 x 1 < x 2 , y 1 < y 2 x_1<x_2, y_1<y_2 x1?x2?,y1?y2?,從而保證函式是單調遞增的,以避免造成處理過的影像中灰度級發生顛倒,

6.2 MATLAB編程實作

使用作者自己撰寫的MATLAB影像處理函式,imgrayscaling()imgrayscaling()具有很好的兼容性,它可以處理灰度、彩色、索引等不同型別,以及double、uint8等不同存盤方式的影像,

(1)輸入的處理
為了可以使用可變個數的引數,imgrayscaling()函式中使用了細胞陣列,將函式的輸入引數整體看作一個細胞陣列,為此需要撰寫一個parse_inputs()函式來決議該細胞陣列的內容,該函式的回傳值為imgrayscaling()中所有可能由用戶初始化的引數值,
parse_inputs()函式的完整實作如下,其中對未知個數的輸入使用了引數varargin來表示,

function [A,map,x1,x2,y1,y2] = parse_inputs(varargin)
% 分析輸入引數個數和有效性的函式
% A 輸入影像,RGB圖(3D),灰度圖(2D),或者索引圖(X)
% map 索引圖調色板(:,3% [x1,x2]引陣列1,曲線中兩個轉折點的橫坐標
% [y1,y2]引陣列2,曲線中兩個轉折點的縱坐標
% 首先建立一個空的map變數,以免后面呼叫isempty(map)時出錯
map=[];
% IPTCHECKNARGIN(LOW,HIGH,NUM_INPUTS,FUNC_NAME)檢查輸入引數
%是否在LOW和HIGH所指定的范圍內,如果不再范圍內,則此函式給出一
%個格式化的錯誤資訊
iptchecknargin(3,4,nargin,mfilename);
% IPTCHECKINPUT(A,CLASSES,ATTRIBUTES,FUNC_NAME,VAR_NAME,ARG_POS)
% 檢查給定矩陣A中的元素是否屬于給定的型別串列,如果存在元素不屬于給定
% 型別,則給出一個錯誤的資訊
iptcheckinput(varargin{1},{'uint8','uint16','int16','double'},...
 {'real','nonsparse'},mfilename,'I,X or RGB',1);
switch nargin
    case 3  % 可能是imgrayscaling(I,[x1,x2],[y1,y2])imgrayscaling(RGB,[x1,x2],[y1,y2]) 
        A=varargin{1};
        x1=varargin{2}(1);
        x2=varargin{2}(2);
        y1=varargin{3}(1);
        y2=varargin{3}(2);
    case 4  % imgrayscaling(X,map,[x1,x2],[y1,y2])
        A=varargin{1};
        map=varargin{2};
        x1=varargin{2}(1);
        x2=varargin{2}(2);
        y1=varargin{3}(1);
        y2=varargin{3}(2);
end
% 檢查輸入引數的有效性
% 檢查RGB陣列
if(ndims(A)==3) && (size(A,3)~=3)
    msg=sprintf('%s:真彩色影像應當使用一個M-N-3維度的陣列',upper(mfilename));
    eid=sprint('Images:%s:true Color RGB Image Must Be M by N by 3',mfilename);
    error(eid,'%s',msg);
end
if ~isempty(map)
    if (size(map,2)~=3) || ndims(map)>2
        msg1 = sprintf('%s:matix',...
            upper(mfilename));
        msg2 = 'three 3 parallel';
        eid = sprintf('Images:%s:inColormapMustBe2Dwith3Cols',mfilename);
        error(eid,'%s %s',msg1,msg2);
    elseif (min(map(:))<0) || (max(map(:))>1)
        msg1 = sprintf('%s',upper(mfilename));
        msg2 = 'between 0 and 1';
        eid = sprintf('Images:%s:colormapValsMustBe0tol',mfilename);
        error(eid,'%s %s',msg1,msg2);
    end
end
if isa(A,'int16')
    A = int16tounit16(A);
end
end
function  out = imgrayscaling(varargin)
% 執行灰度拉伸功能
% 語法:
% out=imgrayscaling(I,[x1,x2],[y1,y2]);
% out=imgrayscaling(X,map,[x1,x2],[y1,y2]);
% out=imgrayscaling(RGB,[x1,x2],[y1,y2]);
% 這個函式提供灰度拉伸功能,輸入影像應當是灰度影像,但
% 如果提供的不是灰度影像的話,函式會自動將影像轉化為灰度影像
% x1,x2,y1,y2應當使用雙精度
% 型別存盤,影像矩陣可以使用任何MATLAVB支持的型別存盤
[ A, map, x1, x2, y1, y2 ]= parse_inputs(varargin{:});
range = getrangefromclass(A);
range = range(2);
%判斷影像是RGB還是GRAY灰度圖,如果不是灰度圖,則需要執行轉換
if  ndims(A)==3                        %A矩陣為3維,則是RGB影像
       A = rgb2gray(A);
elseif   ~isempty(map)                 %map變數為非空,則索引影像
       A = ind2gray(A,map);
end                                   %對灰度圖無需轉換
[M,N]=size(A);
Img= im2double(A);
out=zeros(M,N);
for i=1:M
   for j=1:N
        if Img(i,j)<x1
             out(i,j)=y1 * Img(i,j) / x1;
        elseif Img(i,j)>x2
              out(i,j)=(Img(i,j)-x2) * (range-y2) / (range-x2) + y2;
        else
              out(i,j)=(Img(i,j)-x1) * (y2-y1) / (x2-x1) + y1;
        end
   end
end
if isa(A,'uint8')             %將輸出影像的格式轉化為與輸入影像相同
     out = im2uint8(out);
elseif isa(A,'uint16')
     out = im2uint16(out);    %其他情況,就雙精度浮點型影像
end
%輸出
if nargout==0                    %如果沒有提供引數接受回傳值
     imshow(out);
     return;
end
I = imread('coins.png');
J1 = imgrayscaling(I,[0.3,0.7],[0.15,0.85]);
figure(1)
subplot(1,3,1)
imshow(J1,[]);
title('[x1,x2]=[0.3,0.7] [y1,y2]=[0.15,0.85]')
J2 = imgrayscaling(I,[0.15,0.85],[0.3,0.7]);
figure(1)
subplot(1,3,2)
imshow(J2,[]);
title('[x1,x2]=[0.15,0.85] [y1,y2]=[0.3,0.7]')
subplot(1,3,3)
imshow(I,[]);
title('原影像')

結果:
在這里插入圖片描述

I = imread('coins.png');
J1 = imgrayscaling(I,[0.3,0.7],[0.15,0.85]);
figure(1)
subplot(1,3,1)
imhist(J1);
title('[x1,x2]=[0.3,0.7] [y1,y2]=[0.15,0.85]')
J2 = imgrayscaling(I,[0.15,0.85],[0.3,0.7]);
figure(1)
subplot(1,3,2)
imhist(J2);
title('[x1,x2]=[0.15,0.85] [y1,y2]=[0.3,0.7]')
subplot(1,3,3)
imhist(I);
title('原影像')

結果:
在這里插入圖片描述

從圖中可以看到第一組引數讓影像灰度直方圖上的非零區域擴展,而第二組引數讓影像的灰度直方圖非零區域壓縮,這給目標影像帶來了截然不同的效果,第一幅影像中的細節更加清晰,而第二幅影像更加柔和,

7 直方圖均衡化

7.1 理論基礎

直方圖均衡化又稱為灰度均衡化,是指通過某種灰度映射使輸入影像轉換為在每一灰度級上都有近似相同的像素點數的輸出影像(即輸出的直方圖是均勻的),在經過均衡化處理后的影像中,像素將占有盡可能多的灰度級并且分布均勻,因此,這樣的影像將具有較高的對比度和較大的動態范圍,

為了便于分析,首先考慮灰度范圍為0~1且連續的情況,此時影像的歸一化直方圖即為概率密度函式(PDF),
在這里插入圖片描述
由概率密度函式的性質,有以下關系
在這里插入圖片描述
設轉換前影像的概率密度函式為 p r ( r ) p_r(r) pr?(r),轉換后影像的概率密度函式為 p s ( s ) p_s(s) ps?(s),轉換函式(灰度映射關系)為 s = f ( r ) s=f(r) s=f(r),由概率論知識可得下式
在這里插入圖片描述

這樣,如果想使轉換后影像的概率密度函式: p s ( S ) = 1 , 0 ≤ S ≤ 1 p_s(S)=1,0≤S≤1 ps?(S)=1,0S1(即直方圖為均勻的),則必須滿足下式
在這里插入圖片描述

等式兩邊對r積分,可得下式
在這里插入圖片描述

該式稱為影像的累積分布函式(CDF),該式是在灰度取值在[0, 1]范圍內的情況下推匯出來的,對于[0,255]的情況,只要乘以最大灰度值 D m a x D_{max} Dmax?(對于灰度圖就是255)即可,此時灰度均衡的轉換公式如下
在這里插入圖片描述
其中, D B D_B DB?為轉換后的灰度值, D A D_A DA?為轉換前的灰度值,
而對于離散灰度級,相應的轉換公式應如下
在這里插入圖片描述

式中 H i H_i Hi?為第 i i i級灰度的像素個數, A 0 A_0 A0?為影像的面積,即像素總數,

式中的變換函式 f f f是一個單調增加的函式,這保證了在輸出影像中不會出現灰度反轉的情況(變換后相對灰度不變),從而能夠防止在變換中改變影像的實質,以至于影響對影像的識別和判讀,
這里還需要說明一點,對于上式的離散變換,通常無法再像連續變換時那樣可以得到嚴格的均勻概率密度函式 ( p s ( S ) = 1 , 0 ≤ S ≤ 1 ) (p_s(S)=1,0≤S≤1) ps?(S)=1,0S1,但無論如何,該式的應用有展開輸入影像直方圖的一般趨勢,可使得均衡化過的影像灰度級具有更大的范圍,從而得到近似均勻的直方圖,

7.2 MATLAB編程實作

MATLAB影像處理工具箱提供了用于直方圖均衡化的函式histeq(),呼叫語法如下
在這里插入圖片描述
引數說明:

  • I是原始影像

回傳值:

  • J是經過直方圖均衡化的輸出影像;
  • T是變換矩陣

影像易受光照、視角、方位、噪聲等的影響,在這些因素的作用下,同一類影像的不同變形體之間的差距有時大于該類影像與另一類影像之間的差距,這就給影像識別/分類帶來了困擾,影像歸一化就是將影像轉換成唯一的標準形式以抵抗各種變換,從而可消除同類影像不同變形體之間的外觀差異,

當影像歸一化用于消除灰度因素(光照等)造成的影像外觀變化時,稱為(影像)灰度歸一化,下面將利用直方圖均衡化技術實作影像的灰度歸一化,

I=imread('pout.tif');
I=im2double(I);
%% 對于對比度變大的影像
I1=2*I-55/255;
subplot(4,4,1);
imshow(I1);
title('對比度變大的影像')
subplot(4,4,2)
imhist(I1);
subplot(4,4,3)
imshow(histeq(I1));
subplot(4,4,4)
imhist(histeq(I1));
%% 對于對比度變小的影像
I2=0.5*I+55/255;
subplot(4,4,5);
imshow(I2);
title('對比度變小的影像')
subplot(4,4,6)
imhist(I2);
subplot(4,4,7)
imshow(histeq(I2));
subplot(4,4,8)
imhist(histeq(I2));
%% 對于線性增加亮度的影像
I3=I+55/255;
subplot(4,4,9);
imshow(I3);
title('線性增加亮度的影像')
subplot(4,4,10)
imhist(I3);
subplot(4,4,11)
imshow(histeq(I3));
subplot(4,4,12)
imhist(histeq(I3));
%% 對于線性減少亮度的影像
I4=I-55/255;
subplot(4,4,13);
imshow(I4);
title('線性減少亮度的影像')
subplot(4,4,14)
imhist(I4);
subplot(4,4,15)
imshow(histeq(I4));
subplot(4,4,16)
imhist(histeq(I4));

結果:

在這里插入圖片描述

從圖中可以發現,將直方圖均衡化演算法應用于左側的亮度、對比度不同的各個影像后,得到了右側直方圖大致相同的影像,這體現了直方圖均衡化作為強大自適應性的增強工具的作用,當原始影像的直方圖不同而影像結構性內容相同時,直方圖均衡化所得到的結果在視覺上幾乎是完全一致的,這對于在進行影像分析和比較之前將影像轉化為統一的形式是十分有益的,

從灰度直方圖的意義上說,如果一幅影像的直方圖非零范圍占有所有可能的灰度級并且在這些灰度級上均勻分布,那么這幅影像的對比度較高,而且灰度色調較為豐富,從而易于進行判讀,直方圖均衡化演算法恰恰能滿足這一要求,

8 直方圖規定化(匹配)

直方圖均衡化演算法可以自動確定灰度變換函式,從而獲得具有均勻直方圖的輸出影像,它主要用于增強動態范圍偏小的影像對比度,豐富影像的灰度級,這種方法的優點是操作簡單,且結果可以預知,當影像需要自動增強時是一種不錯的選擇,

但有時我們希望可以對變換程序加以控制,如能夠人為地修正直方圖的形狀,或者說是獲得具有指定直方圖的輸出影像,這樣就可以有選擇地增強某個灰度范圍內的對比度或使影像灰度值滿足某種特定的分布,這種用于產生具有特定直方圖的影像的方法叫作直方圖規定化,或直方圖匹配,

8.1 理論基礎

直方圖規定化是在運用均衡化原理的基礎上,通過建立原始影像和期望影像(待匹配直方圖的影像)之間的關系,使原始影像的直方圖匹配特定的形狀,從而彌補了直方圖均衡化不具備互動作用的特性,
其匹配原理是先對原始的影像均衡化,轉換公式如下
在這里插入圖片描述
同時對待匹配直方圖的影像進行均衡化處理,公式如下
在這里插入圖片描述
由于都是均衡化,故可令 s ≈ v s\approx v sv,則有如下關系
在這里插入圖片描述

于是可以按照如下的步驟由輸入影像得到一個具有規定概率密度函式的影像,
(1) 根據式
在這里插入圖片描述
得到變換關系 f ( r ) f(r) f(r)

(2) 根據式
在這里插入圖片描述
得到變換關系 g ( z ) g(z) g(z)

(3) 求得反變換函式 g ? 1 ( s ) g^{-1}(s) g?1(s)
(4) 對輸入影像所有像素應用式
在這里插入圖片描述

中的變換,從而得到輸出影像,

當然,在實際計算中利用的是上述公式的離散形式,這樣就不必去關心函式 f ( r ) 、 g ( z ) f(r)、g(z) f(r)g(z)以及反變換函式 g ? 1 ( s ) g^{-1}(s) g?1(s)具體的決議形式,而可以直接將它們作為映射表處理了,其中, f ( r ) f(r) f(r)為輸入影像均衡化的離散灰度級映射關系, g ( z ) g(z) g(z)為標準影像均衡化的離散灰度級映射關系,而 g ? 1 ( s ) g^{-1}(s) g?1(s)則是標準影像均衡化的逆映射關系,它給出了從經過均衡化處理的標準化影像到原標準影像的離散灰度映射,相當于均衡化處理的逆程序,

8.2 MATLAB編程實作

Histeq()函式不僅可以用于直方圖均衡化,也可以用于直方圖規定化,此時需要提供可選引數hgram,呼叫語法如下
在這里插入圖片描述
函式會將原始影像I處理成一幅以用戶指定向量hgram作為直方圖的影像,
引數hgram的分量數目即為直方圖的收集箱數目,對于double型影像,hgram的元素取值范圍是[0,1];對于uint8型影像取值范圍為[0, 255];對于uint16型影像取值范圍則為[0, 65535],其他引數的意義與在直方圖均衡化中的相同

例子:

I=imread('pout.tif'); % 原影像
I1=imread('coins.png');  % 要匹配直方圖的影像
I2=imread('circuit.tif');  % 要匹配直方圖的影像
% 計算直方圖
[hgram1,x]=imhist(I1);
[hgram2,x]=imhist(I2);
% 執行直方圖均衡化
J1=histeq(I,hgram1);
J2=histeq(I,hgram2);
subplot(2,3,1)
imshow(I),title('原圖')
subplot(2,3,2)
imshow(I1),title('標準圖1')
subplot(2,3,3)
imshow(I2),title('標準圖2')
subplot(2,3,5)
imshow(J1),title('規定化到1')
subplot(2,3,6)
imshow(J2),title('規定化到2')
figure;
subplot(2,3,1)
imhist(I),title('原圖')
subplot(2,3,2)
imhist(I1),title('標準圖1')
subplot(2,3,3)
imhist(I2),title('標準圖2')
subplot(2,3,5)
imhist(J1),title('規定化到1')
subplot(2,3,6)
imhist(J2),title('規定化到2')

結果:

在這里插入圖片描述

在這里插入圖片描述

直方圖規定化本質上是一種擬合程序,因此變換得到的直方圖與標準目標影像的直方圖并不會完全一致,然而即使只是相似的擬合,仍然使規定化的影像在亮度與對比度上具有類似標準影像的特性,這正是直方圖規定化的目的所在

內容來源:
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/163138.html

標籤:其他

上一篇:色散時域補償演算法——TSM演算法(時域離散采樣方法)

下一篇:[Python影像處理] 二十九.MoviePy視頻編輯庫實作抖音短視頻剪切合并操作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more