Opencv計算機視覺編程攻略-第四節 圖直方圖統計像素

Opencv計算機視覺編程攻略-第四節 圖直方圖統計像素

  • 1.計算圖像直方圖
  • 2.基于查找表修改圖像
  • 3.直方圖均衡化
  • 4.直方圖反向投影進行內容查找
  • 5.用均值平移法查找目標
  • 6.比較直方圖搜索相似圖像
  • 7.用積分圖統計圖像

1.計算圖像直方圖

圖像統計直方圖的概念
圖像統計直方圖是一種用于描述圖像中像素分布情況的工具。具體來說,灰度直方圖是一個關于灰度級別的函數,它記錄了圖像中每種灰度級別對應的像素數量。這種分布反映了圖像亮度的整體特性。

對于彩色圖像(如RGB),可以通過將每個顏色通道分別映射到特定索引來構建其直方圖,并利用核密度估計的方法來累積權重,從而得到更精確的顏色分布信息。

統計直方圖主要基于opencv 的calcHist函數實現,其具體配置如下

		calcHist(&image, 1,			// histogram of 1 image onlychannels,	// the channel usedMat(),	// no mask is usedhist,		// the resulting histogram1,			// it is a 1D histogramhistSize,	// number of binsranges		// pixel value range);

學習文中給出的手繪統計直方圖,基于統計的頻數,繪制線高 line

    // Create an image representing a histogramstatic Mat getImageOfHistogram(const Mat &hist, int zoom) {// Get min and max bin valuesdouble maxVal = 0;double minVal = 0;minMaxLoc(hist, &minVal, &maxVal, 0, 0);// get histogram sizeint histSize = hist.rows;// Square image on which to display histogramMat histImg(histSize*zoom, histSize*zoom, CV_8U, Scalar(255));// set highest point at 90% of nbins (i.e. image height)int hpt = static_cast<int>(0.9*histSize);// Draw vertical line for each binfor (int h = 0; h < histSize; h++) {float binVal = hist.at<float>(h);if (binVal>0) {int intensity = static_cast<int>(binVal*hpt / maxVal);line(histImg, Point(h*zoom, histSize*zoom),Point(h*zoom, (histSize - intensity)*zoom), Scalar(0), zoom);}}return histImg;}

在這里插入圖片描述

2.基于查找表修改圖像

所謂的查找表,相當于是一個數組,每個數組對應i值的原像素值映射為目標像素值
人工構建查找表

cv::Mat lut(1,256,CV_8U); // 1x256 matrix
// Or:
// int dim(256);
// cv::Mat lut(1,  // 1 dimension
// 	&dim,          // 256 entries
//	CV_8U);        // uchar
for (int i=0; i<256; i++) {// 0 becomes 255, 1 becomes 254, etc.lut.at<uchar>(i)= 255-i;
}

通過opencv的LUT函數一鍵映射查找表,進行取反操作

 Mat result;// apply lookup tableLUT(image,lookup,result);

在這里插入圖片描述
在這里插入圖片描述

3.直方圖均衡化

上文了解了統計直方圖和查找表,基于直方圖統計結果構建均衡化的查找表,從而全局修改圖像整體顏色

equalizeHist(image,result); // 直接使用opencv函數實現均衡化

在這里插入圖片描述
在這里插入圖片描述
統計直方圖的原理一般是值選擇一定像素值范圍,將該范圍的像素映射的一個更大范圍的像素值范圍中,從而使得整體圖像顯得更均勻,手動實現代碼如下:

    Mat stretch(const Mat &image, float percentile) {// number of pixels in percentilefloat number= image.total()*percentile;// Compute histogram firstMat hist = getHistogram(image);// find left extremity of the histogramint imin = 0;for (float count=0.0; imin < 256; imin++) {// number of pixel at imin and below must be > numberif ((count+=hist.at<float>(imin)) >= number)break;}// find right extremity of the histogramint imax = 255;for (float count=0.0; imax >= 0; imax--) {// number of pixel at imax and below must be > numberif ((count += hist.at<float>(imax)) >= number)break;}// Create lookup tableint dims[1] = { 256 };Mat lookup(1, dims, CV_8U);for (int i = 0; i<256; i++) {if (i < imin) lookup.at<uchar>(i) = 0;else if (i > imax) lookup.at<uchar>(i) = 255;else lookup.at<uchar>(i) = cvRound(255.0*(i - imin) / (imax - imin));}// Apply lookup tableMat result;result = applyLookUp(image, lookup);return result;}

在這里插入圖片描述

4.直方圖反向投影進行內容查找

區域內圖像的統計直方圖某種程度表示了整體顏色分布特征,因而可以使用區域的統計直方圖作為特征進行相似內容查找,以區域內白云的顏色為例進行統計
在這里插入圖片描述
在這里插入圖片描述

calcBackProject(&image,1,            // we only use one image at a timechannels,     // vector specifying what histogram dimensions belong to what image channelsshistogram,   // the histogram we are usingresult,       // the resulting back projection imageranges,       // the range of values, for each dimension255.0         // the scaling factor is chosen such that a histogram value of 1 maps to 255);

在這里插入圖片描述
在這里插入圖片描述
在灰度圖內進行統計分析,難以分割出較好的效果,使用rgb往往可以獲得不錯的效果,彩色圖使用同一個函數
在這里插入圖片描述

5.用均值平移法查找目標

在這里插入圖片描述
以這個猩猩的臉部特征生成統計特征圖

   // 顏色轉為hsv 如上一節所說,hsv分辨皮膚更清晰cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);// Get back-projection of hue histogramint ch[1]={0};finder.setThreshold(-1.0f); // no thresholdingcv::Mat result= finder.find(hsv,0.0f,180.0f,ch);// 使用反向統計直方圖獲得圖像上和目標區域的相似性概率圖// search objet with mean shift 使用均值漂移算法在概率圖中查找,最后在一張有偏移的圖像上準確找到目標cv::TermCriteria criteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,10,     // iterate max 10 times1);     // or until the change in centroid position is less than 1px

在這里插入圖片描述

6.比較直方圖搜索相似圖像

在傳統數字圖像處理領域,使用統計直方圖進行圖像相似度對比,是常用的方法,簡單高效

	double compare(const cv::Mat& image) {inputH= hist.getHistogram(image);// histogram comparison using intersectionreturn cv::compareHist(refH,inputH, cv::HISTCMP_INTERSECT);}

在這里插入圖片描述
waves vs dog: 26535
waves vs marais: 12149
waves vs bear: 18353
waves vs beach: 33032 相似度最高的圖像
waves vs polar: 20768
waves vs moose: 15225
waves vs lake: 15486
waves vs fundy: 14309

在這里插入圖片描述

7.用積分圖統計圖像

積分圖統計圖像,本質就是數組的前綴和算法,通過一次性求解前綴,后續每個位置的要素數量就可以直接查詢得到,避免每次的查找,這個在區域內進行搜索直方圖特征中有較好的應用,實際操作中,將顏色維度從256壓縮到更小空間從而實現加速:

	double maxSimilarity=0.0;int xbest, ybest;// loop over a horizontal strip around girl location in initial imagefor (int y=110; y<120; y++) {for (int x=0; x<secondImage.cols-width; x++) {// compute histogram of 16 bins using integral imagehistogram= intHistogram(x,y,width,height);// compute distance with reference histogramdouble distance= cv::compareHist(refHistogram,histogram, cv::HISTCMP_INTERSECT);// find position of most similar histogramif (distance>maxSimilarity) {xbest= x;ybest= y;maxSimilarity= distance;}std::cout << "Distance(" << x << "," << y << ")=" << distance << std::endl;}}

在這里插入圖片描述
如果看到這里,麻煩點一個贊再走,謝謝!相關代碼同樣上傳代碼庫鏈接: 點擊下載

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

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

相關文章

5、vim編輯和shell編程【超詳細】

一、vim 1、了解 Vim (Vi IMproved) 是一款功能強大的文本編輯器。 正常模式&#xff1a;vim 文件&#xff0c;剛打開的樣子vim模式&#xff1a;輸入文本的地方命令模式&#xff1a;輸入 :wq等等的位置&#xff0c;可以對文本進行一些操作&#xff0c;比如&#xff1a;保存文…

《Robust Synthetic-to-Real Transfer for Stereo Matching》

論文地址&#xff1a;https://arxiv.org/pdf/2403.07705 源碼地址&#xff1a;https://github.com/jiaw-z/DKT-Stereo 概述 通過在合成數據上預訓練的模型在未見領域上表現出強大的魯棒性。然而&#xff0c;在現實世界場景中對這些模型進行微調時&#xff0c;其領域泛化能力可…

藍橋杯第10屆 后綴表達式

題目描述 給定 N 個加號、M 個減號以及 NM1 個整數 A1,A2,???,ANM1?&#xff0c;小明想知道在所有由這N 個加號、M 個減號以及 NM1 個整數湊出的合法的 后綴表達式中&#xff0c;結果最大的是哪一個&#xff1f; 請你輸出這個最大的結果。 例如使用 1 2 3 -&#xff0c…

C++前綴和

個人主頁&#xff1a;[PingdiGuo_guo] 收錄專欄&#xff1a;[C干貨專欄] 大家好&#xff0c;今天我們來了解一下C的一個重要概念&#xff1a;前綴和 目錄 1.什么是前綴和 2.前綴和的用法 1.前綴和的定義 2.預處理前綴和數組 3.查詢區間和 4.數組中某個區間的和是否為特定…

uni app跨端開發遇到的問題

技術棧 uni app&#xff0c;vue3&#xff0c;uview puls&#xff0c;map… nvue 因為項目中有地圖&#xff0c;要使用到map標簽&#xff0c;所以考慮用原生nvue開發&#xff0c;它是有痛點的&#xff0c;首先瀏覽器不支持&#xff0c;我是要開發ios和Android&#xff0c;所以…

SQL注入操作

sql注入 一&#xff0c;SQL注入分類按照注入的網頁功能類型分類按照注入點值的屬性分類基于從服務器返回內容按照注入的程度和順序 一&#xff0c;SQL注入分類 按照注入的網頁功能類型分類 登錄注入cms注入 cms邏輯&#xff1a;index.php首頁展示內容&#xff0c;具有文章列表…

微信 MMTLS 協議詳解(五):加密實現

常用的解密算法&#xff0c;對稱非對稱 加密&#xff0c;密鑰協商&#xff0c; 帶消息認證的加解密 #生成RSA 密鑰對 void GenerateRsaKeypair(std::string& public_key,std::string& private_key) {RSA* rsa RSA_new();BIGNUM* bn BN_new();// 生成 RSA 密鑰對BN_s…

ROS melodic 安裝 python3 cv_bridge

有時候&#xff0c;我們需要處理這些兼容性問題。此處列舉我的過程&#xff0c;以供參考 mkdir -p my_ws_py39/src cd my_ws_py39 catkin_make_isolated-DPYTHON_EXECUTABLE/usr/bin/python3 \-DPYTHON_INCLUDE_DIR/usr/include/python3.8 \-DPYTHON_LIBRARY/usr/lib/x86_64-l…

深入學習:SpringQuartz的配置方式!

全文目錄&#xff1a; 開篇語前言摘要概述1. 基于 XML 的傳統配置配置步驟1.1 Maven 依賴1.2 XML 配置文件1.3 實現 Job 類 2. 基于 Java Config 的現代配置方式配置步驟2.1 Maven 依賴2.2 配置類2.3 實現 Job 類 3. 動態任務調度動態添加任務動態刪除任務 4. Quartz 持久化配置…

ClickHouse與TiDB實操對比:從入門到實戰的深度剖析

ClickHouse與TiDB實操對比&#xff1a;從入門到實戰的深度剖析 寶子們&#xff0c;在當今數據驅動的時代&#xff0c;選擇合適的數據庫對于處理海量數據和支撐業務發展至關重要。ClickHouse和TiDB作為兩款備受關注的數據庫&#xff0c;各自有著獨特的優勢和適用場景。今天&…

element-ui messageBox 組件源碼分享

messageBox 彈框組件源碼分享&#xff0c;主要從以下兩個方面&#xff1a; 1、messageBox 組件頁面結構。 2、messageBox 組件屬性。 一、組件頁面結構。 二、組件屬性。 2.1 title 標題&#xff0c;類型為 string&#xff0c;無默認值。 2.2 message 消息正文內容&#xf…

睡眠健康領域的智能硬件設備未來的發展趨勢

隨著社會節奏的不斷加快&#xff0c;人們的睡眠問題愈發多了起來&#xff0c;主要表現有以下幾個方面&#xff1a; 睡眠質量下降 淺睡眠增多&#xff1a;現代生活中&#xff0c;人們面臨著各種壓力源&#xff0c;如工作壓力、生活瑣事、經濟壓力等&#xff0c;這些壓力會導致大…

支付頁面安全與E-Skimming防護----淺談PCI DSS v4.0.1要求6.4.3與11.6.1的實施

關鍵詞&#xff1a;支付頁面安全、E-Skimming、PCI DSS v4.0.1、第三方腳本、風險管理、持卡人數據、數據安全、第三方服務提供商、TPSP、內容安全、網頁監控、惡意腳本攻擊 本文為atsec和作者技術共享類文章&#xff0c;旨在共同探討信息安全的相關話題。轉載請注明&#xff…

【gradio】從零搭建知識庫問答系統-Gradio+Ollama+Qwen2.5實現全流程

從零搭建大模型問答系統-GradioOllamaQwen2.5實現全流程&#xff08;一&#xff09; 前言一、界面設計&#xff08;計劃&#xff09;二、模塊設計1.登錄模塊2.注冊模塊3. 主界面模塊4. 歷史記錄模塊 三、相應的接口&#xff08;前后端交互&#xff09;四、實現前端界面的設計co…

案例分享|樹莓派媒體播放器,重構商場廣告的“黃金三秒”

研究顯示&#xff0c;與傳統戶外廣告相比&#xff0c;數字戶外廣告在消費者心中的記憶率提高了17%&#xff0c;而動態戶外廣告更是能提升16%的銷售業績&#xff0c;整體廣告效率提升了17%。這一顯著優勢&#xff0c;使得越來越多資源和技術流入數字廣告行業。 戶外裸眼3D廣告 無…

23種設計模式-裝飾器(Decorator)設計模式

裝飾器設計模式 &#x1f6a9;什么是裝飾器設計模式&#xff1f;&#x1f6a9;裝飾器設計模式的特點&#x1f6a9;裝飾器設計模式的結構&#x1f6a9;裝飾器設計模式的優缺點&#x1f6a9;裝飾器設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是…

[Vue]事件修飾符

文章目錄 一、語法介紹二、添加代碼三、結果展示四、參考文獻 如有錯誤&#xff0c;請指正&#xff01;&#xff01;&#xff01; 一、語法介紹 1、問題來源 我們在處理網頁時&#xff0c;當點擊按鈕時會觸發對應事件&#xff0c;但是有時并不想觸發該時間&#xff0c…

Go 語言 sync 包使用教程

Go 語言 sync 包使用教程 Go 語言的 sync 包提供了基本的同步原語&#xff0c;用于在并發編程中協調 goroutine 之間的操作。 1. 互斥鎖 (Mutex) 互斥鎖用于保護共享資源&#xff0c;確保同一時間只有一個 goroutine 可以訪問。 特點&#xff1a; 最基本的同步原語&#x…

ubuntu22.04安裝搜狗輸入法保姆教程~

一、添加中文語言支持 1.首先打開設置,找到Language and Region 2.點擊Manage Installed Languages 3.點擊 Install/Remove Languages... 4.選中Chinese (simplified),點擊Apply

docker中間件部署

1.docker安裝 # 1.卸載舊版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2.需要的安裝包 yum install -y yum-utils# 3.設置鏡像的倉庫 # 3.1.默認是國外的&#x…