opencv的直方圖

理解并運用 OpenCV 中的圖像直方圖 📊🖼?

圖像直方圖是計算機視覺和圖像處理中一種基本且強大的工具,它提供了圖像像素強度分布的圖形化表示。OpenCV 作為一個全面的計算機視覺庫,內置了計算和可視化直方圖的強大功能。本文將深入探討直方圖的概念、其在 OpenCV 中的實現以及一些常見的應用場景。


什么是圖像直方圖?🤔

圖像直方圖是一個統計圖表,顯示了圖像中每個強度級別(或顏色級別)的像素數量。對于灰度圖像,直方圖會顯示從 0(黑色)到 255(白色)每個灰度值出現的頻率。對于彩色圖像,可以為每個顏色通道(例如 BGR 或 HSV 的各個通道)分別計算直方圖,或者計算組合的顏色直方圖。

直方圖可以幫助我們理解:

  • 圖像的亮度與對比度:直方圖的分布可以揭示圖像是偏暗、偏亮,還是對比度良好。
  • 顏色分布:在彩色圖像中,可以了解哪些顏色占主導地位。
  • 閾值選擇:直方圖的波谷通常是選擇分割閾值的良好指示。
  • 圖像相似性:比較兩張圖像的直方圖可以作為衡量它們內容相似度的一種方法。

OpenCV 中的直方圖計算:cv::calcHist 🌟

OpenCV 中計算直方圖的核心函數是 cv::calcHist。它非常靈活,可以處理單通道或多通道圖像,并允許用戶指定各種參數。

函數原型 (C++)

void cv::calcHist(const cv::Mat* images,      // 輸入圖像數組 (通常只有一個圖像)int nimages,                // 輸入圖像的數量const int* channels,        // 需要計算直方圖的通道索引數組cv::InputArray mask,        // 可選的掩碼,如果提供,則只計算掩碼區域內的像素cv::OutputArray hist,       // 輸出的直方圖int dims,                   // 直方圖的維度 (通常為 1D, 2D, 或 3D)const int* histSize,        // 每個維度上直方圖 "bin" (條柱) 的數量數組const float** ranges,       // 每個維度上像素值的范圍數組bool uniform = true,        // 直方圖的 bin 是否具有統一的大小bool accumulate = false     // 如果為 true,則在多次調用中累積直方圖
);

參數詳解:

  • images: 指向輸入圖像的指針數組。即使只處理一張圖像,也需要將其地址放入一個數組中。
  • nimages: 輸入圖像的數量。通常為 1
  • channels: 一個整數數組,指定了要為哪些通道計算直方圖。例如,對于灰度圖,它是 {0};對于 BGR 彩色圖的 B 通道,也是 {0};如果想計算 B 和 G 通道的二維直方圖,則是 {0, 1}
  • mask: 一個可選的 cv::Mat 對象。如果非空,它必須是一個與輸入圖像大小相同的 8 位單通道圖像。只有掩碼中非零值的對應像素才會被包含在直方圖計算中。
  • hist: 輸出的直方圖,通常是一個 cv::Mat 對象(浮點型)。
  • dims: 直方圖的維度。對于單通道灰度圖或單個顏色通道,通常是 1
  • histSize: 一個整數數組,表示每個維度上 “bin” 的數量。例如,對于一個灰度圖,如果我們想將 0-255 的值分成 256 個 bin,那么 histSize 就是 {256}
  • ranges: 一個浮點型指針數組,定義了每個維度上像素值的范圍。例如,對于 8 位灰度圖,通常是 {{0.0f, 256.0f}} (注意上限是不包含的)。
  • uniform: 布爾值。如果為 true,則直方圖的 bin 具有統一的大小;否則,bin 的大小可以不均勻(通過 ranges 定義)。默認為 true
  • accumulate: 布爾值。如果為 true,則直方圖在多次調用 calcHist 時會累積結果到 hist 中,而不是重新開始計算。默認為 false

繪制直方圖 🎨

計算出直方圖后(它是一個數值數組或矩陣),我們通常需要將其可視化以便更好地理解。OpenCV 本身不直接提供復雜的繪圖工具,但我們可以很容易地創建一個表示直方圖的圖像。

基本步驟如下:

  1. 找到直方圖中的最大值,用于歸一化。
  2. 創建一個空白圖像作為畫布。
  3. 對于直方圖中的每個 bin,根據其值(可能經過歸一化)繪制一條線或一個矩形。

示例:繪制單通道直方圖 (C++)

#include <opencv2/opencv.hpp>
#include <iostream>// ... (加載圖像到 srcImage) ...cv::Mat grayImage;
if (srcImage.channels() == 3) {cv::cvtColor(srcImage, grayImage, cv::COLORBGR2GRAY);
} else {grayImage = srcImage;
}// 設置直方圖參數
int histSizeNum = 256; // bin 的數量
float range[] = {0, 256}; // 像素值范圍 (不包括上限)
const float* histRange[] = {range};
bool uniform = true;
bool accumulate = false;
cv::Mat hist;// 計算直方圖
cv::calcHist(&grayImage, 1, 0, cv::Mat(), hist, 1, &histSizeNum, histRange, uniform, accumulate);// 創建用于繪制直方圖的圖像
int hist_w = 512; // 直方圖圖像寬度
int hist_h = 400; // 直方圖圖像高度
int bin_w = cvRound((double)hist_w / histSizeNum); // 每個 bin 的寬度cv::Mat histImage(hist_h, hist_w, CV_8UC3, cv::Scalar(20, 20, 20)); // 深灰色背景// 歸一化直方圖到 [0, histImage.rows]
cv::normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());// 繪制直方圖
for (int i = 1; i < histSizeNum; i++) {cv::line(histImage,cv::Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),cv::Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))),cv::Scalar(200, 200, 200), // 淺灰色線條2, 8, 0);
}// 顯示原始圖像和直方圖
cv::imshow("Source Image", srcImage);
cv::imshow("Grayscale Image", grayImage);
cv::imshow("Histogram", histImage);
cv::waitKey(0);

直方圖的應用 🚀

1. 直方圖均衡化 (Histogram Equalization)

直方圖均衡化是一種通過重新分布圖像的像素強度來增強圖像對比度的方法。其目標是使直方圖盡可能平坦,從而擴展像素強度的動態范圍。OpenCV 提供了 cv::equalizeHist() 函數專門用于灰度圖像的直方圖均衡化。

對于彩色圖像,通常的做法是先將圖像轉換到像 HSV 或 YCrCb 這樣的顏色空間,然后對亮度通道(V 或 Y 通道)進行均衡化,最后再轉換回 BGR 空間。

2. 直方圖比較 (Histogram Comparison)

比較兩幅圖像的直方圖可以用來衡量它們的相似性。這在圖像檢索、對象識別等領域非常有用。OpenCV 的 cv::compareHist() 函數提供了多種比較方法,例如:

  • 相關性 (Correlation): cv::HISTCMP_CORREL
  • 卡方 (Chi-Square): cv::HISTCMP_CHISQR
  • 交叉點 (Intersection): cv::HISTCMP_INTERSECT
  • 巴氏距離 (Bhattacharyya distance): cv::HISTCMP_BHATTACHARYYA (或 cv::HISTCMP_HELLINGER,它與巴氏距離等價)

3. 直方圖反向投影 (Histogram Backprojection)

這是一種基于顏色的圖像分割技術。首先,計算你感興趣的目標對象的顏色直方圖(模型直方圖)。然后,在輸入圖像中,對于每個像素,查找其顏色在模型直方圖中的概率(或 bin 值)。這個概率圖就是反向投影。概率高的區域表明該區域的顏色與目標對象的顏色相似。OpenCV 提供了 cv::calcBackProject() 函數。


總結 ?

圖像直方圖不僅是分析圖像像素分布的簡單工具,更是許多高級圖像處理和計算機視覺技術的基礎。通過 OpenCV 的 cv::calcHist 函數,我們可以方便地計算直方圖,并結合其他函數如 cv::equalizeHistcv::compareHistcv::calcBackProject 來實現各種強大的功能,從圖像增強到對象檢測。掌握直方圖的原理和應用將極大地提升你在圖像處理項目中的能力。


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

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

相關文章

Linux 內核探秘:從零構建 GPIO 設備驅動程序實戰指南

在嵌入式系統開發領域&#xff0c;GPIO&#xff08;通用輸入 / 輸出&#xff09;作為硬件與軟件交互的橋梁&#xff0c;是實現設備控制與數據采集的基礎。編寫高效、穩定的 GPIO 設備驅動程序&#xff0c;對于發揮硬件性能至關重要。本文將深入剖析 Linux 內核中 GPIO 驅動開發…

嵌入式單片機中STM32F1演示寄存器控制方法

該文以STM32F103C8T6為示例,演示如何使用操作寄存器的方法點亮(關閉LED燈),并講解了如何調試,以及使用宏定義。 第一:操作寄存器點亮LED燈。 (1)首先我們的目的是操作板子上的LED2燈,對其實現點亮和關閉操作。打開STM32F103C8T6的原理圖,找到LED2的位置。 可以看到…

牛客網 NC16407 題解:托米航空公司的座位安排問題

牛客網 NC16407 題解&#xff1a;托米航空公司的座位安排問題 題目分析 解題思路 本題可以采用深度優先搜索(DFS)來解決&#xff1a; 從左上角開始&#xff0c;按行優先順序遍歷每個座位對于每個座位&#xff0c;有兩種選擇&#xff1a; 選擇該座位&#xff08;如果滿足條件…

智慧展館數字孿生平臺

2022年進博會上&#xff0c;國家會展中心憑借“數字孿生機器人調度平臺”驚艷全球&#xff0c;實現人機協同、虛實聯動的智慧運營&#xff1b;2023年天府農博園通過“BIMIoT”技術&#xff0c;貫穿展館全生命周期管理&#xff0c;成為農業會展的數字化標桿。這些案例背后&#…

胡說八道1---豆包問答總結

用戶提問 1 指令&#xff1a;25 - - [21/May/2025:01:35:45 0000] “POST /prod-api/system/base/getList HTTP/1.1” 405 559 “http://192.168.1.109:16380/login” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 …

C# AOP編程

AOP(面向切片編程的概念我這里就不介紹了&#xff0c;這里先介紹一下C#中的AOP編程框架。 1.AOP的分類 .net下支持AOP的框架很多&#xff0c;搜了一下有&#xff1a;PostSharp、AspectInjector、Fody 、Castle Windsor、Spring.NET、Ninject、Unity等&#xff0c;實現的方式主要…

linux編譯安裝srs

下載編譯運行 git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --h265on make需要安裝 yum install -y patch yum install -y unzip yum install -y tcl編譯完成后即可啟動SRS # 啟動 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/s…

EtherNet/IP機柜內解決方案在醫療控制中心智能化的應用潛能和方向分析

引言 在數智化轉型浪潮席卷各行各業的今天,醫療領域同樣面臨著提升運營效率、改善患者體驗和加強系統可靠性的多重挑戰。Rockwell Automation于2025年5月20日推出的EtherNet/IP機柜內解決方案,為醫療中心的自動化升級提供了一種創新路徑。本報告將深入分析這一解決方案的核心…

大模型下載到本地

一、huggingface 方式一 from huggingface_hub import snapshot_downloadlocal_dir "./origin" model_name "Qwen/Qwen2.5-1.5B"# snapshot_download(repo_idmodel_name, cache_dirlocal_dir) model_dir snapshot_download(model_name,cache_dirlocal…

【C++】vector容器實現

目錄 一、vector的成員變量 二、vector手動實現 &#xff08;1&#xff09;構造 &#xff08;2&#xff09;析構 &#xff08;3&#xff09;尾插 &#xff08;4&#xff09;擴容 &#xff08;5&#xff09;[ ]運算符重載 5.1 迭代器的實現&#xff1a; &#xff08;6&…

PostgreSQL日常維護

目錄 一、PostgreSQL 概述 二、基本使用 &#xff08;一&#xff09;登錄數據庫 &#xff08;二&#xff09;數據庫操作 1. 列出數據庫 2. 創建數據庫 3. 刪除數據庫 4. 切換數據庫 5. 查看數據庫大小 &#xff08;三&#xff09;數據表操作 1. 列出表 2. 創建表 …

廣東省省考備考(第十六天5.21)—言語:語句排序題(聽課后強化)

錯題 解析 對比選項&#xff0c;確定首句。①句介紹目前人類可以利用一些技術手段進入元宇宙&#xff0c;憑借網絡重新定義自己&#xff0c;體驗一種全新的生活&#xff0c;②句介紹對于多數人來說&#xff0c;首先要弄清楚什么是元宇宙&#xff0c;③句介紹元宇宙是指超越現實…

高并發架構設計之限流

一、引言 再強大的系統&#xff0c;也怕流量短事件內集中爆發&#xff0c;就像銀行怕擠兌一樣&#xff0c;所以&#xff0c;高并發另一個必不可少的模塊就是限流。限流是一種通過控制請求的速率或數量來保護系統免受過載的技術。流控的精髓是限制單位時間內的請求量&#xff0…

視頻監控聯網系統GB28181協議中設備控制流程詳解

文章目錄 9.3 設備控制9.3.1 基本要求9.3.2 命令流程9.3.2.1 無應答命令流程 9.3.3 協議接口9.3.3.1 請求命令9.3.3.2 應答命令 智聯視頻超融合平臺介紹 9.3 設備控制 9.3.1 基本要求 控制滿足以下基本要求&#xff1a; a) 源設備向目標設備發送控制命令&#xff0c;控制命令…

深入剖析原型模式:原理、實現與應用實踐

在軟件開發的世界里,設計模式如同建筑師手中的藍圖,為復雜系統的構建提供了行之有效的解決方案。其中,原型模式(Prototype Pattern)作為創建型設計模式的重要一員,以其獨特的對象創建方式,在提高代碼復用性、增強系統靈活性等方面發揮著關鍵作用。本文將深入剖析原型模式…

圖繪Linux:基礎指令脈絡閣

目錄 Linux命令行介紹 目錄操作 ls 目錄所含文件信息 ls 常用選項 pwd 在那個目錄下 cd 進入目錄 mkdir 創建目錄 文件操作 touch 創建普通文件 echo向文件寫入 cat 輸出文件內容 cp 拷貝文件/目錄 mv剪切重命名 rm 刪除文件/目錄 查找 * 匹配符 man 查找指令 …

數據分析 —— 數據預處理

一、什么是數據預處理 數據預處理&#xff08;Data Preprocessing&#xff09;是數據分析和機器學習中至關重要的步驟&#xff0c;旨在將原始數據轉換為更高質量、更適合分析或建模的形式。由于真實世界的數據通常存在不完整、不一致、噪聲或冗余等問題&#xff0c;預處理可以…

【Redis】哨兵(Sentinel)機制

文章目錄 1. Redis Sentinel的概念1.1 基本概念1.2 引出高可用 2. Redis Sentinel的部署&#xff08;基于docker&#xff09;2.1 部署2.2 驗證2.3 選舉流程 Redis 的主從復制模式下&#xff0c;?旦主節點由于故障不能提供服務&#xff0c;需要人工進行主從切換&#xff0c;同時…

初識Linux · 五種IO模型和非阻塞IO

目錄 前言&#xff1a; 五種IO模型 什么是IO IO模型 非阻塞IO 前言&#xff1a; 前文我們已經將網絡的基本原理介紹完了&#xff0c;都是通過圍繞TCP/IP四層協議&#xff0c;將應用層&#xff0c;傳輸層&#xff0c;網絡層&#xff0c;數據鏈路層全部介紹完畢&#xff0c…

Node.js 24發布:性能與安全雙提升

在科技的迅速發展中&#xff0c;Node.js作為一個備受青睞的開源跨平臺Java運行環境&#xff0c;近日迎來了其24.0版本的正式發布。此次更新不僅承諾提升性能和安全性&#xff0c;還為開發者提供了更為順暢的開發體驗&#xff0c;值得我們深入探討。 Node.js 24.0的最大亮點之一…