日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)

發(fā)布時(shí)間:2023/12/10 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直方圖均衡化

  • 灰度映射函數(shù):
    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),0rL?1(3.8)

  • 假設(shè):

  • (1) T(r)T(r)T(r)在區(qū)間0≤r≤L?10 \leq{r} \leq{L-1}0rL?1 上是一個(gè)單調(diào)遞增函數(shù)。

  • (2) 對(duì)于0≤r≤L?10 \leq{r} \leq{L-1}0rL?1 ,有0≤T(r)≤L?10 \leq{T(r)} \leq{L-1}0T(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),0sL?1(3.9)

將條件(1)改為:

  • (1’) T(r)T(r)T(r)在區(qū)間0≤r≤L?10 \leq{r} \leq{L-1}0rL?1 上是一個(gè)嚴(yán)格單調(diào)遞增函數(shù)。

(1)中T(r)T(r)T(r)單調(diào)遞增的條件保證輸出灰度值從不小于對(duì)應(yīng)的輸入值,從而防止灰度反轉(zhuǎn)而產(chǎn)生偽像。
(2)保證輸出灰度的范圍與輸入的范圍相同。
(1’)保證從sss返回到rrr的映射是一對(duì)一的,從而防止出現(xiàn)歧義。

圖像的灰度可視為區(qū)間[0,L?1][0, L-1][0,L?1]內(nèi)的一個(gè)隨機(jī)變量。令pr(r)p_{r}(r)pr?(r)ps(s)p_{s}(s)ps?(s)表示兩幅不同圖像中灰度值rrrsssPDF(概率密度函數(shù))ppp的下標(biāo)表明pr(r)p_{r}(r)pr?(r)ps(s)p_{s}(s)ps?(s)是不同的函數(shù)。若已知pr(r)p_{r}(r)pr?(r)T(r)T(r)T(r),且T(r)T(r)T(r)是連續(xù)的且在感興趣的值域上是可微的,則變換(映射)后的變量sss的PDF是
ps(s)=pr(r)∣drds∣(3.10)p_{s}(s) = p_{r}(r) \bigg\lvert \frac{\textozvdkddzhkzdr}{\textozvdkddzhkzds}\bigg\rvert \tag{3.10}ps?(s)=pr?(r)?dsdr??(3.10)
可以看到輸出灰度變量sss的PDF是由輸入灰度的PDF和所有的變換函數(shù)確定的

圖像處理中的一個(gè)特別重要的變換函數(shù)是
s=T(r)=(L?1)∫0rpr(w)dw(3.11)s = T(r) = (L-1) \int_{0}^{r} p_r(w) \textozvdkddzhkzd w \tag{3.11} s=T(r)=(L?1)0r?pr?(w)dw(3.11)
www是一個(gè)假積分變量,右側(cè)的積分是隨機(jī)變量rrr累積分布函數(shù)(CDF)

根據(jù)萊布尼茨積分法則可知
drds=dT(r)dr=(L?1)ddr[∫0rpr(w)dw]=(L?1)pr(r)(3.12)\frac{\textozvdkddzhkzdr}{\textozvdkddzhkzds} = \frac{\textozvdkddzhkzdT(r)}{\textozvdkddzhkzdr} = (L - 1) \frac{\textozvdkddzhkzd}{\textozvdkddzhkzdr} \Bigg[\int_{0}^{r} p_r(w) \textozvdkddzhkzd 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)
用這個(gè)結(jié)果代替式(3.10)的drds\frac{\textozvdkddzhkzdr}{\textozvdkddzhkzds}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{\textozvdkddzhkzdr}{\textozvdkddzhkzds}\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?,0sL?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=0k?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)#--------------------------------Numpy-------------------hist_cumsum = np.round(np.cumsum(hist) * 255).astype(int)img_dst = img.copy()img_dst = hist_cumsum[img_dst]#--------------------------------loop---------------------- # map_dict = {} # map_dict = map_dict.fromkeys(bins.astype(int), 0) # for i in bins: # s = np.round(255 * hist[:i].sum()).astype(int) # map_dict[i] = s# 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] = map_dict[img[h, w]] # dict 用[ ] # img_dst = np.clip(img_dst, 0, 255).astype(np.uint8) # return img_dst, map_dict 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)):# plot orginal imageax = fig.add_subplot(4, 4, i+1)ax.imshow(eval(img_list[i]), cmap='gray', vmin=0, vmax=255), ax.set_title('Original')# plot histogram equalization imageimg_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')# plot orginal histax2 = 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')# plot hist after histogram equalizationax3 = 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]] # dict 用[ ]img_dst = np.clip(img_dst, 0, 255).astype(np.uint8)return img_dst, hist_cumsum # 直方圖均衡化轉(zhuǎn)換函數(shù) 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)):# plot histogram equalization transform_, 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()

總結(jié)

以上是生活随笔為你收集整理的第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波8 - 直方图处理 - 直方图均衡化(全局直方图均衡化)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。