第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波8 - 直方圖處理 - 直方圖均衡化(全局直方圖均衡化)

直方圖均衡化

  • 灰度映射函數:
    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)

  • 假設:

  • (1) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0rL?1 上是一個單調遞增函數。

  • (2) 對于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)在區間0≤r≤L?10 \leq{r} \leq{L-1}0rL?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)表示兩幅不同圖像中灰度值rrrsssPDF(概率密度函數)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{\text{d}r}{\text{d}s}\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) \text{d} 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{\text{d}r}{\text{d}s} = \frac{\text{d}T(r)}{\text{d}r} = (L - 1) \frac{\text{d}}{\text{d}r} \Bigg[\int_{0}^{r} p_r(w) \text{d} 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{\text{d}r}{\text{d}s}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{\text{d}r}{\text{d}s}\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
# 直方圖均衡化轉換函數
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()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 元組和列表區別_Python干貨整理:一分鐘了解元組與列表使用與區別

元組是 Python 對象的集合,跟列表十分相似。下面進行簡單的對比。列表與元組1、python中的列表list是變量,而元組tuple是常量。列表:是使用方括號[],元組:則是使用圓括號()2、兩者都可以使用索引讀取值列表1.列表中的a…

JS拖拽,移動與拉伸

上次做的簡單的拖拽:javascript簡單拖拽練習(鼠標事件 mousedown mousemove mouseup) 這次增加了一些相關的功能,增加四個角的拉伸改變寬度,主要還是用到一些簡單的坐標位置計算,沒有什么技術難度,熟練了一下自己對拖拽…

關于release后retainCount還是1的問題

轉自:http://www.cocoachina.com/bbs/read.php?tid175523 realse之后再調用還能調用的的問題,我做了這么多年也是經常遇到,也曾經試圖尋找原因, 就像6樓說的,很多時候都會出現realse過后還能調用的現象。而且對象不是…

Maven for Eclipse 第二章 ——安裝 m2eclipse插件

m2eclipse 是一個提供了 Maven 與 Eclipse 整合的插件。它的意圖是橋接上 Maven 和 Eclipse 之間的缺口。通過 Maven 原型提供的簡單直白的接口創建項目,它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 創建和導入 Maven 項目在 Eclipse 運行…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波9 - 直方圖處理 - 直方圖匹配(規定化)灰度圖像,彩色圖像都適用

直方圖匹配(規定化) 連續灰度 sT(r)(L?1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L?1)∫0r?pr?(w)dw(3.17) 定義關于變量zzz的一個函數GGG,它具有如下性質: G(z)(L?1)∫0zpz(v)d…

C#委托之就是跟委托過不去…

在上一篇博文當中,我們例舉了一個機房自動化系統的邏輯控制程序,其中用到了Lambda表達式,因此方便了我們程序功能的實現.然而,我們不能僅僅為實現功能,完成任務而奮斗,應該知其然,知其所以然,也就是說,知道了Lambda表達式能夠帶來這樣的方便,也應該知道為什么能夠帶來這樣的方便…

closewait一直不釋放_機床為什么要釋放應力?怎么釋放應力才好?

在機床行業內一直有種說法,就是機床需要釋放應力,而且越是高精密的機床就越要注意應力的釋放,最近就有機床粉向小編詢問應力是什么?為什么要釋放應力?如果釋放要釋放多久?怎么釋放應力才好等一系列關于機床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

點我看題目 題意 :兩條平行線上分別有兩種城市的生存,一條線上是貧窮城市,他們每一座城市都剛好只缺乏一種物資,而另一條線上是富有城市,他們每一座城市剛好只富有一種物資,所以要從富有城市出口到貧窮城市…

表單元素選擇器

無論是提交還是傳遞數據,表單元素在動態交互頁面的作用是非常重要的。jQuery中專門加入了表單選擇器,從而能夠極其方便地獲取到某個類型的表單元素 表單選擇器的具體方法描述: 注意事項: 除了input篩選選擇器,幾乎每個…

怎樣在excel表格中畫斜線并打字_一日一技丨Excel斜線表頭如何制作?標題、表頭的4個技巧...

來源 | 迅捷PDF轉換器 (ID:xjpdf6)作者丨小小迅「一日一技」是每天的知識分享專欄,一是分享一些PDF、Office、辦公小技巧;二是抽取小可愛們在留言中的疑問并解決。希望對大家有所幫助!表頭的標題是Excel中的第一道大門,精致好看的…

Retina時代的前端視覺優化

隨著New iPad的發布,平板也將逐漸進入Retina時代,在高分辨率設備里圖片的顯示效果通常不盡人意,為了達到最佳的顯示效果就需要對圖片進行優化,這里介紹一些優化方法: 一、用CSS替代圖片 這一點在任何時候都適用&#x…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波10 - 直方圖處理 - 局部直方圖處理

這里寫目錄標題局部直方圖處理局部直方圖處理 因為像素是由基于整個圖像的灰度的變換函數修改的。這種全局性方法適合于整體增強,但當目的是增強圖像中幾個小區域的細節時,通常就會失敗。這是因為在這些小區域中,像素的數量對計算全局變換的…

CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上來看到A題,就有思路,然后馬上敲,但是苦于自己很久沒有敲計數的題了,許多函數都稍微回憶了一陣子。A題的主要做法就是將每個數質因數分解,統計每個質因子的個數,對于每個質因子pi的…

ES6之const命令

一直以來以ecma為核心的js始終沒有常量的概念,es6則彌補了這一個缺陷; const foofoo;foobar;//TypeError: Assignment to constant variable.上例聲明了一個基本類型的常量,如過試圖修改初始值則會報錯;如果是引用類型的值同樣適用…

C++和Rust_后端程序員一定要看的語言大比拼:Java vs. Go vs. Rust

這是Java,Go和Rust之間的比較。這不是基準測試,更多是對可執行文件大小、內存使用率、CPU使用率、運行時要求等的比較,當然還有一個小的基準測試,可以看到每秒處理的請求數量,我將嘗試對這些數字進行有意義的解讀。為了…

Hdu 2015 偶數求和

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2040。水題。CODE&#xff1a;1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <math.h>5 using namespace std;6 7 const int maxn 102;8 9 int save[ma…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波11 - 直方圖處理 - 使用直方圖統計量增強圖像

使用直方圖統計量增強圖像 全局均值和方差 μn∑i0L?1(ri?m)np(ri)(3.24)\mu_{n} \sum_{i0}^{L-1} (r_{i} - m)^{n} p(r_{i}) \tag{3.24}μn?i0∑L?1?(ri??m)np(ri?)(3.24) m∑i0L?1rip(ri)(3.25)m \sum_{i0}^{L-1} r_{i} p(r_{i}) \tag{3.25}mi0∑L?1?ri?p(ri?…

數據結構 --- 堆

to be continued轉載于:https://www.cnblogs.com/zhongzhiqiang/p/5808564.html

HDU - 1723 - Distribute Message

先上題目&#xff1a; Distribute Message Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1186 Accepted Submission(s): 547 Problem DescriptionThe contest’s message distribution is a big thing in pre…

nodejs 圖片處理模塊 rotate_學會Pillow再也不用PS啦——Python圖像處理庫Pillow入門!...

你在用什么軟件進行圖像處理呢&#xff1f;厭倦了鼠標和手指的拖拖點點&#xff0c;想不想用程序和代碼進行圖像的高效處理&#xff0c;Python作為簡單高效又很強大的一門編程語言&#xff0c;對于圖像的處理自然也是輕松拿下&#xff0c;聽起來是不是很酷很極客&#xff0c;那…