OpenCv高階(三)——圖像的直方圖、圖像直方圖的均衡化

目錄

一、直方圖

?1、計算并顯示直方圖

2、使用matplotlib方法繪制直方圖(不劃分小的子區間)

3、使用opencv的方法繪制直方圖?(劃分16個小的子亮度區間)

4、繪制彩色圖像的直方圖,將各個通道的直方圖值都畫出來

二、直方圖均衡化

(1)繪制原圖的直方圖

?(2)繪制經過直方圖均衡化后的圖片的直方圖

(3)自適應直方圖均衡化(局部直方圖處理)

三、直方圖均衡化的應用

1.?增強圖像對比度

2.?提升圖像視覺效果

3.?統一圖像灰度分布

4.?適用于低對比度圖像

總結


一、直方圖

直方圖:是圖像中像素強度分布的圖形表達方式,統計各個強度像素值的個數。

直方圖的作用:例如視頻中。通過標記幀和幀之間顯著的邊緣和顏色的統計變化,來檢測視頻中場景的變換。

灰度值在0 - 255范圍之間總共 256 個值,可以將我們的范圍劃分為子部分(稱為bins),例如我們可以將這些像素亮度值劃分為16個區間值,【0,15】、【16,31】,這兩個就是兩個亮度區間,它表示會統計亮度值在0到15的所有像素點的個數。

?1、計算并顯示直方圖

cv2.calcHist(images,channels,mask,histSize,ranges)? 計算圖像的直方圖,用于表示圖像中像素灰度級別的分布情況.
images: 原圖像圖像格式為 uint8 或 ?oat32。當傳入函數時應 用中括號 [] 括來例如[img]

channels: 表示傳入的圖像通道數。如果輸入圖像是灰度圖它的值就是 [0]。
????????? 如果是彩色圖像 的傳入的參數可以是 [0][1][2] 它們分別對應著 BGR。

mask: 掩模圖像。統計整幅圖像的直方圖就把它為None。但是如果你想統計圖像某一部分的直方圖,你就制作一個掩模圖像并使用它。

histSize:BINS的數目。也需用中括號括來?? (分成多少個區間)
? BINS :上面的直方圖顯示了每個像素值的像素數,即從0到255。即您需要256個值才能顯示上述直方圖。
????? 但是請考慮一下,如果您不需要單獨查找所有像素值的像素數,而是在像素值間隔內查找像素數,
??????例如,您需要找到介于 0 到 15 之間的像素數,然后是 16 到 31、32到47...、240 到 255。
????? 您只需要 16 個值來表示直方圖。
因此,只需將整個直方圖拆分為 16 個子部分,每個子部分的值就是其中所有像素計數的總和。
這每個子部分都稱為"BIN"。在第一種情況下,條柱數為256(每個像素一個),而在第二種情況下,它只有16。BINS 在 OpenCV 文檔中由術語histSize表示。

ranges: 像素值范圍常為 [0 256]

2、使用matplotlib方法繪制直方圖(不劃分小的子區間)

?這里使用了 numpy 的 ravel 函數,將多維數組拉成一維數組。

img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 轉成一維
a=img.ravel()# 使用 matplotlib 的 hist 函數繪制直方圖。
plt.hist(a,bins=256)
plt.show()# 參數解釋:
# - a:一維數組,即圖像的像素值組成的數組。
# - bins=256:指定直方圖的條數,即灰度級的數量。

效果:可以看出下面結果中有0~256的亮度值的統計情況?

?

3、使用opencv的方法繪制直方圖?(劃分16個小的子亮度區間)

#這里的calcHist參數在上面有介紹,這里是對img圖片做直方圖統計,采用灰度圖,即零通道,未設置掩膜,劃分為16個區間,亮度值統計[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值繪制曲線圖
plt.show()

效果,統計的值為每個亮度區間內屬于該亮度值的像素點個數

4、繪制彩色圖像的直方圖,將各個通道的直方圖值都畫出來

img=cv2.imread('zl.jpg')
color=('b','g','r')    #設置繪制的折線圖每條線的顏色
for i,col in enumerate(color):    #依次遍歷三個顏色通道histr=cv2.calcHist([img],[i],None,[256],[0,256])    #依次計算每個通道的直方圖值plt.plot(histr,color=col)    #繪制折線圖
plt.show()

效果:分別統計了不同顏色通道下的直方圖

二、直方圖均衡化

直方圖均衡化:直方圖均衡化是一種圖像增強技術,它可以通過增加圖像的對比度和亮度來改善圖像的質量。直方圖均衡化通過將圖像的像素值分布均勻化來實現這一目標。
在Python OpenCV中,可以使用cv2.equalizeHist()函數來實現直方圖均衡化。該函數將輸入圖像轉換為灰度圖像,并將其像素值分布均勻化,從而增強圖像的對比度和亮度。下面是將不均衡的直方圖均衡化之后的結果。

(1)繪制原圖的直方圖

woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()

?可以看出圖像的亮度值集中在50左右

?

?(2)繪制經過直方圖均衡化后的圖片的直方圖

phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()

與原圖對比,直方圖均衡化是對全局做均衡化,這使亮度值很大的像素點增多了,表現在圖像上就是圖像整體變亮。?

?

(3)自適應直方圖均衡化(局部直方圖處理)

普通直方圖均衡化(HE)通過全局灰度變換增強對比度,但對噪聲敏感且可能過度放大局部噪聲(如暗部噪聲)。自適應直方圖均衡化(AHE)?將圖像劃分為多個子塊(tiles),對每個子塊獨立進行直方圖均衡化,從而實現局部對比度增強,避免全局均衡化的缺陷。

改進版:限制對比度的自適應直方圖均衡化(CLAHE, Contrast-Limited AHE):在 AHE 基礎上,通過設定灰度值裁剪閾值(clip limit),防止子塊內噪聲或紋理被過度增強,是實際應用中更常用的方法。

主要優點

  • 局部對比度增強:針對不同區域的局部特征調整對比度,適合光照不均或局部細節豐富的圖像(如醫學影像、衛星圖像)。
  • 抑制噪聲放大:通過裁剪閾值(clip limit)限制子塊內直方圖的峰值,避免噪聲或紋理被過度增強。
  • 保留細節與自然感:相比全局均衡化,CLAHE 在增強局部細節的同時,減少過增強導致的偽影(如棋盤效應)。

函數:cv2.createCLAHE([, clipLimit[, tileGridSize]])?

參數說明:
clipLimit:設定子塊內直方圖均衡化時的灰度值裁剪閾值,單位為 “像素數 / 面積”(即每個灰度級允許的最大像素數密度)。可選項,默認值 8
titleGridSize:設定子塊的大小(行數 × 列數),單位為像素。可選項,默認值 (8,8)。
  • titleGridSize取值影響
    • 較小尺寸(如 4x4):局部細節增強更精細,但計算量增加,可能引入棋盤效應(需通過插值緩解)。
    • 較大尺寸(如 16x16):局部處理更粗糙,適合全局對比度增強需求,減少分塊邊界的影響。

創建一個自適應直方圖對像,并將上面的woman這張圖像傳入

clahe = cv2.createCLAHE(clipLimit=1, tileGridSize=(16,16))#通過類創建了一個局部均衡化對象
phone_clahe = clahe.apply(woman)
plt.hist(phone_clahe.ravel(), bins=256)#numpy中的ravel將數組多維度拉成一維數組
plt.show()

自適應直方圖均衡化則是劃分子塊均衡化會減少分塊邊界的影響。?

?使用hstack()函數水平堆疊上面的三張圖片用于對比,直方圖均衡化與自適應直方圖均衡化的區別

  • hstackhconcat):水平堆疊,沿列方向擴展。
  • vstackvconcat):垂直堆疊,沿行方向擴展(對應函數為?np.vstack?和?cv2.vconcat)。
res = np.hstack((woman,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize',res)
cv2.waitKey(0)

?從左到右依次是原圖、直方圖均衡化、自適應直方圖均衡化

三、直方圖均衡化的應用

1.?增強圖像對比度

  • 原理:將圖像中原本集中的灰度范圍 “拉伸” 到更寬的動態范圍,使圖像中不同灰度級的像素分布更均勻(直方圖趨于平坦)。
  • 效果:讓原本對比度低、細節模糊的圖像(如暗部過暗或亮部過亮)變得更清晰,暗部和亮部的細節更容易分辨。
  • 示例:在醫學影像(如 X 光片)中,均衡化可增強組織間的對比度,便于醫生觀察病灶。

2.?提升圖像視覺效果

  • 通過均衡化,圖像中原本難以區分的灰度區域(如相近的明暗過渡)會變得層次分明,整體視覺效果更自然。
  • 例如:修復老照片時,均衡化可改善因曝光不足或過度導致的細節丟失。

3.?統一圖像灰度分布

  • 將圖像的灰度直方圖調整為近似均勻分布,使像素灰度值覆蓋更廣泛的范圍。
  • 這為后續的圖像處理任務(如圖像分割、特征提取、模式識別等)提供更優質的輸入,提升算法效果。

4.?適用于低對比度圖像

  • 特別適合處理因光照不均、傳感器噪聲等導致對比度低下的圖像(如陰天拍攝的照片、衛星遙感圖像),通過均衡化恢復圖像細節。

總結

直方圖均衡化通過重新分配像素的灰度值,將圖像的動態范圍最大化利用,使圖像從 “對比度不足” 轉變為 “層次豐富”,是圖像處理中基礎且高效的增強手段。其本質是通過數學變換(累積分布函數,CDF)實現灰度的非線性映射,從而優化視覺效果和后續處理的可行性。

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

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

相關文章

Flutter 與原生通信

Flutter 與原生之間的通信主要基于通道機制,包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel:用于 Flutter 與原生之間的方法調用,實現雙向通信,適合一次性的方法調用并獲取返回值,如 Flut…

前端面試-Vue篇

核心概念 Vue 3的響應式原理與Vue 2有何本質區別?Vue中虛擬DOM的diff算法優化策略有哪些?Vue組件間通信方式有哪些?適用場景分別是什么?Vue的生命周期鉤子在Composition API中如何替代?Vue的模板編譯過程是怎樣的&…

光刻機研發與市場現狀分析報告

1. 引言 光刻機(Lithography Machine)是半導體制造的核心設備,其技術水平和市場供應能力直接影響全球芯片產業的發展。隨著人工智能(AI)、5G、高性能計算(HPC)和自動駕駛等技術的興起&#xff0…

Missashe考研日記-day21

Missashe考研日記-day21 1 專業課408 學習時間:4h學習內容: 今天先把昨天學的內容的課后習題做了,整整75道啊,然后學了OS第二章關于CPU調度部分的內容,這第二章太重要了,以至于每一小節的內容都比較多&am…

【玩轉全棧】—— Django+vue3+訊飛星火API 實現前端頁面實時AI答復

技術棧:vue3 element-plus axios pinia router Django5 websocket 訊飛星火API 本文將實現一個 AI 聊天對話功能,將前端用戶輸入問題以及之前對話發送給后端,通過 api 訪問大模型,返回前端實時對話數據。 調用 訊飛星火API…

廣東廣州一家IPO資產重組疑點重重,信息披露真實性存疑

作者:Eric 來源:IPO魔女 4月18日,廣州瑞立科密汽車電子股份有限公司(簡稱“瑞立科密”)將接受深交所主板IPO上會審核。公司保薦機構為中信證券,擬募集資金為15.2162億元。 瑞立科密過往資產重組疑點重重&a…

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本

銀河麒麟(Kylin) - V10 SP1桌面操作系統ARM64編譯QT-5.15.12版本 原因 測試Kylin-Desktop-V10-SP1-General-Release-2303-arm64系統下,編譯QT-5.15.12版本已做測試。 測試環境 測試板配置 型號:LM-D2000-NONE-1w-V01-pc_A2150 CPU:飛騰D20…

查看前端項目依賴樹型結構關系圖的詳細方法,涵蓋 命令行工具 和 可視化工

以下是查看前端項目依賴樹型結構關系圖的詳細方法&#xff0c;涵蓋 命令行工具 和 可視化工具&#xff1a; 一、命令行工具生成依賴樹 1. npm # 查看項目依賴樹&#xff08;文本形式&#xff09; npm ls# 查看指定包的依賴樹 npm ls <package-name># 生成JSON格式的依…

Ollama高并發測試

本文主要來測試一下ollama的高并發能力。 具體配置如下&#xff1a; 一、Ollama默認參數執行 我們打開4個窗口&#xff0c;然后分別讓DeepSeek “給我講一個笑話” &#xff0c;看下不同窗口的答題順序。 通過答題順序可以看到&#xff0c;在不進行參數設置時&#xff0c;模…

資源管理與HPA:讓Kubernetes應用自動伸縮

引言&#xff1a;從“手動擋”到“自動駕駛” 想象我們駕駛一輛汽車&#xff0c;手動調節油門和換擋不僅費力&#xff0c;還難以應對突發狀況。我們的應用服務也一樣&#xff0c;在面對突然的流量增長&#xff0c;內存使用暴漲該如何應對。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安裝指南

在開發和生產環境中&#xff0c;MongoDB 是一種非常流行的 NoSQL 數據庫&#xff0c;以其靈活性和高性能而受到開發者的青睞。對于 Windows 用戶來說&#xff0c;MongoDB 提供了多種安裝方式&#xff0c;其中 ZIP 版本因其靈活性和輕量級的特點&#xff0c;成為很多開發者的首選…

【Linux網絡與網絡編程】11.數據鏈路層mac幀協議ARP協議

前面在介紹網絡層時我們提出來過一個問題&#xff1a;主機是怎么把數據交給路由器的&#xff1f;那里我們說這是由數據鏈路層來做的。 網絡上的報文在物理結構上是以mac幀的形式流動的&#xff0c;但在邏輯上是以IP流動的&#xff0c;IP的流動是需要mac幀支持的。 數據鏈路層解…

多模態思維鏈AI醫療編程:從計算可持續性到開放域推理的系統性解決方案

多模態思維鏈AI醫療編程:從計算可持續性到開放域推理的系統性解決方案 醫療AI領域的多模態思維鏈技術正在重塑臨床決策支持、醫學影像分析和醫療流程優化的范式。本指南從計算可持續性、錯誤傳播控制、倫理安全防護和通用性擴展四大維度,系統解析醫療大模型落地落地的關鍵要…

代理模式深度解析

目錄 一 靜態代理 1.1 優點 1.2 缺點 1.3 適用場景 二 JDK動態代理 1 JDK動態代理的工作原理 1.1 創建代理類 1.2 加載代理類 1.3 實現方法調用 2. Proxy.newProxyInstance() 的核心工作流程 方法簽名 工作步驟 3. 代理類的生成與加載 3.1 代理類生成的關鍵方法 …

Spring Cache與Redis集成原理

一、核心架構圖解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

編程技能:調試02,設置斷點與刪除斷點

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;調試01&#xff0c;調試介紹 回到目錄 下…

flink寫doris時的優化

1.概念 doris并不擅長高頻、小量數據的導入&#xff1b; 因為doris每一次數據導入都會在be節點上生成數據文件&#xff1b;如果高頻導入小量數據&#xff0c;就會在存儲層產生大量的小文件&#xff08;必然會影響到后續的查詢效率&#xff0c;也會對系統產生更多的compaction…

ElementNotInteractableException原因及解決辦法

在自動化測試中,ElementNotInteractableException是一個常見的異常,它通常發生在嘗試與網頁上的某個元素進行交互(例如點擊、輸入等操作)時,但由于該元素當前不可交互。這可能由多種原因引起,以下是一些常見的原因及其解決方法: 元素未完全加載 如果嘗試與頁面上的元素交…

如何從 GitHub 鏡像倉庫到極狐GitLab?

最近 GitHub 封禁中國用戶的事情鬧得沸沸揚揚,雖然官方發布的報道說中國用戶被限制登錄是因為配置錯誤導致,已經撤回了更新,中國用戶已經可以正常使用。但是這就像橫在國內開發者和企業頭上的“達摩克利斯之劍”。為了避免 GitHub 不可用而帶來的影響,國內開發者和企業可以…

服務器安裝nacos

1.下載依賴 docker pull nacos/nacos-server:v2.4.3安裝 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服務的文件夾 docker cp nacos-server:/home/nacos/data /home/admin1/…