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

直方圖匹配(規定化)

  • 連續灰度
    s=T(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} s=T(r)=(L?1)0r?pr?(w)dw(3.17)
    定義關于變量zzz的一個函數GGG,它具有如下性質:
    G(z)=(L?1)∫0zpz(v)dv=s(3.18)G(z) = (L - 1) \int_{0}^{z} p_z(v) \text{d} v = s \tag{3.18} G(z)=(L?1)0z?pz?(v)dv=s(3.18)
    因此zzz必定滿足條件:
    z=G?1(s)=G?1[T(r)](3.19)z = G^{-1}(s) = G^{-1}[T(r)] \tag{3.19}z=G?1(s)=G?1[T(r)](3.19)

使用如下步驟可以得到一幅灰度級具有規定PDF的圖像:

  1. 由輸入圖像得到式(3.17)中使用的pr(r)p_{r}(r)pr?(r)
  2. 在式(3.18)中使用規定的PDF即pz(z)p_{z}(z)pz?(z)得到函數G(z)G(z)G(z)
  3. 計算反變換z=G?1(s)z=G^{-1}(s)z=G?1(s);輸出圖像中的像素值是sss。對于均衡化后的圖像中值為sss的每個像素執行逆映射z=G?1(s)z=G^{-1}(s)z=G?1(s),得到輸出圖像中的對應像素。使用這個變換處理完所有像素后,輸出圖像的PDF即pz(z)p_{z}(z)pz?(z)將等于規定的PDF。
  • 離散灰度
    sk=T(rk)=(L?1)∑j=0kpr(rj),k=0,1,2,…,L?1(3.20)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.20}sk?=T(rk?)=(L?1)j=0k?pr?(rj?),k=0,1,2,,L?1(3.20)
    G(zq)=(L?1)∑i=0qpz(zi),q=0,1,2,…,L?1(3.21)G(z_{q}) = (L -1) \sum_{i=0}^q p_{z}(z_{i}),\quad q = 0, 1, 2, \dots, L-1 \tag{3.21}G(zq?)=(L?1)i=0q?pz?(zi?),q=0,1,2,,L?1(3.21)
    G(zq)=sk(3.22)G(z_{q}) = s_{k} \tag{3.22}G(zq?)=sk?(3.22)
    zq=G?1(sk)(3.23)z_{q} = G^{-1}(s_{k}) \tag{3.23}zq?=G?1(sk?)(3.23)

離散直方圖規定化的過程

  1. 計算輸入圖像的直方圖pr(r)p_{r}(r)pr?(r),并在式(3.20)中用它將輸入圖像中的灰度映射到直方圖均衡化后的圖像中的灰度。將得到的值sks_{k}sk?四舍五入到整數區間[0,L?1][0, L-1][0,L?1]
  2. 用式(3.21)對q=0,1,2,…,L?1q = 0, 1, 2, \dots, L-1q=0,1,2,,L?1計算函數G(zq)G(z_{q})G(zq?)的所有值,其中pz(zi)p_{z}(z_{i})pz?(zi?)是規定直方圖的值。將GGG的值四舍五入到區間[0,L?1][0, L-1][0,L?1]內的整數。并存儲到一個查找表中。
  3. sk,k=0,1,2,…,L?1s_{k}, k=0, 1, 2, \dots, L-1sk?,k=0,1,2,,L?1的每個值,用步驟2中存儲的GGG值找到zqz_{q}zq?的對應值,使得G(zq)G(z_{q})G(zq?)最接近sks_{k}sk?。存儲從ssszzz的這些映射。當多個zqz_{q}zq?值給出相同的匹配(即映射不唯一)時,按照約定選擇最小的值。
  4. 使用步驟3中找到的映射,將每個均衡化后的像素sks_{k}sk?值映射到直方圖規定化圖像中值為zqz_{q}zq?的對應像素,并形成直方圖規定化后的圖像。
def my_histogram_matching(img_src, img_dst):"""historgram specification for two input imagesparam: input img_src: input image used for histogram specification , uint8[0, 255] grayscale imageparam: input img_dst: input image for histogram specification , uint8[0, 255] grayscale imagereturn: uint8[0, 255] grayscale image after histogram specification """bins = 256# img_src -> input, img_dst -> matchinghist_src, bins_src = my_hist(img_src, bins=256, normalized=True)hist_dst, bins_dst = my_hist(img_dst, bins=256, normalized=True)# [原灰度級,均衡化的值]list_src = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0) for i in bins_src:s = np.round(255 * hist_src[:i].sum()).astype(int)list_src[i][1] = s# [原灰度級,均衡化的值] list_dst = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0)for i in bins_dst:s = np.round(255 * hist_dst[:i].sum()).astype(int)list_dst[i][1] = s# 映射的關系列表初始化,以下映射關系算法list_dst_1 = list([x, y] for x in np.arange(bins) for y in np.arange(bins) if y == 0)for i in range(256):minv = 1temp_dst = list_dst[i][1]for j in range(256):temp_src = list_src[j][1]if abs(temp_dst - temp_src) < minv:minv = abs(temp_dst - temp_src)idx = int(j)# print(f'dst -> {temp_dst}, src -> {temp_src}, idx -> {idx}')list_dst_1[i][1] = idx#------------------------------Numpy-------------map_dict = np.array(list_dst_1)[:, 1]img_result = img_dst.copy()img_result = map_dict[img_result]
#------------------------------loop-----------------
#     height, width = img_dst.shape[:2]
#     img_result = np.zeros([height, width], np.uint8)
#     for h in range(height):
#         for w in range(width):
#             img_result[h, w] = list_dst_1[img_dst[h, w]][1]
#     img_result = np.clip(img_result, 0, 255).astype(np.uint8)return img_result
# Grayscale image histogram matching, different shape image works
img_1 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0307(a)(intensity_ramp).tif', 0)
img_2 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH03/Fig0316(4)(bottom_left).tif', 0)
hist_1, bins_1 = my_hist(img_1, bins=256, normalized=True)
hist_2, bins_2 = my_hist(img_2, bins=256, normalized=True)img_dst = my_histogram_matching(img_1, img_2,)
hist_dst, bins_dst = my_hist(img_dst, bins=256, normalized=True)plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(img_1, 'gray', vmin=0, vmax=255), plt.title('src')
plt.subplot(2, 3, 2), plt.imshow(img_2, 'gray', vmin=0, vmax=255), plt.title('dst')
plt.subplot(2, 3, 3), plt.imshow(img_dst, 'gray', vmin=0, vmax=255), plt.title('Result')
plt.subplot(2, 3, 4), plt.bar(bins_1, hist_1), plt.xlim([0, 255])
plt.subplot(2, 3, 5), plt.bar(bins_2, hist_2), plt.xlim([0, 255])
plt.subplot(2, 3, 6), plt.bar(bins_dst, hist_dst), plt.xlim([0, 255])
plt.tight_layout()
plt.show()

在這里插入圖片描述

# RGB 直方圖匹配 opencv讀入的是BGR圖像,[..., ::-1]可以把BGR轉為RGB的圖像
img_1 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0651(a)(flower_no_compression).tif',)[..., ::-1]
img_2 = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH06/Fig0638(a)(lenna_RGB).tif', )[..., ::-1]img_dst = np.zeros_like(img_2, dtype=np.uint8)for i in range(3):img_dst[..., i] = my_histogram_matching(img_1[..., i], img_2[..., i])plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(img_1, vmin=0, vmax=255), plt.title('src')
plt.subplot(2, 3, 2), plt.imshow(img_2, vmin=0, vmax=255), plt.title('dst')
plt.subplot(2, 3, 3), plt.imshow(img_dst, vmin=0, vmax=255), plt.title('Result')
plt.tight_layout()
plt.show()

在這里插入圖片描述

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

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

相關文章

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

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

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

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

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

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

表單元素選擇器

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

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

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

Retina時代的前端視覺優化

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

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

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

CodeForces369C On Changing Tree

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

ES6之const命令

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

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

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

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;那…

創建一個追蹤攝像機(2)

為了生成曲線&#xff0c;函數需要通過4個在沿著重量值在0和1之間的路徑上連貫的位置。由于重量在這些2個值之間增加&#xff0c;曲線返回在更遠的路徑上的坐標。 當所提供的重量值為0&#xff0c;曲線將返回正確的坐標在第二個輸入坐標。當所提供的重量值為1&#xff0c;曲線將…

Xcodebuild自動打包

#! /bin/bash #firtoken 29b441056e1e17c984cb32fadadsdddd shell_dirdirname $0 TARGET_NAME"SmartLock" DIR_PATH/Users/用戶名/Desktop/SmartLock SIGN"iPhone Distribution:******" PROFILE"66d127d6-7963-4c20-ac8b-47e4f0fe8742" TEMP_DIR…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波12 - 空間域濾波基礎 - 卷積運算(numpy 實現的三種卷積運算)

這篇文章比較長&#xff0c;請耐心看空間域濾波基礎線性濾波可分離濾波器核空間域濾波和頻率域濾波的一些重要比較如何構建空間濾波器第一種卷積方法&#xff08;公式法&#xff09;第二種卷積的方法&#xff08;可分離核&#xff09;第三種方法&#xff08;img2col)這是分離核…

hdu_1861_游船出租_201402282130

游船出租 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7238 Accepted Submission(s): 2411 Problem Description 現有公園游船租賃處請你編寫一個租船管理系統。當游客租船時&#xff0c;管理員輸入船號并按…

acer清理工具 clear下載_SolidWorks綠色版下載-SolidWorks完全清理工具v1.0免費版

SolidWorks完全清理工具(SWCleanUninstall)是一款綠色免費的SolidWorks完全卸載工具。很多SolidWorks安裝不成功都是因為之前安裝錯誤做成軟件殘留。這款工具可以完全清理很多SolidWorks留下的注冊表垃圾。軟件核心功能1、SWCleanUninstall可以直接刪除電腦上的SolidWorks軟件2…