【IP101】圖像處理基礎:從零開始學習顏色操作(RGB、灰度化、二值化、HSV變換)

🎨 顏色操作詳解

🌟 在圖像處理的世界里,顏色操作就像是一個魔術師的基本功。今天,讓我們一起來解鎖這些有趣又實用的"魔法"吧!

📚 目錄

  1. 通道替換 - RGB與BGR的"調包"游戲
  2. 灰度化 - 讓圖像"褪色"的藝術
  3. 二值化 - 非黑即白的世界
  4. 大津算法 - 自動尋找最佳閾值的智慧之眼
  5. HSV變換 - 探索更自然的色彩空間

🔄 通道替換

理論基礎

在計算機視覺中,我們經常會遇到RGB和BGR兩種顏色格式。它們就像是"外國人"和"中國人"的稱呼順序,一個是姓在后,一個是姓在前。😄

對于一個彩色圖像 I I I,其RGB通道可以表示為:

I R G B = [ R G B ] I_{RGB} = \begin{bmatrix} R & G & B \end{bmatrix} IRGB?=[R?G?B?]

通道替換操作可以用矩陣變換表示:

I B G R = I R G B [ 0 0 1 0 1 0 1 0 0 ] I_{BGR} = I_{RGB} \begin{bmatrix} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{bmatrix} IBGR?=IRGB? ?001?010?100? ?

代碼實現

// C++實現
vector<Mat> channels;
split(src, channels);
vector<Mat> new_channels = {channels[2],  // Rchannels[1],  // Gchannels[0]   // B
};
# Python實現
b, g, r = cv2.split(img)
result = cv2.merge([r, g, b])

🌫? 灰度化

理論基礎

將彩色圖像轉換為灰度圖像,就像是把一幅油畫變成素描。我們使用加權平均的方法,因為人眼對不同顏色的敏感度不同。

標準RGB到灰度的轉換公式:

Y = 0.2126 R + 0.7152 G + 0.0722 B Y = 0.2126R + 0.7152G + 0.0722B Y=0.2126R+0.7152G+0.0722B

這個公式來自于ITU-R BT.709標準,考慮了人眼對不同波長光的敏感度。更一般的形式是:

Y = ∑ i ∈ { R , G , B } w i ? C i Y = \sum_{i \in \{R,G,B\}} w_i \cdot C_i Y=i{R,G,B}?wi??Ci?

其中 w i w_i wi? 是權重系數, C i C_i Ci? 是對應的顏色通道值。

為什么是這些權重?

  • 👁? 人眼對綠色最敏感 (0.7152)
  • 👁? 其次是紅色 (0.2126)
  • 👁? 對藍色最不敏感 (0.0722)

代碼實現

// C++實現
result.at<uchar>(y, x) = static_cast<uchar>(0.2126 * r + 0.7152 * g + 0.0722 * b
);

?? 二值化

理論基礎

二值化就像是給圖像下"最后通牒":要么是黑色,要么是白色,沒有中間地帶!

數學表達式:

g ( x , y ) = { 255 , if? f ( x , y ) > T 0 , if? f ( x , y ) ≤ T g(x,y) = \begin{cases} 255, & \text{if } f(x,y) > T \\ 0, & \text{if } f(x,y) \leq T \end{cases} g(x,y)={255,0,?if?f(x,y)>Tif?f(x,y)T?

其中:

  • f ( x , y ) f(x,y) f(x,y) 是輸入圖像在點 ( x , y ) (x,y) (x,y) 的灰度值
  • g ( x , y ) g(x,y) g(x,y) 是輸出圖像在點 ( x , y ) (x,y) (x,y) 的值
  • T T T 是閾值

應用場景

  • 📄 文字識別
  • 🎯 目標檢測
  • 🔍 邊緣檢測

代碼實現

// C++實現
result.at<uchar>(y, x) = (gray.at<uchar>(y, x) > threshold) ? 255 : 0;

🎯 大津算法

理論基礎

大津算法就像是一個"智能裁判",能自動找到最佳的分割閾值。它通過最大化類間方差來實現這一目標。

類間方差的計算公式:

σ B 2 ( t ) = ω 0 ( t ) ω 1 ( t ) [ μ 0 ( t ) ? μ 1 ( t ) ] 2 \sigma^2_B(t) = \omega_0(t)\omega_1(t)[\mu_0(t) - \mu_1(t)]^2 σB2?(t)=ω0?(t)ω1?(t)[μ0?(t)?μ1?(t)]2

其中:

  • ω 0 ( t ) \omega_0(t) ω0?(t) 是前景像素的概率
  • ω 1 ( t ) \omega_1(t) ω1?(t) 是背景像素的概率
  • μ 0 ( t ) \mu_0(t) μ0?(t) 是前景像素的平均灰度值
  • μ 1 ( t ) \mu_1(t) μ1?(t) 是背景像素的平均灰度值

最優閾值的選擇:

t ? = arg ? max ? t { σ B 2 ( t ) } t^* = \arg\max_{t} \{\sigma^2_B(t)\} t?=argtmax?{σB2?(t)}

算法步驟

  1. 📊 計算圖像直方圖
  2. 🔄 遍歷所有可能的閾值
  3. 📈 計算類間方差
  4. 🎯 選擇方差最大的閾值

代碼實現

// 計算類間方差
double variance = wBack * wFore * pow(meanBack - meanFore, 2);

🌈 HSV變換

理論基礎

HSV色彩空間更符合人類對顏色的感知方式,就像是把RGB這個"理工男"變成了更感性的"藝術家"。

  • 🎨 H (Hue) - 色相:顏色的種類
  • 💫 S (Saturation) - 飽和度:顏色的純度
  • ? V (Value) - 明度:顏色的明暗

RGB到HSV的轉換公式:

V = max ? ( R , G , B ) V = \max(R,G,B) V=max(R,G,B)

S = { V ? min ? ( R , G , B ) V , if? V ≠ 0 0 , if? V = 0 S = \begin{cases} \frac{V-\min(R,G,B)}{V}, & \text{if } V \neq 0 \\ 0, & \text{if } V = 0 \end{cases} S={VV?min(R,G,B)?,0,?if?V=0if?V=0?

H = { 60 ( G ? B ) / Δ , if? V = R 120 + 60 ( B ? R ) / Δ , if? V = G 240 + 60 ( R ? G ) / Δ , if? V = B H = \begin{cases} 60(G-B)/\Delta, & \text{if } V = R \\ 120 + 60(B-R)/\Delta, & \text{if } V = G \\ 240 + 60(R-G)/\Delta, & \text{if } V = B \end{cases} H=? ? ??60(G?B),120+60(B?R),240+60(R?G),?if?V=Rif?V=Gif?V=B?

其中 Δ = V ? min ? ( R , G , B ) \Delta = V - \min(R,G,B) Δ=V?min(R,G,B)

應用場景

  • 🎨 顏色分割
  • 🎯 目標跟蹤
  • 🌈 圖像增強

代碼實現

    // 手動實現RGB到HSV的轉換for (int y = 0; y < src.rows; y++) {for (int x = 0; x < src.cols; x++) {Vec3b pixel = src.at<Vec3b>(y, x);float b = pixel[0] / 255.0f;float g = pixel[1] / 255.0f;float r = pixel[2] / 255.0f;float maxVal = max(max(r, g), b);float minVal = min(min(r, g), b);float diff = maxVal - minVal;// 計算Hfloat h = 0;if (diff != 0) {if (maxVal == r) {h = 60 * (fmod(((g - b) / diff), 6));} else if (maxVal == g) {h = 60 * ((b - r) / diff + 2);} else {h = 60 * ((r - g) / diff + 4);}if (h < 0) h += 360;}// 計算Sfloat s = (maxVal == 0) ? 0 : diff / maxVal;// 計算Vfloat v = maxVal;// 轉換到OpenCV的HSV范圍result.at<Vec3b>(y, x) = Vec3b(static_cast<uchar>(h / 2),     // H: [0, 180]static_cast<uchar>(s * 255),   // S: [0, 255]static_cast<uchar>(v * 255)    // V: [0, 255]);}}

📝 實踐小貼士

1. 數據類型轉換注意事項

  • ?? 防止數據溢出
  • 🔍 注意精度損失
  • 💾 考慮內存使用

2. 性能優化建議

  • 🚀 使用向量化操作
  • 💻 利用CPU的SIMD指令
  • 🔄 減少不必要的內存拷貝

3. 常見陷阱

  • 🕳? 除零錯誤處理
  • 🌡? 邊界條件檢查
  • 🎭 顏色空間轉換精度

🎓 小測驗

  1. 為什么RGB轉灰度時綠色的權重最大?
  2. 大津算法的核心思想是什么?
  3. HSV色彩空間相比RGB有什么優勢?
👉 點擊查看答案
  1. 因為人眼對綠色最敏感
  2. 最大化類間方差,使前景和背景區分最明顯
  3. 更符合人類對顏色的直觀認知,便于顏色的選擇和調整

🔗 相關算法

  • 圖像增強
  • 邊緣檢測
  • 特征提取

💡 記住:顏色操作是圖像處理的基礎,掌握好這些操作,就像掌握了調色盤的魔法!

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

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

相關文章

windows系統搭建自己的ftp服務器,保姆級教程(用戶驗證+無驗證)

前言 最近在搭建環境時&#xff0c;我發現每次都需要在網上下載依賴包和軟件&#xff0c;這不僅耗時&#xff0c;而且有時還會遇到網絡不穩定的問題&#xff0c;導致下載速度慢或者中斷&#xff0c;實在不太方便。于是&#xff0c;我產生了搭建一個FTP服務器的想法。通過搭建FT…

藍橋杯 7. 晚會節目單

晚會節目單 原題目鏈接 題目描述 小明要組織一臺晚會&#xff0c;總共準備了 n 個節目。然而晚會時間有限&#xff0c;他只能從中選擇 m 個節目。 這 n 個節目是按照小明設想的順序給定的&#xff0c;順序不能改變。 小明發現觀眾對于晚會的喜歡程度與前幾個節目的好看程度…

JavaScript如何實現類型判斷?

判斷一個數據的類型&#xff0c;常用的方法有以下幾種&#xff1a; typeofinstanceofObject.prototype.toString.call(xxx) 下面來分別分析一下這三種方法各自的優缺點 typeof typeof的本意是用來判斷一個數據的數據類型&#xff0c;所以返回的也是一個數據類型。但是會遇到下…

哈希表筆記(四)Redis對比Java總結

文章目錄 一、基礎結構對比數據結構定義Java HashMapRedis字典 主要區別與設計思路 二、關鍵操作API對比初始化Java HashMapRedis字典 添加元素Java HashMapRedis字典 查找元素Java HashMapRedis字典 刪除元素Java HashMapRedis字典 擴容/重哈希操作Java HashMapRedis字典 三、…

docker拉取國內鏡像

1. 場景 最近整了一個tencent云服務器&#xff0c;想要玩一下docker&#xff0c;結果發現拉不下來&#xff0c;鏡像根本拉不下來。 2. 原因 1.云服務器無法訪問外網&#xff1b; 2. 國內的很多公有鏡像倉庫都被封了&#xff1b; 3. 推薦 https://zhuanlan.zhihu.com/p/713…

Codeforces Round 1008 (Div. 2) C

C 構造 題意&#xff1a;a的數據范圍大&#xff0c;b的數據范圍小&#xff0c;要求所有的a不同&#xff0c;考慮讓丟失的那個a最大即可。問題變成&#xff1a;構造一個最大的a[i] 思路&#xff1a;令a2是最大的,將a1,a3,a5....a2*n1&#xff0c;置為最大的b&#xff0c;將a4,a…

STM32 HAL庫實現USB虛擬串口

1. 引言 在嵌入式系統開發中&#xff0c;USB 虛擬串口是一種非常實用的功能。它允許 STM32 微控制器通過 USB 接口與計算機進行通信&#xff0c;就像使用傳統的串口一樣。這種方式不僅簡化了硬件設計&#xff0c;還提高了通信的靈活性和穩定性。STM32F407 系列微控制器具有強大…

JAVA EE_網絡原理_UDP與TCP

人海中未遇見時&#xff0c;我將獨自前行... ----------陳長生. 1.UDP協議 1.1.UDP協議端格式 UDP&#xff08;用戶數據報協議&#xff09;是由 源端口&#xff0c;目標端口&#xff0c;長度&#xff0c;校驗和&#xff0c;數據 5種結構組成。16位是UDP報文中字段的長度&#…

【免費】1992-2021年各省GDP數據/各省地區生產總值數據

1992-2021年各省GDP數據/各省地區生產總值數據 1、時間&#xff1a;1992-2021年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;GDP/地區生產總值 4、范圍&#xff1a;31省 5、指標說明:國內生產總值&#xff08;GDP&#xff09;是一個國家或地區在一定時期…

C++11新特性_范圍-based for 循環

based for 循環介紹 范圍 - based for 循環&#xff08;Range-based for loop&#xff09;是 C11 引入的一種新的 for 循環語法&#xff0c;它可以更簡潔地遍歷容器和數組。 遍歷數組&#xff1a;定義了一個整數數組 arr&#xff0c;使用范圍 - based for 循環 for (int num :…

【Bootstrap V4系列】學習入門教程之 頁面內容排版

Bootstrap V4 學習入門教程之 頁面內容排版 按鈕上的指針排版一、Global settings 全局設置二、Headings 標題2.1 Customizing headings 自定義標題2.2 Display headings 顯示標題2.3 Lead 引導 三、Blockquotes 塊引用3.1 Naming a source 命名源3.2 Alignment 對齊 四、Lists…

Flowable7.x學習筆記(十六)分頁查詢我的待辦

前言 我的待辦具體區分為3種情況&#xff0c;第一個就是辦理人指定就是我&#xff0c;我可以直接審批&#xff1b;第二種就是我是候選人&#xff0c;我需要先拾取任務然后再辦理&#xff1b;第三種是我是候選組&#xff0c;我需要切換到指定的角色去拾取任務再辦理。如果任務已…

EBO的使用

EBO 其實就是個索引&#xff0c;綁定在相應的VAO中&#xff0c;用來描述繪制順序。比如在OpenGL繪制三角形的時候&#xff0c;假設有四個頂點&#xff0c;我稱他們分別為1&#xff0c;2&#xff0c;3&#xff0c;4號頂點&#xff0c;常規繪制三角形函數是按三個點為一組&#x…

界面控件DevExpress WPF v25.1預覽 - AI功能增強(語義搜索)

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

零基礎做自動駕駛集成測試(仿真)

圖 1&#xff1a;使用 GPUDrive 進行極快的多代理模擬。上圖&#xff1a;GPUDrive 中 Waymo Open Motion Dataset 場景的鳥瞰圖&#xff0c;方框表示受控智能體&#xff0c;圓圈表示其目標。底部&#xff1a;相應的代理視圖&#xff0c;以一個代理為中心。可以根據用戶的目標輕…

EasyRTC嵌入式音視頻實時通話SDK技術,打造低延遲、高安全的遠程技術支持

一、背景 在當今數字化時代&#xff0c;遠程技術支持已成為解決各類技術問題的關鍵手段。隨著企業業務的拓展和技術的日益復雜&#xff0c;快速、高效地解決遠程設備與系統的技術難題變得至關重要。EasyRTC作為一款高性能的實時通信解決方案&#xff0c;為遠程技術支持提供了創…

【C語言常用字符串解析】

總結一下在 C 語言中用于字符串解析&#xff08;特別是從文件中讀取行并提取數據&#xff09;的常用函數、 核心任務&#xff1a; 通常是從文件中讀取一行文本&#xff08;一個字符串&#xff09;&#xff0c;然后從這個字符串中提取出需要的數據&#xff08;比如數字、單詞等…

SpringTas定時任務使用詳解

文章目錄 Spring Task概述1、環境配置2.注解實現定時任務2.注解實現定時任務4. cron表達式詳解&#xff1a; Spring Task概述 在開發中&#xff0c;我們經常會用到定時任務&#xff0c;而Spring Task 則是Spring提供的定時任務框架。 其它定時任務實現框架又jdk自帶Timer和Qua…

數字智慧方案6172丨智慧醫院擴建信息化整體規劃方案(60頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧醫院擴建信息化整體規劃方案 詳細資料請看本解讀文章的最后內容。 在信息技術飛速發展的當下&#xff0c;醫療行業的信息化建設成為提升醫療服務水平、優化醫院管理的關鍵路徑。這份智慧醫院擴建信息化整體規劃方案&#xff0c;針對醫院擴建過程中的信…

ts全局導入接口

為了在項目中全局導入 ITableColumn 接口&#xff0c;避免每次使用時手動導入&#xff0c;可以通過以下步驟實現&#xff1a; 1. 全局導入的實現方式 在 Vue 項目中&#xff0c;可以通過在 src 目錄下創建一個 global.d.ts 文件&#xff0c;將 ITableColumn 接口聲明為全局類型…