Opencv計算機視覺編程攻略-第三節 圖像顏色處理

第三節 圖像顏色處理

  • 1.顏色比較
  • 2.GrabCut分割圖像
  • 3.色調、飽和度以及亮度

1.顏色比較

主要實現逐像素的顏色比較,其中注意BGR顏色空間不連續,不利于顏色提取和區分,轉換到Lab空間:

	  int getColorDistance(const cv::Vec3b& color1, const cv::Vec3b& color2) const {// 方法一return abs(color1[0]-color2[0])+abs(color1[1]-color2[1])+abs(color1[2]-color2[2]);// 方法二return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-color2[0],color[1]-color2[1],color[2]-color2[2])));// 方法三 直接使用函數cv::Vec3b dist;cv::absdiff(color,color2,dist);return cv::sum(dist)[0];}// 使用指針遍歷圖像進行顏色比較Mat process(const Mat &image) {// same size as input image, but 1-channelresult.create(image.size(),CV_8U);// Converting to Lab color space  if (useLab)cv::cvtColor(image, converted, cv::COLOR_BGR2Lab);// get the iteratorsMat_<cv::Vec3b>::const_iterator it= image.begin<Vec3b>();Mat_<cv::Vec3b>::const_iterator itend= image.end<Vec3b>();Mat_<uchar>::iterator itout= result.begin<uchar>();// get the iterators of the converted image if (useLab) {it = converted.begin<cv::Vec3b>();itend = converted.end<cv::Vec3b>();}// 指針遍歷for ( ; it!= itend; ++it, ++itout) {// compute distance from target colorif (getDistanceToTargetColor(*it)<maxDist) {*itout= 255;} else {*itout= 0;}// end of pixel processing ----------------}return result;
}

2.GrabCut分割圖像

floodFill函數,支持用戶選擇種子點,opencv依據差異值進行快速處理,比如office中的設置透明色,就類似于該算法的實現

	// testing floodfillcv::floodFill(image,            // input/ouput imagecv::Point(100, 50),         // seed pointcv::Scalar(255, 255, 255),  // repainted color(0,0,0)則是黑色(cv::Rect*)0,  // bounding rectangle of the repainted pixel setcv::Scalar(35, 35, 35),     // low and high difference thresholdcv::Scalar(35, 35, 35),     // most of the time will be identicalcv::FLOODFILL_FIXED_RANGE); // pixels are compared to seed colorcv::namedWindow("Flood Fill result");result = colordetector(image);

GrabCut分割圖像通過用戶標記前景框,算法為2004年提出,主要是將圖像依據顏色相似進行圖塊分割,然后再使用邊緣特征進一步分割,將問題轉化為連通圖的合并問題,最后以四種類型作為結果輸出

	// define bounding rectangle cv::Rect rectangle(50,25,210,180);// the models (internally used)cv::Mat bgModel,fgModel; // segmentation resultcv::Mat result; // segmentation (4 possible values)// GrabCut segmentationcv::grabCut(image,    // input imageresult,   // segmentation resultrectangle,// rectangle containing foreground bgModel, fgModel, // models5,        // number of iterationscv::GC_INIT_WITH_RECT); // use rectangle// Get the pixels marked as likely foreground GC_PR_FGD有四種不同分類結果cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);// or://	result= result&1;

兩種方法對比圖下,GrabCut能夠有效保留前景要素邊緣特征
在這里插入圖片描述
最終基于邊框提取前景要素:
在這里插入圖片描述

3.色調、飽和度以及亮度

將圖像轉換到連續空間Lab進行處理往往可以獲得更為連續的結果,而HSV顏色表示更加符合人類視覺感知

cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);
cv::cvtColor(hsv,newImage, cv::COLOR_HSV2BGR);
cv::cvtColor(image,brightness, cv::COLOR_Lab2BGR);void detectHScolor(const cv::Mat& image,		// input image double minHue, double maxHue,	// Hue interval double minSat, double maxSat,	// saturation intervalcv::Mat& mask) {				// output mask// convert into HSV spacecv::Mat hsv;cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);// split the 3 channels into 3 imagesstd::vector<cv::Mat> channels;cv::split(hsv, channels);// channels[0] is the Hue// channels[1] is the Saturation// channels[2] is the Value// Hue maskingcv::Mat mask1; // below maxHuecv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);cv::Mat mask2; // over minHuecv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);cv::Mat hueMask; // hue maskif (minHue < maxHue)hueMask = mask1 & mask2;else // if interval crosses the zero-degree axishueMask = mask1 | mask2;// Saturation masking// below maxSatcv::threshold(channels[1], mask1, maxSat, 255, cv::THRESH_BINARY_INV);// over minSatcv::threshold(channels[1], mask2, minSat, 255, cv::THRESH_BINARY);cv::Mat satMask; // saturation masksatMask = mask1 & mask2;// combined maskmask = hueMask&satMask;
}

諸如人體皮膚再HSV顏色域中具有顯著的特征
在這里插入圖片描述

該節相關代碼已上傳到個人文檔,按需下載鏈接: 點擊下載

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

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

相關文章

BoomCut AI 技術創建本地化的營銷視頻

目錄 視頻翻譯實驗 交換實驗 數字人實驗 核心功能與技術亮點 適用場景 BoomCut 提供用于視頻翻譯、數字人等的 AI 技術,以快速創建本地化的營銷視頻 視頻翻譯實驗 電影電影哪吒之魔童降世換成西班牙語

論華為 Pura X 折疊屏性能檢測

在科技浪潮中&#xff0c;折疊屏手機以其創新形態掀起市場熱潮。華為 Pura X 作為華為最新折疊手機&#xff0c;承載前沿科技與精湛工藝&#xff0c;成為行業焦點。它融合先進折疊屏技術與優質材質&#xff0c;致力于打破傳統手機使用邊界&#xff0c;為用戶開啟全新體驗。但產…

【藍橋杯每日一題】3.25

&#x1f3dd;?專欄&#xff1a; 【藍橋杯備篇】 &#x1f305;主頁&#xff1a; f狐o貍x “OJ超時不是終點&#xff0c;是算法在提醒你該優化時間復雜度了&#xff01;” 目錄 3.25 差分數組 一、一維差分 題目鏈接&#xff1a; 題目描述&#xff1a; 解題思路&#xff1a;…

3.25學習總結 抽象類和抽象方法+接口+內部類+API

抽象類和抽象方法&#xff1a; 有抽象方法&#xff0c;那么類肯定是抽象類。父類不一定是抽象的&#xff0c;但如果父類中有抽象方法那一定是抽象類。 如果子類中都存在吃這個行為&#xff0c;但吃的具體東西不同&#xff0c;那么吃這個行為定義在父類里面就是抽象方法&#x…

Docker 數據卷與文件掛載

Docker 數據卷與文件掛載的區別與管理指南 在 Docker 中&#xff0c;數據卷&#xff08;Volume&#xff09;和文件掛載&#xff08;Bind Mount&#xff09;是兩種常用的數據持久化方式。它們的主要目的是將容器內的數據保存到主機上&#xff0c;以便在容器重啟或刪除后數據不會…

全面系統梳理多模態LLM對齊算法

1.alignment算法發展時間軸 2.MLMM alignment結構圖 3.目前alignment策略常見的損失函數形式 4.MLLM對齊數據構造與現有數據總結

廣告推薦算法 - 學習筆記

文章目錄 1、前言2、學習筆記2.1、什么是計算廣告系統&#xff1f; 1、前言 本篇博客&#xff0c;是我用來記錄學習廣告推薦算法的一些筆記和總結。 參考內容&#xff1a; 1、王喆&#xff1a;"深度"學習計算廣告 2、deepseek 2、學習筆記 2.1、什么是計算廣告系統…

ENSP學習day10

NAT地址轉換技術&#xff08;一&#xff09; NAT&#xff08;Network Address Translation&#xff09;地址轉換技術是一種在計算機網絡中常用的技術&#xff0c;在數據包從一個網絡傳輸到另一個網絡時&#xff0c;會對數據包中的源IP地址和目的IP地址進行修改的過程。這種技術…

數據分析中,文件解析庫解析內容樣式調整

CSV文件&#xff1a;使用Python標準庫中的csv模塊&#xff0c;通過簡單的文本解析來讀取數據。 Excel文件&#xff1a;使用專門的庫&#xff08;如openpyxl、xlrd&#xff09;來解析復雜的文件格式&#xff0c;或者使用pandas庫來簡化讀取過程。 在進行文件讀取后的格式調整時…

Swift 二分法求函數的近似解

在實際開發中會遇到一些工程問題&#xff0c;需要求解復雜函數方程的問題。使用傳統的數學方法比較難以處理。本文將使用二分法不斷獲取一個函數的近似解。 二分法&#xff1a;其基本思想是利用函數在某個區間內的連續性&#xff0c;通過不斷縮小區間范圍來逼近方程的解。 算法…

stanley 路徑跟蹤控制算法

文章目錄 寫在前面的話算法思路核心代碼1 路徑發布2 獲取車子當前位置3 預瞄路徑點4 計算航向誤差5 計算橫向誤差 完整控制代碼演示視頻 寫在前面的話 軌跡跟蹤 Trajectory Tracking 和 路徑跟蹤 Path Following 是機器人控制和自動駕駛領域中的兩個核心概念&#xff0c;盡管它…

Qt中通過QLabel實時顯示圖像

Qt中的QLabel控件用于顯示文本或圖像&#xff0c;不提供用戶交互功能。以下測試代碼用于從內置攝像頭獲取圖像并實時顯示&#xff1a; Widgets_Test.h&#xff1a; class Widgets_Test : public QMainWindow {Q_OBJECTpublic:Widgets_Test(QWidget *parent nullptr);~Widgets…

在STM32F7上實現CAN總線收發隊列

下面我將提供一個完整的STM32F7 CAN總線通信實現方案&#xff0c;包含中斷驅動的收發隊列管理。 1. CAN總線配置與隊列定義 can_bus.h #ifndef __CAN_BUS_H #define __CAN_BUS_H#include "stm32f7xx_hal.h" #include "queue.h"// CAN消息結構體 typedef …

【例3.5】位數問題(信息學奧賽一本通-1313)

【題目描述】 在所有的N位數中&#xff0c;有多少個數中有偶數個數字3?由于結果可能很大&#xff0c;你只需要輸出這個答案對12345取余的值。 【輸入】 讀入一個數N(N≤1000)。 【輸出】 輸出有多少個數中有偶數個數字3。 【輸入樣例】 2 【輸出樣例】 73 【題解代碼】 #incl…

pyQt學習筆記——Qt資源文件(.qrc)的創建與使用

Qt資源文件&#xff08;.qrc&#xff09;的創建與使用 1. 選擇打開資源2. 創建新資源3. 添加資源文件夾4. 選擇要加載的圖片文件5. 編譯resource.qrc文件6. 替換PySlide6為PyQt57. 其他說明 1. 選擇打開資源 在Qt項目中&#xff0c;可以通過windowIcon點擊選擇打開資源。 2. 創…

光電效應及普朗克常數的測定數據處理 Python實現

內容僅供參考&#xff0c;如有錯誤&#xff0c;歡迎指正&#xff0c;如有疑問&#xff0c;歡迎交流。 因為我不會Excel所以只能用Python來處理 祝大家早日擺脫物理實驗的苦海 用到的一些方法 PCHIP &#xff08;分段三次埃爾米特插值多項式&#xff09; 因為實驗時記錄的數…

2025最新3個wordpress好用的主題

紅色大氣的wordpress企業主題&#xff0c;適合服務行業的公司搭建企業官方網站使用。是一款專為中小企業和個人開發者設計的WordPress主題&#xff0c;旨在提供專業的網站構建解決方案。 通過此WordPress主題&#xff0c;用戶可以輕松創建和維護一個專業的企業網站&#xff0c…

OLLVM 增加 CC++ 字符串加密功能

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ 前言 當我們如果沒有對字符串進行加密&#xff0c;使用 IDA 反匯編一下 so 可以看到 C 代碼中的字符串就直接暴露了。 字符串加密原理 sobf.c #include <…

桑福德·韋爾策劃美國捷運公司收購南美銀行案例分析

桑福德韋爾(Sanford I. Weill)在1981年策劃美國捷運公司(American Express)以5.5億美元收購南美貿易發展銀行所屬外國銀行機構的案例中,展現了其作為戰略家與執行者的雙重能力。這一交易的流程和韋爾的具體行為可從以下六個關鍵環節解析: 一、戰略定位與目標篩選 戰略目標…

人工智能與區塊鏈融合:開啟數字信任新時代

引言 在當今數字化飛速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;與區塊鏈技術正以前所未有的速度改變著我們的生活和工作方式。AI以其強大的數據處理和智能決策能力&#xff0c;為各行業帶來了效率的飛躍&#xff1b;而區塊鏈則以其去中心化、不可篡改的特性…