OpenCV 高階實戰:圖像直方圖與掩碼圖像深度解析

目錄

一、圖像直方圖:讀懂圖像的 “像素分布報告”

1. 什么是圖像直方圖?

2. 圖像直方圖的核心作用

(1)分析亮度分布

(2)判斷對比度高低

(3)輔助圖像增強與閾值分割

(4)檢測色彩偏移

3、舉例

4. OpenCV 直方圖計算:cv2.calcHist()?詳解

(1)函數語法與參數解析

(2)實戰案例:計算灰度圖與彩色圖直方圖

(3)運行結果分析

二、掩碼圖像(Mask):精準定位感興趣區域

1. 什么是掩碼圖像?

2. 掩碼的核心應用場景

3. OpenCV 掩碼操作:cv2.bitwise_and()?詳解

(1)函數語法

(2)實戰案例:用掩碼提取局部區域并計算直方圖

3)運行結果分析


在計算機視覺領域,圖像直方圖掩碼圖像是兩種基礎且核心的技術。直方圖是分析圖像像素分布的 “數據眼鏡”,掩碼則是精準定位感興趣區域的 “手術刀”。本文將從概念原理出發,結合 OpenCV 實戰代碼,詳細講解圖像直方圖的計算與應用、掩碼圖像的制作與使用,以及直方圖均衡化(含自適應均衡化)的實現,幫助大家掌握這兩項 OpenCV 高階技能。

一、圖像直方圖:讀懂圖像的 “像素分布報告”

1. 什么是圖像直方圖?

圖像直方圖是描述圖像像素值分布的統計圖形,它將圖像的像素值(通常 0-255)作為橫軸,像素值出現的頻次(或概率)作為縱軸,用柱狀圖或折線圖展示。

  • 對灰度圖:直方圖反映不同灰度級(0-255)的像素數量;
  • 對彩色圖:可分別展示藍(B)、綠(G)、紅(R)三通道的像素分布。

簡單來說,直方圖就像圖像的 “體檢報告”,通過它能快速判斷圖像的亮度、對比度等關鍵信息。

2. 圖像直方圖的核心作用

(1)分析亮度分布
  • 若直方圖峰值集中在左側(低像素值):圖像整體偏暗;
  • 若峰值集中在右側(高像素值):圖像整體偏亮;
  • 若峰值分布均勻:圖像亮度適中。
(2)判斷對比度高低
  • 直方圖寬度寬(像素值跨度大,從 0 到 255 覆蓋完整):對比度高,細節清晰;
  • 直方圖寬度窄(像素值集中在某一區間):對比度低,圖像灰蒙蒙。
(3)輔助圖像增強與閾值分割
  • 直方圖均衡化:通過重新分布像素值,擴大對比度;
  • 閾值分割:利用直方圖的 “雙峰谷底” 確定分割閾值,分離前景與背景(如分割文字與背景)。
(4)檢測色彩偏移

對彩色圖三通道直方圖對比,若某一通道(如紅色)峰值偏移明顯,說明圖像存在色彩偏色。

3、舉例

灰度值在0 - 255范圍之間總共 256 個值,可以將我們的范圍劃分為子部分(稱為bins),例

4. OpenCV 直方圖計算:cv2.calcHist()?詳解

(1)函數語法與參數解析
cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)

(2)實戰案例:計算灰度圖與彩色圖直方圖
import cv2
import matplotlib.pyplot as plt
import numpy as np# 1. 讀取灰度圖并計算直方圖
# 讀取灰度圖像(以手機圖像為例)
gray_img = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)
if gray_img is None:print("圖像讀取失敗,請檢查文件路徑!")exit()# 方法1:用matplotlib直接繪制(需將圖像展平為一維數組)
plt.figure(figsize=(12, 5))
plt.subplot(1, 3, 1)
plt.hist(gray_img.ravel(), bins=256, color='gray')  # ravel()將二維圖像轉為一維
plt.title("灰度圖直方圖(matplotlib)")
plt.xlabel("像素值(0-255)")
plt.ylabel("像素數量")# 方法2:用OpenCV的cv2.calcHist()計算(bins=16,分組更粗)
hist_cv2 = cv2.calcHist([gray_img], [0], None, [16], [0, 256])
plt.subplot(1, 3, 2)
plt.plot(hist_cv2, color='black', marker='o')  # 折線圖展示
plt.title("灰度圖直方圖(cv2.calcHist,bins=16)")
plt.xlabel("分組索引(0-15)")
plt.ylabel("像素數量")# 2. 讀取彩色圖并計算三通道直方圖
color_img = cv2.imread("phone.png")  # OpenCV默認BGR格式
color = ('b', 'g', 'r')  # 對應B/G/R通道plt.subplot(1, 3, 3)
for i, col in enumerate(color):# 分別計算B、G、R通道的直方圖hist_channel = cv2.calcHist([color_img], [i], None, [256], [0, 256])plt.plot(hist_channel, color=col, label=f"{col.upper()}通道")plt.title("彩色圖三通道直方圖")
plt.xlabel("像素值(0-255)")
plt.ylabel("像素數量")
plt.legend()
plt.tight_layout()
plt.show()# 展示原始圖像
cv2.imshow("灰度圖", gray_img)
cv2.imshow("彩色圖(BGR)", color_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3)運行結果分析
  • 灰度圖直方圖:可直觀看到圖像像素集中在哪個區間(如集中在 100-200,說明圖像偏亮);
  • 彩色圖三通道:若 B 通道峰值高于 G/R,說明圖像偏藍;反之則偏紅或偏綠;
  • bins=16?時,直方圖更簡潔,適合快速觀察整體分布趨勢。

二、掩碼圖像(Mask):精準定位感興趣區域

1. 什么是掩碼圖像?

掩碼圖像是與原圖像尺寸完全相同的二進制圖像,像素值僅為?0?或?255(無符號 8 位整數,np.uint8):

  • 像素值為?0屏蔽區域(后續操作不處理該區域);
  • 像素值為?255保留區域(后續操作僅作用于該區域)。

形象地說,掩碼就像 “照片遮罩”,只讓感興趣的區域 “透出來” 參與處理。

2. 掩碼的核心應用場景

  • 計算局部區域的直方圖(如僅分析人臉區域的亮度);
  • 圖像修復(如僅修復口罩遮擋的面部區域);
  • 目標分割(如僅提取圖像中的文字區域);
  • 圖像融合(如將 logo 貼到指定區域)。

3. OpenCV 掩碼操作:cv2.bitwise_and()?詳解

掩碼通常與按位與運算結合使用,原理是:原圖像像素 & 掩碼像素,只有當掩碼像素為 255(二進制 11111111)時,原像素值才保留;若掩碼為 0(二進制 00000000),結果為 0(黑色)。

(1)函數語法
cv2.bitwise_and(src1, src2, dst=None, mask=None)

(2)實戰案例:用掩碼提取局部區域并計算直方圖
import cv2
import numpy as np
import matplotlib.pyplot as plt# 1. 讀取灰度圖像
gray_img = cv2.imread("phone.png", cv2.IMREAD_GRAYSCALE)
cv2.imshow("原始灰度圖", gray_img)
cv2.waitKey(0)# 2. 創建掩碼圖像(步驟:全0矩陣 → 局部設為255)
# 2.1 生成與原圖像尺寸相同的全0矩陣(純黑圖像)
mask = np.zeros(gray_img.shape[:2], dtype=np.uint8)  # shape[:2]取高和寬
# 2.2 定義感興趣區域(ROI):[y1:y2, x1:x2](注意:OpenCV中坐標是(y, x))
# 此處以“手機屏幕區域”為例,需根據實際圖像調整坐標
mask[50:350, 100:470] = 255  # 該區域設為255(白色)# 展示掩碼圖像
cv2.imshow("掩碼圖像(白色為保留區域)", mask)
cv2.waitKey(0)# 3. 應用掩碼:提取感興趣區域
masked_img = cv2.bitwise_and(gray_img, gray_img, mask=mask)
cv2.imshow("掩碼提取后的圖像", masked_img)
cv2.waitKey(0)# 4. 對比:全圖直方圖 vs 掩碼區域直方圖
plt.figure(figsize=(10, 4))# 全圖直方圖
plt.subplot(1, 2, 1)
hist_full = cv2.calcHist([gray_img], [0], None, [256], [0, 256])
plt.plot(hist_full, color='black')
plt.title("全圖直方圖")
plt.xlabel("像素值")
plt.ylabel("數量")# 掩碼區域直方圖
plt.subplot(1, 2, 2)
hist_masked = cv2.calcHist([gray_img], [0], mask, [256], [0, 256])
plt.plot(hist_masked, color='red')
plt.title("掩碼區域(手機屏幕)直方圖")
plt.xlabel("像素值")
plt.ylabel("數量")plt.tight_layout()
plt.show()cv2.destroyAllWindows()

運行結果如下:

3)運行結果分析
  • 掩碼圖像:黑色區域為屏蔽區,白色矩形為保留的 “手機屏幕區域”;
  • 掩碼提取后的圖像:僅屏幕區域保留原像素,其他區域為黑色;
  • 直方圖對比:若屏幕區域偏亮,掩碼直方圖峰值會比全圖直方圖更靠右,精準反映局部亮度分布。

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

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

相關文章

基于stm32的家庭安全監測系統設計

若該文為原創文章,轉載請注明原文出處。一、引言(一)研究背景及意義背景:隨著智能家居概念的普及,人們對家庭安全、舒適度和節能提出了更高要求。傳統安防系統功能單一、各系統獨立,缺乏聯動和遠程管理能力…

Oracle體系結構-控制文件(Control Files)

一、 原理 (Principle) 核心定位: 控制文件是一個小型的二進制文件,由 Oracle 實例在啟動和操作過程中持續讀寫。它是數據庫物理結構的權威記錄。數據庫無法啟動或正常操作時,如果無法訪問控制文件,實例將無法識別數據文件和重做日…

路由 下一跳 網關 兩個不同網段的ip如何通過路由器互通

路由 (Routing)核心思想:路徑選擇是什么? 路由是指數據包從源主機傳輸到目標主機的整個過程。這個過程就像寄快遞:你需要決定包裹經過哪些中轉站才能最終到達收件人手里。做什么? 網絡中的設備(主要是路由器&#xff0…

HiDDeN論文解讀與代碼實現

論文:HiDDeN: Hiding Data With Deep Networks 作者:Jiren Zhu, Russell Kaplan, Justin Johnson, Li Fei-Fei一、研究背景 在圖像信息隱藏領域,通常有兩類典型的應用場景:隱寫 (Steganography) 目標:實現秘密通信。要…

實驗室服務器配置|實驗室多人共享GPU|通過Docker實現Linux系統多用戶隔離與安全防控

利用實驗室服務器跑實驗的時候,通常就是兩種方案,一個是向日葵遠程桌面進行操作,一個是通過ssh進行連接,用ssh的話,一般服務器都在內網(例如校園網),是無法在公網(不在校…

2019考研數學(二)真題

一、選擇題 (1) (2) (3) (4) 遺漏點:由通解知特解,特解代入微分方程 (5) ★記住這個題,用的泰勒展開(6) (7) 遺忘點: ★伴隨矩陣的秩與原矩陣秩的關系: (8) 錯誤點:粗心 二、填空題 (9) 易混淆點&#xff…

10 分鐘上手 ECharts:從“能跑”到“生產級”的完整踩坑之旅

10 分鐘上手 ECharts:從“能跑”到“生產級”的完整踩坑筆記 如果你也曾 復制了官方 Demo 卻不知道怎么拆、窗口一拉伸圖表就變形、切換標簽頁后內存暴漲——這篇博客就是為你寫的。 我會用 6 個遞進版本 的源碼,帶你把一張 最簡柱狀圖 逐步進化成 可銷毀…

二級緩存在實際項目中的應用

二級緩存在項目中的應用 目錄 1. 二級緩存簡介2. 應用場景3. 重難點分析4. 結合SpringBoot使用5. 最佳實踐與案例6. 總結 1. 二級緩存簡介 1.1 什么是二級緩存 二級緩存(Second-Level Cache) 是Hibernate框架中的一個重要特性,它提供了應…

深入淺出CRC校驗:從數學原理到單周期硬件實現 (2)CRC數學多項式基礎

數學的優雅:剖開CRC的多項式除法核心看似復雜的CRC校驗,其核心建立在優雅的數學基礎之上。本文將為您揭開CRC算法的數學面紗,讓您真正理解多項式除法的精妙之處。模2運算:CRC世界的特殊算術 CRC計算建立在一種特殊的代數系統上——…

軟考初級有沒有必要考?

對正在學習相關專業的學生或者是行業新人,這篇文章從軟考初級的含義、適合哪些人考、考試難度等方面解答,幫助你判斷要不要報考。一、軟考初級是什么? 軟考初級是軟考體系里面的基礎級別,主要面向在校大學生或是IT行業新人&#x…

11 Prompt 工程進階:Few-shot 與 Chain-of-Thought

11 Prompt 工程進階:Few-shot 與 Chain-of-Thought 前10節總結 & 后10節展望 在前 10 節,我們已經完成了 AI 產品經理的入門階段: 1–3:理解了大模型的基本概念、Token、Prompt 基礎;4–5:體驗了本地部…

ARM1.(ARM體系結構)

1.基本概念嵌入式:以應用為心,以計算機技術為礎,軟便件可被的專用計算機系統。計算機系統的軟件基本組成: 系統軟件、應用軟件。計算機系統的硬件基本組成:運算器、控制器、存諸器、輸入設備、輸出設備日常生活中遇到的專業術語&#xff1a…

Django全棧班v1.01 Python簡介與特點 20250910

從零開始的Python編程之旅 “人生苦短,我用Python。”這不僅僅是Python程序員的口頭禪,更是對Python強大能力的最好詮釋!!! 為什么全世界有超過1500萬開發者選擇Python? 為什么Python連續多年蟬聯最受歡…

【WebApi】什么情況開啟如何開啟緩存

在 ASP.NET Core WebAPI 中開啟緩存是優化性能、減少服務器負載和提升用戶體驗的非常重要的手段。但并非所有情況都適合開啟緩存。 下面我將從 “什么情況下開啟” 和 “如何開啟” 兩個方面為你詳細解釋。 一、什么情況下應該開啟緩存? 總的來說,緩存適用于 “變化不頻繁但…

Go語言類型斷言全解析

類型斷言的基本概念類型斷言(Type Assertion)是Go語言中用于檢查接口值底層具體類型的機制。它本質上是一種運行時類型檢查的操作,允許程序在運行時判斷接口變量是否持有特定的類型值,并提取該類型的值。這是Go語言類型系統中的一個重要特性,…

大模型在題目生成中的安全研究:攻擊方法與防御機制

大模型在題目生成中的安全研究:攻擊方法與防御機制 文章目錄大模型在題目生成中的安全研究:攻擊方法與防御機制一、引言二、大模型在題目生成中的安全漏洞與攻擊方法2.1 大模型在題目生成中的安全漏洞分析2.1.1 訓練數據相關漏洞2.1.2 模型架構與特性相關…

跟做springboot尚品甄選項目(二)

登錄功能的書寫 后端接口的書寫 (1)創建配置文件 粘貼這兩個文件(E:\project\AllProJect\Shangpin Selection\項目材料素材\資料\資料\03-配置文件) 在spzx-manager服務的src/resources目錄下創建application.yml、application-…

前后端接口調試提效:Postman + Mock Server 的工作流

前后端接口調試提效:Postman Mock Server 的工作流 🌟 Hello,我是摘星! 🌈 在彩虹般絢爛的技術棧中,我是那個永不停歇的色彩收集者。 🦋 每一個優化都是我培育的花朵,每一個特性都是…

大帶寬香港云服務器在數據傳輸速度上有何優勢?

為方便站長快速部署網站、優化用戶訪問體驗,當下眾多實力強勁的香港數據中心,均推出了大帶寬云服務器產品。不過,市面上不少數據中心雖宣稱提供 “專屬大帶寬”,但其線路配置中,國際線路占比高、繞行鏈路多&#xff0c…

HT862 智能音頻功率放大器:為便攜音頻設備打造高效穩定的音質解決方案

在藍牙音箱、智能手機、便攜式游戲機等設備的設計中,音頻功率放大器是決定音質表現、續航能力與使用穩定性的關鍵部件。一款優質的音頻功放,不僅需要輸出足夠的功率以滿足清晰響亮的聽覺需求,還需在能效、溫控、適配性上達到平衡,…