opencv對直方圖的計算和繪制

【歡迎關注編碼小哥,學習更多實用的編程方法和技巧】

1、直方圖的計算

cv::calcHist?是 OpenCV 中用于計算圖像直方圖的函數。它可以處理多通道圖像,并通過指定圖像、通道、掩膜、直方圖大小和范圍等參數來生成直方圖。

函數原型

void cv::calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform = true, bool accumulate = false)

參數

  • images: 要計算的原圖,類型為?const Mat*,表示一個圖像數組。
  • nimages: 圖像數組的大小,類型為?int
  • channels: 指定計算的通道,類型為?const int*,表示一個通道數組。每個通道對應一個圖像。
  • mask: 用于計算特定區域的掩膜,類型為?InputArray,表示一個圖像或矩形區域。
  • hist: 輸出的直方圖,類型為?OutputArray,表示一個多維數組。
  • dims: 直方圖的維度,類型為?int,表示直方圖的維度。
  • histSize: 直方圖的大小,類型為?const int*,表示一個大小數組,每個大小對應一個維度。
  • ranges: 像素值范圍,類型為?const float**,表示一個范圍數組,每個范圍對應一個維度。
  • uniform: 是否使用均勻的直方圖,類型為?bool,默認為?true
  • accumulate: 是否累積計算結果,類型為?bool,默認為?false

返回值

  • 無返回值,該函數直接修改輸出直方圖。
  • #include <opencv2/opencv.hpp>int main() {// 讀取圖像cv::Mat img = cv::imread("image.jpg");// 計算灰度圖直方圖cv::Mat gray;cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);int histSize = 256;float range[] = {0, 256};cv::Mat hist;cv::calcHist(&gray, 1, &0, cv::Mat(), hist, 1, &histSize, &range);// 計算彩色圖直方圖int channels[] = {0, 1, 2};cv::Mat hist_b, hist_g, hist_r;cv::calcHist(&img, 1, channels, cv::Mat(), hist_b, 1, &histSize, &range);cv::calcHist(&img, 1, channels + 1, cv::Mat(), hist_g, 1, &histSize, &range);cv::calcHist(&img, 1, channels + 2, cv::Mat(), hist_r, 1, &histSize, &range);// 繪制直方圖cv::Mat hist_img(256, 256, CV_8UC3);cv::normalize(hist, hist, 0, hist_img.rows, cv::NORM_MINMAX);for (int i = 0; i < histSize; i++) {cv::line(hist_img, cv::Point(i, hist_img.rows), cv::Point(i, hist_img.rows - cvRound(hist.at<float>(i))), cv::Scalar(255, 0, 0));}cv::imshow("Histogram", hist_img);cv::waitKey(0);cv::destroyAllWindows();return 0;
    }

  • cv::calcHist?函數可以處理多通道圖像,但必須指定計算的通道。
  • cv::calcHist?函數可以計算多個直方圖,但必須具有相同的尺寸和類型。
  • cv::calcHist?函數可以累積計算結果,但必須指定輸出直方圖。

2、一維直方圖的繪制

一維直方圖是一種常見的數據可視化方法,用于顯示數據的分布情況。在 OpenCV 中,可以使用以下步驟繪制一維直方圖:

  1. 計算直方圖:使用?cv::calcHist?函數計算圖像的直方圖。
  2. 歸一化直方圖:使用?cv::normalize?函數將直方圖歸一化到指定的范圍。
  3. 繪制直方圖:使用?cv::line?函數繪制直方圖。
#include <opencv2/opencv.hpp>int main() {// 讀取圖像cv::Mat img = cv::imread("image.jpg");// 計算灰度圖直方圖cv::Mat gray;cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);int histSize = 256;float range[] = {0, 256};cv::Mat hist;cv::calcHist(&gray, 1, &0, cv::Mat(), hist, 1, &histSize, &range);// 歸一化直方圖cv::Mat hist_norm;cv::normalize(hist, hist_norm, 0, 256, cv::NORM_MINMAX);// 繪制直方圖cv::Mat hist_img(256, 256, CV_8UC3);for (int i = 0; i < histSize; i++) {cv::line(hist_img, cv::Point(i, hist_img.rows), cv::Point(i, hist_img.rows - cvRound(hist_norm.at<float>(i))), cv::Scalar(255, 0, 0));}// 顯示直方圖cv::imshow("Histogram", hist_img);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

?在這個示例中,我們首先讀取一張圖像,然后計算其灰度圖直方圖。接著,我們將直方圖歸一化到 0-256 的范圍,然后繪制直方圖。最后,我們顯示直方圖。

注意:在繪制直方圖時,我們使用?cv::line?函數繪制每個直方圖條。我們將直方圖條的高度設置為?hist_img.rows - cvRound(hist_norm.at<float>(i)),以便直方圖條的高度與直方圖值成比例。

如果想繪制彩色圖直方圖,可以使用以下代碼:

// 計算彩色圖直方圖
int channels[] = {0, 1, 2};
cv::Mat hist_b, hist_g, hist_r;
cv::calcHist(&img, 1, channels, cv::Mat(), hist_b, 1, &histSize, &range);
cv::calcHist(&img, 1, channels + 1, cv::Mat(), hist_g, 1, &histSize, &range);
cv::calcHist(&img, 1, channels + 2, cv::Mat(), hist_r, 1, &histSize, &range);// 歸一化直方圖
cv::Mat hist_b_norm, hist_g_norm, hist_r_norm;
cv::normalize(hist_b, hist_b_norm, 0, 256, cv::NORM_MINMAX);
cv::normalize(hist_g, hist_g_norm, 0, 256, cv::NORM_MINMAX);
cv::normalize(hist_r, hist_r_norm, 0, 256, cv::NORM_MINMAX);// 繪制直方圖
cv::Mat hist_img(256, 256, CV_8UC3);
for (int i = 0; i < histSize; i++) {cv::line(hist_img, cv::Point(i, hist_img.rows), cv::Point(i, hist_img.rows - cvRound(hist_b_norm.at<float>(i))), cv::Scalar(255, 0, 0));cv::line(hist_img, cv::Point(i, hist_img.rows), cv::Point(i, hist_img.rows - cvRound(hist_g_norm.at<float>(i))), cv::Scalar(0, 255, 0));cv::line(hist_img, cv::Point(i, hist_img.rows), cv::Point(i, hist_img.rows - cvRound(hist_r_norm.at<float>(i))), cv::Scalar(0, 0, 255));
}

在這個示例中,我們計算彩色圖的直方圖,然后歸一化直方圖。接著,我們繪制直方圖,每個通道使用不同的顏色。

3、多維直方圖的繪制?

2D直方圖是一種用于表示兩個變量之間關系的數據可視化方法。在 OpenCV 中,可以使用以下步驟繪制 2D 直方圖:

  1. 計算直方圖:使用?cv::calcHist?函數計算圖像的直方圖。
  2. 歸一化直方圖:使用?cv::normalize?函數將直方圖歸一化到指定的范圍。
  3. 繪制直方圖:使用?cv::imshow?函數顯示直方圖。

以下是示例代碼:

#include <opencv2/opencv.hpp>int main() {// 讀取圖像cv::Mat img = cv::imread("image.jpg");// 計算 2D 直方圖int channels[] = {0, 1};int histSize[] = {256, 256};float range[] = {0, 256, 0, 256};cv::Mat hist;cv::calcHist(&img, 1, channels, cv::Mat(), hist, 2, histSize, range);// 歸一化 2D 直方圖cv::Mat hist_norm;cv::normalize(hist, hist_norm, 0, 256, cv::NORM_MINMAX);// 繪制 2D 直方圖cv::Mat hist_img(256, 256, CV_8UC3);for (int i = 0; i < 256; i++) {for (int j = 0; j < 256; j++) {int index = i * 256 + j;cv::Vec3b color = cv::Vec3b(i, j, 0);hist_img.at<cv::Vec3b>(i, j) = color * (hist_norm.at<float>(index) / 256.0f);}}// 顯示 2D 直方圖cv::imshow("2D Histogram", hist_img);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

?在這個示例中,我們計算 2D 直方圖,然后歸一化 2D 直方圖。接著,我們繪制 2D 直方圖,每個像素的顏色根據 2D 直方圖值計算。

注意:在繪制 2D 直方圖時,我們使用?cv::Vec3b?類型表示顏色,每個顏色通道的值根據 2D 直方圖值計算。

如果想繪制 3D 直方圖,可以使用以下代碼:

// 計算 3D 直方圖
int channels[] = {0, 1, 2};
int histSize[] = {256, 256, 256};
float range[] = {0, 256, 0, 256, 0, 256};
cv::Mat hist;
cv::calcHist(&img, 1, channels, cv::Mat(), hist, 3, histSize, range);// 歸一化 3D 直方圖
cv::Mat hist_norm;
cv::normalize(hist, hist_norm, 0, 256, cv::NORM_MINMAX);// 繪制 3D 直方圖
cv::Mat hist_img(256, 256, CV_8UC3);
for (int i = 0; i < 256; i++) {for (int j = 0; j < 256; j++) {for (int k = 0; k < 256; k++) {int index = i * 256 * 256 + j * 256 + k;cv::Vec3b color = cv::Vec3b(i, j, k);hist_img.at<cv::Vec3b>(i, j) = color * (hist_norm.at<float>(index) / 256.0f);}}
}// 顯示 3D 直方圖
cv::imshow("3D Histogram", hist_img);
cv::waitKey(0);
cv::destroyAllWindows();

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

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

相關文章

C++的auto_ptr智能指針:從誕生到被棄用的歷程

C作為一種功能強大的編程語言&#xff0c;為開發者提供了眾多便捷的特性和工具&#xff0c;其中智能指針是其重要特性之一。智能指針能夠自動管理內存&#xff0c;有效避免內存泄漏等常見問題。然而&#xff0c;并非所有智能指針都盡善盡美&#xff0c;auto_ptr便是其中的一個例…

游戲開發中常用的設計模式

目錄 前言一、工廠模式二、單例模式三、觀察者模式觀察者模式的優勢 四、狀態模式狀態模式的優勢 五、策略模式策略模式的優勢策略模式與狀態模式有什么區別呢? 六、組合模式七、命令模式八、裝飾器模式 前言 本文介紹了游戲開發中常用的設計模式&#xff0c;如工廠模式用于創…

C++并發編程之異常安全性增強

在并發編程中&#xff0c;異常安全是一個非常重要的方面&#xff0c;因為并發環境下的錯誤處理比單線程環境更加復雜。當多個線程同時執行時&#xff0c;異常不僅可能影響當前線程&#xff0c;還可能影響其他線程和整個程序的穩定性。以下是一些增強并發程序異常安全性的方法&a…

各語言鏡像配置匯總

鏡像配置匯總 Nodejs [ npm ]Python [ pip ] Nodejs [ npm ] // # 記錄日期&#xff1a;2025-01-20// 查詢當前使用的鏡像 npm get registry// 設置淘寶鏡像 npm config set registry https://registry.npmmirror.com/// 恢復為官方鏡像 npm config set registry https://regi…

Navicat Premium 數據可視化

工作區&#xff0c;數據源以及圖表 數據可視化是使用可視化組件&#xff08;例如圖表&#xff0c;圖形和地圖&#xff09;的信息和數據的圖形表示。 數據可視化工具提供了一種可訪問的方式&#xff0c;用于查看和理解數據中的趨勢&#xff0c;異常值和其他模式。 在Navicat中&…

linux通過web向mac遠程傳輸字符串,mac收到后在終端中直接打印。

要通過Web從Linux向Mac遠程傳輸字符串&#xff0c;并在Mac的終端中直接打印&#xff0c;可以使用以下方法。這里假設Linux作為服務器&#xff0c;Mac作為客戶端。 方法 1&#xff1a;使用Python的HTTP服務器 在Linux上啟動一個簡單的HTTP服務器&#xff0c;Mac通過curl獲取字符…

【系統分享01】Python+Vue電影推薦系統

大家好&#xff0c;作為一名老程序員&#xff0c;今天我將帶你一起走進電影推薦系統的世界&#xff0c;分享如何利用 Django REST Framework 和 Vue 搭建一套完整的電影推薦系統&#xff0c;結合 協同過濾算法&#xff0c;根據用戶評分與影片喜好&#xff0c;精準推送用戶可能喜…

Spring Boot+Vue

Spring BootVue 前后端分離是一種非常流行且高效的開發模式&#xff0c;以下是關于其相關方面的詳細介紹&#xff1a; 前端&#xff08;Vue&#xff09;部分 ? 項目搭建 ? 使用 Vue CLI 創建項目&#xff0c;它提供了豐富的插件和配置選項&#xff0c;能夠快速生成項目基礎…

第十四章:計算機新技術

文章目錄&#xff1a; 一&#xff1a;云計算 二&#xff1a;大數據 三&#xff1a;物聯網 四&#xff1a;人工智能 五&#xff1a;移動網絡與應用 六&#xff1a;電子商務 七&#xff1a;虛擬實現 八&#xff1a;區塊鏈 一&#xff1a;云計算 概念云基于?絡&#xff0…

【大數據2025】MapReduce

MapReduce 基礎介紹 起源與發展&#xff1a;是 2004 年 10 月谷歌發表的 MAPREDUCE 論文的開源實現&#xff0c;最初用于大規模網頁數據并行處理&#xff0c;現成為 Hadoop 核心子項目之一&#xff0c;是面向批處理的分布式計算框架。基本原理&#xff1a;分為 map 和 reduce …

主從復制

簡述mysql 主從復制原理及其工作過程&#xff0c;配置一主兩從并驗證。 主從原理&#xff1a;MySQL 主從同步是一種數據庫復制技術&#xff0c;它通過將主服務器上的數據更改復制到一個或多個從服務器&#xff0c;實現數據的自動同步。 主從同步的核心原理是將主服務器上的二…

【博客之星評選】2024年度前端學習總結

故事的開端...始于2024年第一篇前端技術博客 那故事的終末...也該結束于陪伴了我一整年的前端知識了 踏入 2025 年&#xff0c;滿心激動與自豪&#xff0c;我成功闖進了《2024 年度 CSDN 博客之星總評選》的 TOP300。作為一名剛接觸技術寫作不久的萌新&#xff0c;這次能走到這…

Ubuntu 24.04 LTS 服務器折騰集

目錄 Ubuntu 更改軟件源Ubuntu 系統語言英文改中文windows 遠程鏈接 Ubuntu 圖形界面Windows 通過 openssh 連接 UbuntuUbuntu linux 文件權限Ubuntu 空閑硬盤掛載到 文件管理器的 other locationsUbuntu 開啟 SMB 服務&#xff0c;并通過 windows 訪問Ubuntu安裝Tailscale&am…

《TikTok停服:信息安全警鐘長鳴》

一、TikTok 停服事件回顧 2025 年 1 月 18 日晚&#xff0c;TikTok 通知美國用戶&#xff0c;由于美官方禁令于 19 日起生效&#xff0c;TikTok 軟件將暫時對用戶停止服務。這一消息猶如一顆重磅炸彈&#xff0c;瞬間在全球范圍內掀起軒然大波。美國用戶對此猝不及防&#xff0…

1166 Summit (25)

A summit (峰會) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…

圖論DFS:黑紅樹

我的個人主頁 {\large \mathsf{{\color{Red} 我的個人主頁} } } 我的個人主頁 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;記憶化搜索DFS 算法&#xf…

C++,設計模式,【目錄篇】

文章目錄 1. 簡介2. 設計模式的分類2.1 創建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;2.2 結構型模式&#xff08;Structural Patterns&#xff09;&#xff1a;2.3 行為型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a; 3. 使用設計模式…

掌握提示詞工程:大模型使用入門指南

掌握提示詞工程&#xff1a;大模型使用入門指南 近年來&#xff0c;大語言模型&#xff08;如 GPT、Claude 等&#xff09;的強大能力令人印象深刻&#xff0c;但要想充分發揮這些模型的潛力&#xff0c;僅僅依靠其預訓練能力還不夠。提示詞工程&#xff08;Prompt Engineerin…

如何使用 useMemo 和 memo 優化 React 應用性能?

使用 useMemo 和 memo 優化 React 應用性能 在構建復雜的 React 應用時&#xff0c;性能優化是確保應用流暢運行的關鍵。React 提供了多種工具來幫助開發者優化組件的渲染和計算邏輯&#xff0c;其中 useMemo 和 memo 是兩個非常有用的 Hook。本文將詳細介紹這兩個工具的使用方…

Agent Laboratory: Using LLM Agents as Research Assistants 論文簡介

加速機器學習研究的智能實驗室——Agent Laboratory 1. 引言 隨著人工智能技術的飛速發展&#xff0c;機器學習領域正以前所未有的速度推進科學發現和技術創新。然而&#xff0c;傳統的科學研究模式往往受到時間、資源和專業知識限制&#xff0c;阻礙了研究者們探索新想法的能…