OpenCV 圖像像素類型轉換與歸一化

一、知識點
1、OpenCV支持多種數據類型,每種類型都對應著不同的取值范圍。?
? (1)、CV_8U取值范圍[0, 255]。
? (2)、CV_16U取值范圍[0, 65535]。
? (3)、CV_32F取值范圍[0, 1]。
??
2、OpenCV提供convertTo()函數來轉換數據類型,提供normalize()函數來改變取值范圍。

3、void Mat::convertTo(OutputArray dst, int rtype, double alpha, double beta) const
? (1)、Mat成員函數,將Mat對象轉換到另一種數據類型。
? (2)、參數說明:
? ? ? dst: 輸出數組。
?? ? ?rtype: 輸出數組的期望類型,如CV_8UC1、CV_8UC3、CV_32FC3等。
?? ? ?alpha: 縮放因子,默認值為1,用于乘以輸入矩陣的每個元素。
?? ? ?beta: 偏移量,默認值為0,用于將縮放后的值加上偏移量。

4、void normalize( InputArray src,?
? ? ? ? ? ? ? ? ? InputOutputArray dst,?
?? ??? ??? ??? ? ?double alpha = 1,?
?? ??? ??? ??? ? ?double beta = 0,
? ? ? ? ? ? ? ? ? int norm_type = NORM_L2,?
?? ??? ??? ??? ? ?int dtype = -1,?
?? ??? ??? ??? ? ?InputArray mask = noArray());

? (1)、將數組歸一化到指定的取值范圍。
? (2)、參數說明:
? ? ? src: 輸入數組。
?? ? ?dst: 輸出數組,其類型和輸入數組相同。
?? ? ?alpha: 歸一化后的最小值或縮放系數,具體取決于norm_type。 若為NORM_MINMAX則表示歸一化后的最小值; 若為NORM_INF、NORM_L1、NORM_L2則表示縮放系數。
?? ? ?beta: 歸一化后的最大值,僅當norm_type為NORM_MINMAX時有效。
?? ? ?norm_type: 歸一化的方式,cv::NormTypes枚舉值,詳見5。
?? ? ?dtype: 為負數時,dst的類型和src相同; 否則,dst的通道數和src相同,但深度為dtype。
?? ? ?mask: 可選掩碼,若不為空,則在指定數組中(非零掩碼對應)歸一化; 若為空,則在整個數組歸一化。
? (3)、注意,norm_type為NORM_MINMAX時,雖然alpha表示最小值,beta表示最大值,但是兩值調換也不影響。
?? ? ?
5、enum NormTypes {
? ? NORM_INF = 1,
? ? NORM_L1 = 2,
? ? NORM_L2 = 4,
? ? NORM_L2SQR = 5,
? ? NORM_HAMMING = 6,
? ? NORM_HAMMING2 = 7,
? ? NORM_TYPE_MASK = 7,?
? ? NORM_RELATIVE = 8,?
? ? NORM_MINMAX = 32?
};

? (1)、常用NORM_INF、NORM_L1、NORM_L2、NORM_MINMAX這四種歸一化方式。
? (2)、NORM_L1,所有像素所有通道的值和為1。
? ? ? cv::normalize(src, dst, 1.0, 0.0, cv::NORM_L1);
? ? ? sum = 2 + 8 + 10 = 20
? ? ? 2 ?---> ?0.1 ? (2.0 / 20.0)
?? ? ?8 ?---> ?0.4 ? (8.0 / 20.0)
?? ? ?10 ---> ?0.5 ? (10.0 / 20.0)
? (3)、NORM_L2,所有像素所有通道的值求單位向量。 (默認)
? ? ? cv::normalize(src, dst, 1.0, 0.0, cv::NORM_L2);
? ? ? |v| = 開根號(2 * 2 + 8 * 8 + 10 * 10) = 開根號(168) = 12.96
?? ? ?2 ?---> ?0.15 ? (2.0 / 12.96)
?? ? ?8 ?---> ?0.62 ? (8.0 / 12.96)
?? ? ?10 ---> ?0.77 ? (10.0 / 12.96)
? (4)、NORM_INF,每個值除以所有像素所有通道的最大值。
? ? ? cv::normalize(src, dst, 1.0, 0.0, cv::NORM_INF);
?? ? ?Max = 10
?? ? ?2 ?---> ?0.2 ? (2.0 / 10.0)
?? ? ?8 ?---> ?0.8 ? (8.0 / 10.0)
?? ? ?10 ---> ?1.0 ? (10.0 / 10.0)
? (5)、NORM_MINMAX (常用)
? ? ? cv::normalize(src, dst, 0.0, 1.0, cv::NORM_MINMAX);
?? ? ?alpha = 0.0, beta = 1.0, 歸一化范圍[0.0, 1.0],簡記為[a, b]
?? ? ?找到樣本數據最小值Min = 2, 最大值Max = 10
?? ? ?計算系數k = (b - a) / (Max - Min) = 1.0 / 8.0 = 0.125
?? ? ?歸一化值 = a + k * (當前值 - Min)
?? ? ?2 ?---> ?0.0 ? (0.0 + 0.125 * (2 - 2))
?? ? ?8 ?---> ?0.75 ?(0.0 + 0.125 * (8 - 2))
?? ? ?10 ---> ?1.0 ? (0.0 + 0.125 * (10 - 2))
?? ? ?
6、注意:
? (1)、將CV_8UC3轉換為CV_32FC3,8U取值范圍[0, 255],32F取值范圍[0.0, 1.0],如果不歸一化,imshow會顯示幾乎全白圖像。
? (2)、將CV_8UC3圖像不轉換類型,直接歸一化,imshow會顯示全黑圖片。
??
??
??
二、示例代碼

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{//自定義src1,CV_8UC3類型的src1轉為CV_32FC3類型的dst1,類型值改變但是元素值不變cv::Mat src1 = cv::Mat::zeros(3, 3, CV_8UC3);src1 = cv::Scalar(45, 60, 80);std::cout << "src1 type = " << src1.type() << std::endl << src1 << std::endl;cv::Mat dst1;src1.convertTo(dst1, CV_32FC3, 1.0, 0.0);std::cout << "dst1 type = " << dst1.type() << std::endl << dst1 << std::endl;//NORM_L1, 所有像素所有通道的值求和為1cv::Mat dst2;cv::normalize(dst1, dst2, 1.0, 0.0, cv::NORM_L1);std::cout << "dst2 type = " << dst2.type() << std::endl << dst2 << std::endl;//NORM_L2, 所有像素所有通道的值求單位向量cv::Mat dst3;cv::normalize(dst1, dst3, 1.0, 0.0, cv::NORM_L2);std::cout << "dst3 type = " << dst3.type() << std::endl << dst3 << std::endl;//NORM_INF, 每個值除以所有像素所有通道的最大值cv::Mat dst4;cv::normalize(dst1, dst4, 1.0, 0.0, cv::NORM_INF);std::cout << "dst4 type = " << dst4.type() << std::endl << dst4 << std::endl;//NORM_MINMAXcv::Mat dst5;cv::normalize(dst1, dst5, 0.0, 1.0, cv::NORM_MINMAX);std::cout << "dst5 type = " << dst5.type() << std::endl << dst5 << std::endl;//src2是讀取的圖像cv::Mat src2 = cv::imread("../images/6.png");if (src2.empty()){std::cout << "load src2 image error..." << std::endl;return -1;}cv::imshow("原始圖像", src2);//CV_8UC3轉為32FC3,值沒有變化,但是顯示會非常白的圖片src2.convertTo(src2, CV_32FC3);cv::imshow("類型轉換", src2);//NORM_L1,結果值太小,圖像顯示黑色cv::Mat dst6;cv::normalize(src2, dst6, 1.0, 0.0, cv::NORM_L1);cv::imshow("NORM_L1", dst6);//NORM_L2,結果值太小,放大100倍,圖像能顯示出來cv::Mat dst7;cv::normalize(src2, dst7, 100.0, 0.0, cv::NORM_L2);cv::imshow("NORM_L2", dst7);//NORM_INFcv::Mat dst8;cv::normalize(src2, dst8, 1.0, 0.0, cv::NORM_INF);cv::imshow("NORM_INF", dst8);//NORM_MINMAXcv::Mat dst9;cv::normalize(src2, dst9, 1.0, 0.0, cv::NORM_MINMAX);cv::imshow("NORM_MINMAX", dst9);//src3和src2讀取一樣的原始圖片, 但如果不轉換類型,直接歸一化,會顯示全黑的圖片cv::Mat src3 = cv::imread("../images/6.png");if (src3.empty()){std::cout << "load src3 image error..." << std::endl;return -1;}cv::Mat dst10;cv::normalize(src3, dst10, 1.0, 0.0, cv::NORM_MINMAX);cv::imshow("直接歸一化", dst10);cv::waitKey(0);return 0;
}

? 輸出結果:

src1 type = 16
[ 45,  60,  80,  45,  60,  80,  45,  60,  80;45,  60,  80,  45,  60,  80,  45,  60,  80;45,  60,  80,  45,  60,  80,  45,  60,  80]
dst1 type = 21
[45, 60, 80, 45, 60, 80, 45, 60, 80;45, 60, 80, 45, 60, 80, 45, 60, 80;45, 60, 80, 45, 60, 80, 45, 60, 80]
dst2 type = 21
[0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049;0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049;0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049]
dst3 type = 21
[0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907;0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907;0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907]
dst4 type = 21
[0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1;0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1;0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1]
dst5 type = 21
[2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1;2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1;2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1]

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

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

相關文章

機器學習算法_支持向量機

一、支持向量機 支持向量機只能做二分類任務 SVM全稱支持向量機&#xff0c;即尋找到一個超平面使樣本分成兩類&#xff0c;且間隔最大 硬間隔&#xff1a;如果樣本線性可分&#xff0c;在所有樣本分類都正確的情況下&#xff0c;尋找最大間隔&#xff1b;如果出現異常值或樣…

Linux : echo ~ tail 重定向符

&#x1f680; Linux 常用命令詳解&#xff1a;echo、tail 與重定向符號全解析&#xff08;含通俗案例&#xff09; &#x1f4c5; 更新時間&#xff1a;2025年6月17日 &#x1f3f7;? 標簽&#xff1a;Linux基礎 | Shell命令 | echo | tail | 輸出重定向 | Linux入門 文章目錄…

uniapp的更新流程【安卓、IOS、熱更新】

UniApp應用更新方案 兩種更新方式 APP全量升級&#xff1a;需要重新下載安裝包熱更新&#xff1a;通過下載wgt資源包實現&#xff0c;用戶只需重啟應用 Android更新實現 用戶需要授權安裝權限&#xff0c;流程為下載APK后自動彈出安裝界面 var dtask plus.downloader.cre…

火山引擎解碼生態型增長鐵律

“技術流量與力量的崛起&#xff0c;本質上是一場生態規模的競賽。每次浪潮的排頭兵&#xff0c;都是指尖沾著代碼的開發者——互聯網時代的Linux社區讓開源席卷全球&#xff0c;移動互聯網的App Store催生百萬開發者&#xff0c;而今天&#xff0c;大模型正在用API重構產業。”…

警惕GO的重復初始化

go的初始化方式有很多種&#xff0c;在某些情況下容易引起重復初始化導致錯誤。 事例如下&#xff1a; 當使用gorm連接數據庫時定義了全局DB var DB *gorm.DB 但是在后面某個函數內部初始化時導致DB重新初始化變成了局部變量&#xff0c;導致原來的全局變量DB還是nil func I…

python校園服務交流系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

AlexNet:圖像分類領域的里程碑網絡及其創新剖析

文章目錄 前言AlexNet一、網絡的背景二、網絡結構三、網絡的創新3.1 首次使用GPU訓練網絡3.2 使用Relu激活函數3.2.1 sigmoid激活函數和tanh激活函數3.2.1.1 sigmoid激活函數3.2.1.2 tanh激活函數 3.3 Relu激活函數3.4 使用LRN局部響應歸一化(已棄用)3.4.1 LRN的定義與起源3.4.…

iOS性能調優實踐:結合KeyMob等多個工具提升應用穩定性與流暢度

在iOS應用開發中&#xff0c;性能問題往往難以通過單一工具輕松解決。尤其是當App面臨用戶反饋的流暢度差、卡頓嚴重、內存泄漏等問題時&#xff0c;開發者需要依靠多種工具的組合&#xff0c;才能有效地排查和優化性能瓶頸。 在我們最近的一個項目中&#xff0c;開發團隊在處…

球形波方程的推導與解法

題目 問題 6. 一個球形波是三維波動方程的解,形式為 u ( r , t ) u(r,t) u(r,t),其中 r r r 是到原點的距離(球坐標)。波動方程的形式為: u t t = c 2 ( u r r + 2 r u r ) (球形波方程) . u_{tt} = c^{2} \left( u_{rr} + \frac{2}{r} u_{r} \right) \quad \text{(球形…

自動打電話軟件設計與實現

文章目錄 方案概述實現代碼1. 安裝必要的庫2. 主程序代碼3. HTML模板 (templates/index.html) 功能說明部署說明擴展功能建議注意事項 方案概述 使用Twilio的API進行電話呼叫實現基本的呼叫邏輯添加簡單的用戶界面 實現代碼 1. 安裝必要的庫 pip install twilio flask2. 主…

RedissonLock源代碼分析與鎖應用

文章目錄 前言一、RedissonLock源代碼分析1.1 嘗試加鎖2.2 解鎖 二、鎖業務應用1.服務層方法注解方式 注入鎖1.1 定義DistributedLock 注解類1.2 定義DistributedLockAspect 切片類1.3 嘗試獲取鎖代碼片斷1.4 釋放鎖代碼片斷1.5 服務層注入鎖注解 2.代碼行加鎖2.1 pom.xml文件引…

深入理解mysql索引

一、什么是索引&#xff1f; 索引&#xff08;Index&#xff09; 是數據庫管理系統中一種特殊的數據結構&#xff0c;存儲在磁盤上。它包含對數據表中一列或多列的值進行排序&#xff0c;并存儲了指向表中實際數據行物理位置或主鍵值的引用指針。可以把它類比為書籍的目錄&…

VMware vSphere Foundation 9.0 技術手冊 —— Ⅰ 安裝 ESXi 9.0 (虛擬機)

目錄 1. 安裝 ESXi 9.0 (虛擬機)&#xff08;1&#xff09;ESXi Standard Boot Menu&#xff08;2&#xff09;ESXi 安裝導向&#xff08;3&#xff09;最終用戶許可協議&#xff08;4&#xff09;選擇系統盤&#xff08;5&#xff09;選擇鍵盤類型&#xff08;6&#xff09;設…

UE5 游戲模板 —— TopDownGame 俯視角游戲

UE5 游戲模板 —— TopDownGame 俯視角游戲 前言一、模塊導入二、TopDownGameMode三、TopDownPlayerController1、構造函數2、SetupInputComponent初始化新輸入系統處理輸入邏輯 四、TopDownCharacter五、射線檢測總結 前言 上一篇文章介紹了一下PuzzleGame模板的流程&#xf…

基于深度學習的智能圖像分割系統:技術與實踐

前言 圖像分割是計算機視覺領域中的一個核心任務&#xff0c;其目標是將圖像劃分為多個有意義的區域或對象。圖像分割在醫學影像分析、自動駕駛、安防監控等多個領域有著廣泛的應用。近年來&#xff0c;深度學習技術&#xff0c;尤其是卷積神經網絡&#xff08;CNN&#xff09;…

【學習筆記】2.2 Encoder-Decoder

參考資料&#xff1a;https://github.com/datawhalechina/happy-llm 在 Transformer 中&#xff0c;使用注意力機制的是其兩個核心組件——Encoder&#xff08;編碼器&#xff09;和 Decoder&#xff08;解碼器&#xff09;。 2.2.1 Seq2Seq 模型 Seq2Seq&#xff08;序列到…

# 材料力學押題

材料力學押題 文章目錄 材料力學押題第一題第二題組合變形彎曲變形 第一題 Q 求力作用的銷釘位置的豎直偏移距離。 S 方法一:能量方法 材料應變能計算為: U ∫ 內力 2 2 剛度 d A U\int \frac{\text{內力}^2}{2\times 剛度}\text{d}A U∫2剛度內力2?dA 克拉珀龍原理&…

uniapp項目之小兔鮮兒小程序商城(一) 項目介紹,技術棧,小程序的基礎架構,封裝攔截器和請求函數

文章目錄 一.項目介紹和前置內容1.重要鏈接2.技術棧 二.創建uniapp項目1.使用HBuilderX創建2.使用命令行創建3.如何使用vscode開發uniapp項目?step1:把項目拉入vscode,開始下相關插件step2:ts類型校驗step3:設置json文件可以允許注釋 4.pages.json文件的作用是什么?5.示例:在…

Uniapp H5端SEO優化全攻略:提升搜索引擎排名與流量

在移動互聯網時代&#xff0c;H5頁面因其跨平臺、低成本、易傳播的特性&#xff0c;成為許多企業的首選。Uniapp作為一款優秀的前端跨端開發框架&#xff0c;能夠快速開發H5、小程序、App等多端應用。然而&#xff0c;由于Uniapp默認采用SPA&#xff08;單頁應用&#xff09;架…

一[3.3]、ubuntu18.04環境 利用 yolov8 實現列車軌道檢測,并提取正確的軌道線【全網最詳細】

一、參考文獻 https://blog.csdn.net/u010117029/category_12977729.html 一[3.2]、ubuntu18.04環境 利用 yolov8 訓練開源列車數據集,并實現列車軌道檢測【全網最詳細】-CSDN博客 火車軌道鐵路軌道檢測識別(附帶Python源碼+詳細解析)_軌道點云提取鐵軌代碼-CSDN博客