直方圖均衡化
-
灰度映射函數:
s=T(r),0≤r≤L?1(3.8)s = T(r), \quad 0\leq r \leq L -1 \tag{3.8}s=T(r),0≤r≤L?1(3.8)
-
假設:
-
(1) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 上是一個單調遞增函數。
-
(2) 對于0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 ,有0≤T(r)≤L?10 \leq{T(r)} \leq{L-1}0≤T(r)≤L?1 。
-
逆變換
r=T?1(s),0≤s≤L?1(3.9)r = T^{-1}(s), \quad 0 \leq s \leq L-1 \tag{3.9} r=T?1(s),0≤s≤L?1(3.9)
將條件(1)改為:
- (1’) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 上是一個嚴格單調遞增函數。
(1)中T(r)T(r)T(r)單調遞增的條件保證輸出灰度值從不小于對應的輸入值,從而防止灰度反轉而產生偽像。
(2)保證輸出灰度的范圍與輸入的范圍相同。
(1’)保證從sss返回到rrr的映射是一對一的,從而防止出現歧義。
圖像的灰度可視為區間[0,L?1][0, L-1][0,L?1]內的一個隨機變量。令pr(r)p_{r}(r)pr?(r)和ps(s)p_{s}(s)ps?(s)表示兩幅不同圖像中灰度值rrr和sss的PDF(概率密度函數)。ppp的下標表明pr(r)p_{r}(r)pr?(r)和ps(s)p_{s}(s)ps?(s)是不同的函數。若已知pr(r)p_{r}(r)pr?(r)和T(r)T(r)T(r),且T(r)T(r)T(r)是連續的且在感興趣的值域上是可微的,則變換(映射)后的變量sss的PDF是
ps(s)=pr(r)∣drds∣(3.10)p_{s}(s) = p_{r}(r) \bigg\lvert \frac{\textze8trgl8bvbqr}{\textze8trgl8bvbqs}\bigg\rvert \tag{3.10}ps?(s)=pr?(r)∣∣∣∣?dsdr?∣∣∣∣?(3.10)
可以看到輸出灰度變量sss的PDF是由輸入灰度的PDF和所有的變換函數確定的
圖像處理中的一個特別重要的變換函數是
s=T(r)=(L?1)∫0rpr(w)dw(3.11)s = T(r) = (L-1) \int_{0}^{r} p_r(w) \textze8trgl8bvbq w \tag{3.11} s=T(r)=(L?1)∫0r?pr?(w)dw(3.11)
www是一個假積分變量,右側的積分是隨機變量rrr的累積分布函數(CDF)
根據萊布尼茨積分法則可知
drds=dT(r)dr=(L?1)ddr[∫0rpr(w)dw]=(L?1)pr(r)(3.12)\frac{\textze8trgl8bvbqr}{\textze8trgl8bvbqs} = \frac{\textze8trgl8bvbqT(r)}{\textze8trgl8bvbqr} = (L - 1) \frac{\textze8trgl8bvbq}{\textze8trgl8bvbqr} \Bigg[\int_{0}^{r} p_r(w) \textze8trgl8bvbq w \Bigg] = (L-1)p_{r}(r)\tag{3.12}dsdr?=drdT(r)?=(L?1)drd?[∫0r?pr?(w)dw]=(L?1)pr?(r)(3.12)
用這個結果代替式(3.10)的drds\frac{\textze8trgl8bvbqr}{\textze8trgl8bvbqs}dsdr?,并且所有的概率值都是正的,有:
ps(s)=pr(r)∣drds∣=pr(r)∣1(L?1)pr(r)∣=1L?1,0≤s≤L?1(3.10)p_{s}(s) = p_{r}(r) \bigg\lvert \frac{\textze8trgl8bvbqr}{\textze8trgl8bvbqs}\bigg\rvert = p_{r}(r) \bigg\lvert \frac{1}{(L-1)p_{r}(r)}\bigg\rvert = \frac{1}{L - 1}, \;0 \leq s \leq L - 1\tag{3.10}ps?(s)=pr?(r)∣∣∣∣?dsdr?∣∣∣∣?=pr?(r)∣∣∣∣?(L?1)pr?(r)1?∣∣∣∣?=L?11?,0≤s≤L?1(3.10)
直方圖均衡化或直方圖線性變換
式(3.11)變換的離散形式為:
sk=T(rk)=(L?1)∑j=0kpr(rj),k=0,1,2,…,L?1(3.15)s_{k} = T(r_{k}) = (L -1) \sum_{j=0}^k p_{r}(r_{j}),\quad k = 0, 1, 2, \dots, L-1 \tag{3.15}sk?=T(rk?)=(L?1)j=0∑k?pr?(rj?),k=0,1,2,…,L?1(3.15)
def my_calhist(img
):"""histogram equalizationparam: input img: uint8[0, 255] grayscale imagereturn uint8[0, 255] grayscale image after histogram equalization"""hist
, bins
= my_hist
(img
, bins
=256, normalized
=True)hist_cumsum
= np
.round(np
.cumsum
(hist
) * 255).astype
(int)img_dst
= img
.copy
()img_dst
= hist_cumsum
[img_dst
]
return img_dst
, _
import time
img_1st
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(1)(top_left).tif', 0)
img_2nd
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(2)(2nd_from_top).tif', 0)
img_3rd
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(3)(third_from_top).tif', 0)
img_4th
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)img_list
=['img_1st', 'img_2nd', 'img_3rd', 'img_4th']fig
= plt
.figure
(figsize
=(20, 20))
start_time
= time
.time
()
for i
in range(len(img_list
)):ax
= fig
.add_subplot
(4, 4, i
+1)ax
.imshow
(eval(img_list
[i
]), cmap
='gray', vmin
=0, vmax
=255), ax
.set_title
('Original')img_dst
, _
= my_calhist
(eval(img_list
[i
]))ax1
= fig
.add_subplot
(4, 4, i
+5)ax1
.imshow
(img_dst
, cmap
='gray', vmin
=0, vmax
=255), ax1
.set_title
('After Histogram Equalization')ax2
= fig
.add_subplot
(4, 4, i
+9)hist
, bins
= my_hist
(eval(img_list
[i
]), bins
=256)ax2
.bar
(bins
, hist
), ax2
.set_title
('Original Histogram')ax3
= fig
.add_subplot
(4, 4, i
+13)hist
, bins
= my_hist
(img_dst
, bins
=256)ax3
.bar
(bins
, hist
), ax3
.set_title
('Hist After Histogram Equalization')elapse
= time
.time
() - start_time
print(f
'Elapse -> {elapse}s')
plt
.tight_layout
()
plt
.show
()
Elapse -> 2.3357810974121094s
def my_calhist(img
):"""histogram equalizationparam: input img: uint8[0, 255] grayscale imagereturn uint8[0, 255] grayscale image after histogram equalization"""hist
, bins
= my_hist
(img
, bins
=256, normalized
=True)hist_cumsum
= np
.round(np
.cumsum
(hist
) * 255).astype
(int)height
, width
= img
.shape
[:2]img_dst
= np
.zeros
([height
, width
], np
.uint8
)for h
in range(height
):for w
in range(width
):img_dst
[h
, w
] = hist_cumsum
[img
[h
, w
]] img_dst
= np
.clip
(img_dst
, 0, 255).astype
(np
.uint8
)return img_dst
, hist_cumsum
img_1st
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(1)(top_left).tif', 0)
img_2nd
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(2)(2nd_from_top).tif', 0)
img_3rd
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(3)(third_from_top).tif', 0)
img_4th
= cv2
.imread
('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)img_list
=['img_1st', 'img_2nd', 'img_3rd', 'img_4th']fig
= plt
.figure
(figsize
=(6, 6))
for i
in range(len(img_list
)):_
, map_dict
= my_calhist
(eval(img_list
[i
]))ax1
= fig
.gca
()ax1
.plot
(map_dict
)plt
.xlabel
('Original gray value', fontsize
=12)
plt
.ylabel
('Transformed gray value', fontsize
=12)
plt
.xticks
([0, 64, 128, 192, 255])
plt
.yticks
([0, 64, 128, 192, 255])
plt
.xlim
([0, 255])
plt
.ylim
([0, 255])
plt
.tight_layout
()
plt
.show
()
總結
以上是生活随笔為你收集整理的第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。