主頁 >  其他 > 【數字影像處理】(二)全面! 影像的點運算

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

2020-10-08 14:48:11 其他

文章目錄

  • 影像的點運算
    • 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/qita/163102.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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more