【42】【OpenCV C++】 計算圖像某一列像素方差 或 某一行像素的方差;

文章目錄

  • 1 要使用到的函數 和 原理
    • 1.1 cv::meanStdDev 函數詳解——計算均值和標準差
    • 1 .2 方差的通俗解釋
  • 2 代碼實現
  • 3 問題
    • 3.1 入口參數const cv::Mat& img 和 const cv::Mat img區別

項目要求:

  • C++ OPenCV 中 圖像img ,
  • 當 string ROIdirection =“H”時,代表橫向線條,則在圖像寬度的一半處取一列像素,計算方差;
  • 當 string ROIdirection =“V”時,代表豎向線條,則在圖像高度的一半處取一行像素,計算方差;

要求寫一個獨立的函數實現該功能,計算的方差有入口參數帶出來;

1 要使用到的函數 和 原理

1.1 cv::meanStdDev 函數詳解——計算均值和標準差

OpenCV的cv::meanStdDev函數用于同時計算輸入矩陣的均值標準差。函數定義如下:

void cv::meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray mask=noArray());

參數:

  • src:輸入數組,必須是單通道或多通道的圖像。
  • mean:輸出參數,返回各個通道的均值。
  • stddev:輸出參數,返回各個通道的標準差。
  • mask:可選的操作掩碼,用于指定需要計算的區域。如果不提供,默認計算整個圖像。

功能:

  • meanStdDev計算輸入矩陣src的均值和標準差。均值是數據的平均值,標準差是數據偏離均值的程度。

代碼示例及詳細解釋

假設我們有一個一維矩陣linePixels1D,我們可以使用meanStdDev函數來計算它的均值和標準差。具體代碼如下:

cv::Scalar mean, stddev;
cv::meanStdDev(linePixels1D, mean, stddev);
  • linePixels1D:輸入矩陣,這里是一維的像素值數組。
  • mean:輸出參數,存儲均值結果。
  • stddev:輸出參數,存儲標準差結果。

例子詳細解釋:
假設linePixels1D包含以下像素值:

[100, 150, 200, 250, 150, 100, 200, 250]

執行cv::meanStdDev后,計算過程如下:
在這里插入圖片描述
然后計算這些偏差平方的平均值:
(5625 + 625 + 625 + 5625 + 625 + 5625 + 625 + 5625)/8 = 3593.75;
最后計算標準差(方差的平方根):
sqrt{3593.75} = 59.94;

3.函數結果:

  • mean[0] 將包含均值:175
  • stddev[0] 將包含標準差:59.94

1 .2 方差的通俗解釋

方差是一個統計學概念,用于衡量一組數據的分散程度。通俗地講,方差告訴我們數據點離平均值有多遠。理解方差可以幫助我們了解數據的波動情況。

舉例說明:
假設我們有兩組學生的考試成績:

組A:90, 91, 89, 92, 88
組B:60, 95, 85, 70, 100

這兩組的平均分可能相同或相近,但數據的分散情況不同。組A的成績比較集中,組B的成績波動較大。

計算步驟:

在這里插入圖片描述
結果解讀:

  • 組A的方差為2,組B的方差為226。說明組A的成績比較集中,而組B的成績波動較大。
  • 方差越大,數據分布越分散。方差越小,數據越集中。

方差的通俗意義

  • 方差提供了一種量化數據分散程度的方法。
  • 在實際應用中,方差可以幫助我們理解和比較不同數據集的穩定性。例如,在股票市場中,較大的方差意味著股票價格波動較大,風險較高;較小的方差意味著價格波動較小,風險較低。

2 代碼實現

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>// 計算圖像指定方向的像素方差
void calculateVariance(const cv::Mat& img, const std::string& ROIdirection, double& variance) {// 檢查圖像是否為空if (img.empty()) {std::cerr << "錯誤: 圖像為空!" << std::endl;return;}// 檢查方向參數是否有效if (ROIdirection != "H" && ROIdirection != "V") {std::cerr << "錯誤: 無效的ROIdirection!請使用 'H' 或 'V'。" << std::endl;return;}// 用于存儲提取的像素線條cv::Mat linePixels;if (ROIdirection == "H") {// 如果是水平方向,在圖像一半寬度處取一列像素int colIndex = img.cols / 2;linePixels = img.col(colIndex);} else if (ROIdirection == "V") {// 如果是垂直方向,在圖像一半高度處取一行像素int rowIndex = img.rows / 2;linePixels = img.row(rowIndex);}// 將像素線條轉換為一維數組以便計算方差cv::Mat linePixels1D = linePixels.reshape(1, linePixels.total());// 計算均值和標準差cv::Scalar mean, stddev;cv::meanStdDev(linePixels1D, mean, stddev);// 方差是標準差的平方variance = stddev[0] * stddev[0];
}int main() {// 加載示例圖像(為了簡單起見,使用灰度模式)cv::Mat img = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);if (img.empty()) {std::cerr << "錯誤: 無法加載圖像!" << std::endl;return -1;}// 計算圖像一半寬度處列像素的方差double varianceH = 0.0;calculateVariance(img, "H", varianceH);std::cout << "圖像一半寬度處列像素的方差: " << varianceH << std::endl;// 計算圖像一半高度處行像素的方差double varianceV = 0.0;calculateVariance(img, "V", varianceV);std::cout << "圖像一半高度處行像素的方差: " << varianceV << std::endl;return 0;
}

3 問題

3.1 入口參數const cv::Mat& img 和 const cv::Mat img區別

  • const cv::Mat& img:傳遞的是圖像的引用,不會復制圖像數據,只是創建一個對原圖像的引用。這在處理大圖像時更加高效,因為避免了不必要的數據復制。
  • const cv::Mat img:傳遞的是圖像的副本,函數內部將持有圖像數據的一個拷貝。這會導致額外的內存開銷和時間消耗,尤其是在圖像很大的時候。

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

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

相關文章

元圖 CAD 插件化革命:突破效率瓶頸,重構智能協作新范式

在建筑、機械、機電等工程領域&#xff0c;傳統CAD軟件的功能固化與場景割裂已成為效率提升的瓶頸。設計師常面臨“通用工具難適配專業需求”、“跨平臺協作效率低下”、“數據孤島阻礙創新”等痛點。元圖CAD憑借“場景插件化“核心技術&#xff0c;以模塊化能力突破行業桎梏&a…

T:歸并排序

歸并排序.逆序對簡介.歸并排序.習題.逆序對簡介 \;\;\;\;\;\;\;\;簡單介紹一下歸并排序的原理&#xff0c;逆序對的基本概念&#xff0c;然后收集相關的練習。 直接用一個基礎問題來引入。 因此知道了: \;\;\;\;\;\;\;\;逆序對就是一對數滿足 i<j&&nums[i]>nu…

三極管三種基本放大電路:共射、共集、共基放大電路

文章目錄一、共集放大電路1.靜態分析2.動態分析二、共基放大電路1.靜態分析2.動態分析總結如何判斷共射、共集、共基放大電路&#xff1f; 電路的輸入回路與輸出回路以發射極為公共端的電路稱為共射放大電路。 電路的輸入回路與輸出回路以集電極為公共端的電路稱為共集放大電路…

Function AI 助力用戶自主開發 MCP 服務,一鍵上云高效部署

作者&#xff1a;靖蘇 在 AI 與云原生協同創新的浪潮下&#xff0c;多模型、多場景智能應用日益普及。開發者面臨的首要挑戰&#xff0c;是如何實現模型之間、服務之間的高效協同&#xff0c;以及如何便捷地將自主研發能力拓展到云端&#xff0c;形成靈活可擴展的智能服務。MC…

c++編譯環境安裝(gcc、cmake)

一、gcc下載 下載地址&#xff1a;https://ftp.gnu.org/gnu/gcc/ 選擇想要下載的版本&#xff0c;然后解壓&#xff0c;查看 contrib/download_prerequisites 中的依賴。 以我下載的 gcc-7.3.0 為例&#xff0c; 二、安裝依賴包 【gmp】 https://ftp.gnu.org/gnu/gmp/ 【is…

基于貝葉斯的營銷組合模型實戰案例(PyMC實踐)

文章出自&#xff1a;基于營銷預算優化的媒體投入分配研究 本篇技術亮點在于結合了廣告飽和度和累積效應&#xff0c;通過數學模型和數值優化方法&#xff0c;精確計算電視與數字媒體的最佳預算分配比例&#xff0c;實現增量銷售最大化。該方法適合有多渠道廣告投放需求、預算…

react_05create-react-app腳手架詳細解析(export)

腳手架是什么&#xff1f; 是一種工具:快速生成項目的工程化結構&#xff0c;讓項目從搭建到開發&#xff0c;到部署&#xff0c;整個流程變得快速和便捷。 安裝過程: 1.安裝node,安裝完成后驗證版本,出現對應版本就表示成功 node --version npm --version2.React腳手架默認是使…

Uncaught TypeError: Illegal invocation

報錯信息Uncaught TypeError: Illegal invocation關鍵代碼$.operate.post(prefix "/edit", { "taskId": taskId, "taskStatus": completed });<input id"taskId" style"display: none;">[[${completeTask.taskId}]]&…

深入解析Go設計模式:責任鏈模式實戰

什么是責任鏈模式? 責任鏈模式(Chain of Responsibility Pattern)是一種行為設計模式,它通過構建處理者鏈來傳遞請求。每個處理者既能自行決定是否處理當前請求,也可將請求轉交給后續處理者。該模式的核心優勢在于解耦請求發送方與處理方,使多個對象都能獲得處理請求的機…

機器視覺系統工業相機的成像原理及如何選型

機器視覺系統是一種模擬人類視覺功能&#xff0c;通過光學裝置和非接觸式傳感器獲取圖像數據&#xff0c;并進行分析和處理&#xff0c;以實現對目標物體的識別、測量、檢測和定位等功能的智能化系統。其目的是讓機器能夠理解和解釋視覺信息&#xff0c;從而做出決策或執行任務…

Java如何快速實現短信登錄?

全文目錄&#xff1a;開篇語前言1. 短信登錄的工作原理2. 短信登錄的優點3. 短信登錄的缺點4. 短信登錄的實現示例&#xff1a;使用 Java 實現短信登錄的流程4.1 發送短信驗證碼&#xff08;偽代碼&#xff09;4.2 使用第三方短信平臺發送短信&#xff08;以阿里云為例&#xf…

HTML已死,HTML萬歲——重新思考DOM的底層設計理念

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

客戶管理系統的詳細項目框架結構

以下是針對客戶管理系統的詳細項目框架結構&#xff0c;整合了核心業務模塊&#xff08;客戶信息、合同管理、售前售后等&#xff09;&#xff0c;并補充了實用擴展模塊&#xff08;如數據統計、標簽管理等&#xff09;&#xff0c;嚴格遵循Django模塊化設計原則&#xff1a; c…

【01】OpenCV C#——C#開發環境OpenCvSharp 環境配置 工程搭建 及代碼測試

文章目錄一、OpenCV 介紹二、OpenCvSharp 介紹三、OpenCvSharp環境搭建3.1 創建新項目3.2 添加 NuGet組件3.3 代碼測試3.4 相較于 C OpenCV不同的之處四、LearnOpenCV有時候&#xff0c;單純c#做前端時會聯合C實現的dll來落地某些功能由于有時候會用C - Opencv實現算法后封裝成…

【解決辦法】報錯Found dtype Long but expected Float

Found dtype Long but expected Float錯誤通常發生在嘗試將一個數據類型為Long的張量傳遞給一個期望數據類型為Float的函數或操作時。在PyTorch中&#xff0c;Long和Float是兩種常見的數據類型&#xff0c;分別對應于64位整數和32位浮點數。某些函數或操作可能只接受特定數據類…

QtC++ 調用 tesseract開源庫 搭配 Opencv 實現文字識別:從tesseract庫基本介紹到實際應用實現

前言 在當今數字化時代&#xff0c;文字識別&#xff08;OCR&#xff09;技術已經滲透到我們生活和工作的方方面面&#xff0c;從掃描文檔的自動排版到車牌識別、票據信息提取等&#xff0c;都離不開 OCR 技術的支持。而在眾多 OCR 實現方案中&#xff0c;QtC 結合 tesseract 和…

數據集-目標檢測系列- 地球儀 數據集 globe>> DataBall

數據集-目標檢測系列- 地球儀 數據集 globe&#xff1e;&#xff1e; DataBall貴在堅持&#xff01;* 相關項目1&#xff09;數據集可視化項目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2&#xff09;數據集訓練、推理相關項目&…

[Oracle] DUAL數據表

Oracle中的DUAL數據表是一個特殊的單行單列虛擬表結構&#xff1a;1行1列SELECT * FROM DUAL;輸出結果&#xff1a;列名默認DUMMY&#xff0c;值為X常見使用DUAL數據表的場景&#xff1a;1.系統函數調用測試當需要測試Oracle函數但不需要真實表數據時&#xff0c;我們可以考慮使…

第五篇: 深入解析基于 SQLAlchemy 的聊天記錄持久化模塊:`message_model` 與數據庫操作封裝

深入解析基于 SQLAlchemy 的聊天記錄持久化模塊:message_model 與數據庫操作封裝 作者:zgw 標簽:SQLAlchemy、Python、FastAPI、數據庫持久化、ORM、聊天系統、AI 應用開發 一、前言 在構建大模型應用(如聊天機器人、知識庫問答系統)時,對話記錄的持久化 是實現“可追溯…

學習游戲制作記錄(將各種屬性應用于戰斗以及實體的死亡)8.5

1.將各種屬性應用于戰斗我們希望將上節課的CharactorState腳本作為一個父類&#xff0c;而玩家和敵人的屬性狀態都是繼承自它的創建PlayerStats腳本&#xff1a;public class PlayerStats : CharactorState {private Player player;//獲取玩家腳本protected override void Star…