《opencv實用探索·十六》opencv直方圖計算calcHist函數解析

直方圖理解:
(對于8位灰度圖像亮度/灰度為(0-255),12位灰度圖像亮度/灰度為(0-4095))
以8位圖像為例,亮度分為0到255共256個數值,數值越大,代表的亮度越高。其中0代表純黑色的最暗區域,255表示最亮的純白色。亮度分為了5個區域,分別是黑色,陰影,中間調,高光和白色。直方圖用來統計一幅圖像某個亮度像素數量。
在這里插入圖片描述

直方圖函數解析:

void 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:輸入的圖像的指針,可以是多幅圖像,所有的圖像必須有同樣的深度(CV_8U or CV_32F)。同時一副圖像可以有多個channes。
nimages:輸入圖像的個數
channels:需要統計直方圖的第幾通道。用來計算直方圖的channes的數組。比如輸入是2副圖像,第一副圖像有0,1,2共三個channel,第二幅圖像只有0一個channel,那么輸入就一共有4個channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副圖像的第一個通道和第一副圖像的第2和第0個通道來計算直方圖。
mask:掩膜,如果是空矩陣則表示圖像中所有位置的像素都計入直方圖中,如果mask不為空,那么它必須是一個8位(CV_8U)的數組,并且與輸入圖像尺寸相同,找到mask非0像素區域,把這些區域對應到輸入圖像區域,然后把這些區域參與直方圖計算。
hist:輸出的直方圖數組
dims:需要統計直方圖通道的個數,通常為1
histSize:指的是直方圖分成多少個區間,就是 bin的個數。在每一維上直方圖的個數。簡單把直方圖看作一個一個的豎條的話,就是每一維上豎條的個數。HistSize=256,表示每一維有256數條,數條的高度代表像素值的個數。
const float** ranges: 統計像素值得區間。比如:
float rang1[] = {0, 20};

    float rang2[] = {30, 40};const float *rangs[] = {rang1, rang2};那么就是對0,20和30,40范圍的值進行統計。

這個就相當于橫坐標,比如對像素值為0這個像素,如果數條的高度為100,表示有100個像素值為0的像素。
uniform=true::是否對得到的直方圖數組進行歸一化處理
accumulate=false:在多個圖像時,是否累計計算像素值得個數

下面是一個8位三通道計算直方圖案例:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 讀取圖像Mat image = imread("your_image.jpg");if (image.empty()) {cerr << "Error: Could not read the image." << endl;return -1;}// 設置直方圖參數int histSize = 256;  // 直方圖的 bin 數量float range[] = {0, 256};  // 像素值范圍const float* histRange = {range};bool uniform = true;  // 直方圖是否均勻bool accumulate = false;  // 是否累積直方圖// 計算藍色通道的直方圖int channelB = 0;  // 藍色通道索引Mat histB;calcHist(&image, 1, &channelB, Mat(), histB, 1, &histSize, &histRange, uniform, accumulate);// 計算綠色通道的直方圖int channelG = 1;  // 綠色通道索引Mat histG;calcHist(&image, 1, &channelG, Mat(), histG, 1, &histSize, &histRange, uniform, accumulate);// 計算紅色通道的直方圖int channelR = 2;  // 紅色通道索引Mat histR;calcHist(&image, 1, &channelR, Mat(), histR, 1, &histSize, &histRange, uniform, accumulate);// 繪制直方圖int histWidth = 512;int histHeight = 400;int binWidth = cvRound((double) histWidth / histSize);Mat histImage(histHeight, histWidth, CV_8UC3, Scalar(0, 0, 0));// 歸一化直方圖數據normalize(histB, histB, 0, histImage.rows, NORM_MINMAX, -1, Mat());normalize(histG, histG, 0, histImage.rows, NORM_MINMAX, -1, Mat());normalize(histR, histR, 0, histImage.rows, NORM_MINMAX, -1, Mat());// 繪制直方圖for (int i = 1; i < histSize; ++i) {line(histImage, Point(binWidth * (i - 1), cvRound(histB.at<float>(i - 1))),Point(binWidth * (i), cvRound(histB.at<float>(i))),Scalar(255, 0, 0), 2, 8, 0);line(histImage, Point(binWidth * (i - 1), cvRound(histG.at<float>(i - 1))),Point(binWidth * (i), cvRound(histG.at<float>(i))),Scalar(0, 255, 0), 2, 8, 0);line(histImage, Point(binWidth * (i - 1),cvRound(histR.at<float>(i - 1))),Point(binWidth * (i), cvRound(histR.at<float>(i))),Scalar(0, 0, 255), 2, 8, 0);}// 顯示原始圖像和直方圖imshow("Original Image", image);imshow("Histogram", histImage);waitKey(0);return 0;
}

在這里插入圖片描述

也可也遍歷拿到BGR每個通道下0-255每個灰度的像素個數
比如遍歷B通道

for(int i = 0; i < 256; i++)
{float count = cvRound(histB.at<float>(i - 1);
}

0-256為每個灰度,for循環遍歷每個灰度,并拿到該灰度下像素的個數,比如i=100,count=20表示,灰度為100的像素有20個。

在這里插入圖片描述

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

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

相關文章

【Docker二】docker網絡模式、網絡通信、數據管理、資源控制

目錄 一、docker網絡模式&#xff1a; 1、概述 2、docker網絡實現原理&#xff1a; 3、docker的網絡模式&#xff1a; 3.1、bridge模式&#xff1a; 3.2、host模式&#xff1a; 3.3、container模式&#xff1a; 3.4、none模式&#xff1a; 3.5、自定義網絡模式&#x…

【開題報告】基于SpringBoot的平遙牛肉銷售平臺的設計與實現

1.選題背景 平遙牛肉是中國山西省平遙地區的一種特色美食&#xff0c;因其獨特的風味和口感而享有盛譽。隨著互聯網的快速發展&#xff0c;電子商務已經成為人們購買商品和服務的主要途徑之一。在這個背景下&#xff0c;建立一個基于Spring Boot的平遙牛肉銷售平臺可以為消費者…

青光眼術后險致盲,輾轉多院幸于成都愛爾眼科重獲光明

“我在一家醫院診斷為青光眼&#xff0c;然后就做了青光眼手術。結果沒有成功&#xff0c;后面產生了脈絡膜脫離&#xff0c;從4月到10月底一直沒有恢復&#xff0c;我去找醫生結果那家醫院的醫生讓我等……等著恢復……”張先生是一位青光眼術后患者&#xff0c;一場手術給他帶…

TailwindCSS 配置可視化檢查器

問題 TailwindCSS 框架為我們提供了大量默認的類和屬性&#xff0c;而且開發者也能夠自定義類和配置。 對于初學者來說&#xff0c;這些配置其實是比較復雜的&#xff0c;這也是tailwindcss最大的入手成本&#xff0c;開發者的記憶負擔和心智負擔也都比較大。 有沒有辦法能夠…

谷歌Gemini被罵了?讓子彈飛一會兒;如何構建高效RAG系統;Pika是腐朽王朝的顛覆者;AGI將重塑組織架構;對話月之暗面楊植麟 | ShowMeAI日報

&#x1f440;日報&周刊合集 | &#x1f3a1;生產力工具與行業應用大全 | &#x1f9e1; 點贊關注評論拜托啦&#xff01; &#x1f440; 淘寶 X D.Design 堆友 | 淘寶年終好價節 AIGC 創作大賽 https://d.design/competition/taobao-promotion 淘寶攜手堆友聯合打造了「淘…

python用turtle畫櫻花飄落,python代碼畫櫻花代碼

這篇文章主要介紹了python用turtle畫櫻花飄落&#xff0c;具有一定借鑒價值&#xff0c;需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲&#xff0c;下面讓小編帶著大家一起了解一下。 1、python畫櫻花樹代碼為&#xff1a; import turtle as T import random import…

基于ssm保險業務管理系統設計與實現論文

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本保險業務管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息…

銀行數字化轉型導師堅鵬:興業生活APP運營之道

基于招商銀行案例研究的興業生活APP運營之道培訓圓滿結束 ——線上引流平臺流量經營與變現 興業銀行股份有限公司&#xff08;簡稱“興業銀行”&#xff09;成立于1988年8月&#xff0c;2022年總資產9.27萬億元&#xff0c;是經國務院、中國人民銀行批準成立的首批股份制商業銀…

python畫圖:legend圖例相關

import matplotlib.pyplot as plt plt.legend(loclower right, fontsize12, frameonTrue, fancyboxTrue, framealpha0.2, borderpad0.3,ncol1, markerfirstTrue, markerscale1, numpoints1, handlelength3.5)#loc:圖例位置,可取(‘best’, ‘upper right’, ‘upper left’, ‘…

在Ascend昇騰硬件用npu加速paddleLite版本ocr(nnadapter)

在Ascend昇騰硬件用npu加速paddleLite版本ocr&#xff08;nnadapter&#xff09; 參考文檔* nnadapter參考文檔地址* 華為昇騰 NPU參考文檔地址* PaddleLite的CAPI參考文檔 一.確保cpu版本運行正常二.編譯Ascend上npu加速庫三.跑通npu加速版本Demo1.Demo下載地址2.參考手冊網址…

Jupyter Notebook工具

Jupyter Notebook 是一個交互式的筆記本環境&#xff0c;允許用戶以網頁形式編寫和分享代碼、文本、圖像以及其它多媒體內容。它支持超過 40 種編程語言&#xff0c;最常用的是 Python。 以下是 Jupyter Notebook 工具的一些特點和用法&#xff1a; 1. 特點&#xff1a; 交互式…

vscode eide arm-gcc 編譯環境搭建調試

安裝cube&#xff0c;vscode 1.安裝vscode插件 C/C Extension Pack Chinese (Simplified) (簡體中文) Language Pack Cortex-Debug Embedded IDE 工具鏈設置 2.軟件工程生成 調試 3.生成工程&#xff0c;導入工程 4. 配置工程 編譯完畢

【PTA刷題】 求子串(代碼+詳解)

【PTA刷題】 求子串(代碼詳解) 題目 請編寫函數&#xff0c;求子串。 函數原型 char* StrMid(char *dst, const char *src, int idx, int len);說明&#xff1a;函數取源串 src 下標 idx 處開始的 len 個字符&#xff0c;保存到目的串 dst 中&#xff0c;函數值為 dst。若 len…

【W5500】關于使用外部網絡變壓器的原理圖設計

直接上原理圖 鏈接也放一個吧【鏈接】 按照這個畫&#xff0c;我實驗在立創EDA上打了一個實驗過是可以用的~ 畫出來的板子長這個樣子【就不公開原理圖和PCB了&#xff0c;這個板子還是很容易畫的】~ 注意在立創上找對網口&#xff0c;要無變壓器的網口&#xff0c;相比TB賣的那…

基于Springboot+Vue前后端分離的電影推薦系統(Java畢業設計)

大家好&#xff0c;我是DeBug&#xff0c;很高興你能來閱讀&#xff01;作為一名熱愛編程的程序員&#xff0c;我希望通過這些教學筆記與大家分享我的編程經驗和知識。在這里&#xff0c;我將會結合實際項目經驗&#xff0c;分享編程技巧、最佳實踐以及解決問題的方法。無論你是…

前端路由(front-end routing)和后端路由(back-end routing)的區別

聚沙成塔每天進步一點點 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 歡迎來到前端入門之旅&#xff01;感興趣的可以訂閱本專欄哦&#xff01;這個專欄是為那些對Web開發感興趣、剛剛踏入前端領域的朋友們量身打造的。無論你是完全的新手還是有一些基礎的開發…

滲透測試學習day8

文章目錄 靶機&#xff1a;UnifiedTask1Task2Task3Task4 5-14解題過程Task5Task6Task7Task8Task9Task10Task11Task12Submit user flagSubmit root flag 靶機&#xff1a;Unified Task1 問題&#xff1a;前四個開放端口是哪一個&#xff1f; 22,6789,8080,8443nmap掃一下 T…

解決IDEA配置gitignore不生效

idea gitignore 不生效 原因 之前已經git add 過&#xff0c;之后再設置.gitignore 文件是不會生效的 解決 撤銷 git add 操作&#xff0c;在控制臺輸入命令&#xff1a; git reset重新使用IDEA 提交代碼即可

打包HTML

結合之前的webpack打包 &#xff0c;對HTML進行相對應的打包 1.在瀏覽器打開npm搜索 html—webpack—插件 2.下劃找到lnstall復制webpack5里的第一句到終端 3.下滑找到用法配置腳本語言 3.1 復制下圖代碼到之前的webpack.config.js腳本里放在開頭的位置 3.2 復制下圖代碼到之…

pandas 使用方法(1)

目錄 1. excel 表格處理 (1) 讀取excel 表格 (2) 抽取excel表部分列數據 (3) 保存數據到excel表格 (4) 保存到 excel 表中的不同sheet 2. 判斷二維數組中的某個數值是否為空 3. 刪除二維數組中的空行 4. 在列表中添加某列屬性 本文是將使用pandas過程中遇到的問題進行了…