OpenCV學習(4.1) 改變顏色空間

1.目標

  • 在本教程中,你將學習如何將圖像從一個色彩空間轉換到另一個,像BGR?灰色,BGR?HSV等
  • 除此之外,我們還將創建一個應用程序,以提取視頻中的彩色對象
  • 你將學習以下功能:cv2.cvtColor,**cv2.inRange**等。

2.改變顏色空間

在 OpenCV 中有超過 150 種顏色空間轉換的方法。但我們僅需要研究兩個最常使用的方法,他們是 BGR 到 Gray,BGR 到 HSV。

我們使用 cv2.cvtColor(input_image, flag)函數進行顏色轉換,其中 flag 決定了轉換的類型。

對于 BGR 到 Gray 轉換我們令 flag 為 **cv2.COLOR_BGR2GRAY**。 同樣,對于 BGR 到 HSV, 我們令 flag 為 **cv2.COLOR_BGR2HSV**。

代碼:

import cv2image = r'D:\study\EmotionDetection_RealTime-master\data\data\te\01.jpg'
image = cv2.imread(image)#顏色轉換
img1 = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('s',image)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)cv2.waitKey(0)
cv2.destroyAllWindows()

注意?對于 HSV, 色調(Hue)范圍為 [0,179], 飽和度(Saturation)范圍為 [0,255] ,明亮度(Value)為 [0,255]. 不同的軟件使用不同的比例. 所以如果你想用 OpenCV 的值與別的軟件的值作對比,你需要歸一化這些范圍。

結果輸出:

3.目標顏色區域提取

現在我們知道了如何將 BGR 圖片轉化為 HSV 圖片,我們可以使用它去提取彩色對象。HSV 比 BGR 在顏色空間上更容易表示顏色。在我們的應用中,我們會嘗試提取一個感興趣的彩色對象,方法為:

  • 將 BGR 轉化為 HSV 顏色空間。
  • 點擊圖像對應區域獲得HSV值
  • 獲取感興趣的彩色區域

代碼:

import cv2
import numpy as npimage = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
# image = cv2.imread(image)import cv2
import numpy as np
from matplotlib import pyplot as pltimage=cv2.imread(image)
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDOWN: #定義一個鼠標左鍵按下去的事件print(HSV[y,x])cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)cv2.waitKey(0)
cv2.destroyAllWindows()

輸出:

?

?HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
? ? if event==cv2.EVENT_LBUTTONDOWN: #定義一個鼠標左鍵按下去的事件
? ? ? ? print(HSV[y,x])

您提供的代碼片段是使用OpenCV庫(通常以cv2導入)來處理圖像的一部分。這段代碼的作用是將圖像從BGR顏色空間轉換到HSV顏色空間,并且定義了一個鼠標事件處理函數,當用戶在圖像上左鍵點擊時,它會打印出點擊位置像素的HSV值。

下面是這段代碼的詳細解釋:

  1. HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV):這行代碼將輸入的image(應該是BGR格式的numpy數組)轉換為HSV顏色空間。OpenCV默認讀取圖像為BGR格式,而HSV顏色空間對于某些圖像處理任務(如顏色分割)更加方便。

  2. def getpos(event,x,y,flags,param)::這定義了一個名為getpos的函數,它將作為回調函數用于處理OpenCV窗口中的鼠標事件。這個函數接收五個參數:event(事件類型),xy(鼠標點擊的坐標),flags(其他參數),param(用戶定義的參數)。

  3. if event==cv2.EVENT_LBUTTONDOWN::這行代碼檢查event參數是否為cv2.EVENT_LBUTTONDOWN,即鼠標左鍵是否被按下。

  4. print(HSV[y,x]):如果在圖像上發生了鼠標左鍵點擊事件,這行代碼會打印出鼠標點擊位置像素的HSV值。這里HSV[y,x]訪問的是轉換到HSV顏色空間后的圖像數組,在(x,y)位置的像素值。

lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)

您提供的代碼片段是使用OpenCV庫來創建一個藍色顏色范圍的掩碼(mask),并將這個掩碼顯示在窗口中。這段代碼是在HSV顏色空間中操作的,這是進行顏色識別和分割的常用方法。

下面是這段代碼的詳細解釋:

  1. lower_blue = np.array([0, 0, 190]):這行代碼定義了藍色在HSV顏色空間中的低閾值。這里,藍色的色調(H)從0開始,飽和度(S)從0開始,亮度(V)從190開始。這意味著,亮度高于190的非常淺的藍色將被排除在外。

  2. upper_blue = np.array([180, 200, 255]):這行代碼定義了藍色在HSV顏色空間中的高閾值。色調(H)的上限是180(在HSV顏色空間中,藍色的范圍是從0到180,然后再次從180到0,所以這里包括了所有的藍色),飽和度(S)的上限是200,亮度(V)的上限是255(最大值)。

  3. mask = cv2.inRange(HSV, lower_blue, upper_blue):這行代碼使用cv2.inRange函數創建了一個掩碼,這個掩碼包含了輸入圖像HSV中所有在lower_blueupper_blue閾值范圍內的像素。在掩碼中,這些像素被設置為白色(255),而不在閾值范圍內的像素被設置為黑色(0)。

  4. cv2.imshow('mask',mask):這行代碼顯示了創建的掩碼。在顯示的窗口中,白色的區域代表了圖像中藍色的部分,黑色的區域則代表其他顏色。

要使這段代碼完整工作,您需要確保已經讀取了圖像并將其轉換為HSV顏色空間,如之前提供的代碼示例所示。然后,這段代碼將創建并顯示藍色物體的掩碼。

提取結果:

?這在?stackoverflow.com?中是經常見到的問題。 這個問題非常簡單,你可以使用相同的函數:**cv.cvtColor()**。 不需要輸入圖片,你只需要輸入你需要的 BGR 值即可. 例如, 為了找到綠色的 HSV 值, 可以在 Python 終端中輸入以下代碼:

>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]

現在你可以取 [H-10, 100,100] 和 [H+10, 255, 255] 分別作為上界和下界. 除此之外,你可以使用任何圖像編輯工具(如 GIMP)或任何在線轉換器來查找這些值,但不要忘記調整 HSV 范圍。?

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

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

相關文章

更適合工程師和研究僧的FPGA專項培訓課程

各位編程精英er~ 社區打造的FPGA工程師培訓班上線后,有不少同學后臺私信詢問:“能不能出個那種專門針對某個知識點的課程呢?我想針對自己的薄弱點深入學習。” 貼心如我,當然會滿足大家的學習需求啦。本周,社區FPGA專…

數學學習基本理念與方法

公理:不證自明的命題,一定條件下都認同的正確的結論 定理:在公理基礎上由嚴謹的數學邏輯獲得(為證明的,叫猜想) 推論:由某個定理推導出來,相對定理約束條件更多,重要程度…

面試題:說說你對 JS 中 this 指向的了解

面試題:說說你對 JS 中 this 指向的了解 JS 的代碼執行環境分為嚴格模式和非嚴格模式,可以通過 use strict 打開嚴格模式,此時 JS 在語法檢查上會更加嚴格。要討論 JS 中的 this 指向問題,也要分為嚴格模式和非嚴格模式進行討論。…

VRRP簡介

一、VRRP 定義概念 VRRP “Virtual Router Redundancy Protocol”即虛擬路由器冗余協議。 一種將多個物理路由器組合成一個虛擬路由器的協議。為了提供網關的冗余備份,提高網絡的可靠性。虛擬路由器擁有虛擬 IP 地址和虛擬 MAC 地址。虛擬信息作為終端設備訪問網絡…

Nextjs使用教程

一.手動創建項目 建議看這個中文網站文檔,這個里面的案例配置都是手動的,也可以往下看我這個博客一步步操作 1.在目錄下執行下面命令,初始化package.json文件 npm init -y2.安裝react相關包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

使用Python操作Redis

大家好,在當今的互聯網時代,隨著數據量和用戶量的爆發式增長,對于數據存儲和處理的需求也日益增加。Redis作為一種高性能的鍵值存儲數據庫,以其快速的讀寫速度、豐富的數據結構支持和靈活的應用場景而備受青睞。本文將介紹Redis數…

貓頭虎分享已解決Bug || Error: ‘fetch‘ is not defined

原創作者: 貓頭虎 作者微信號: Libin9iOak 作者公眾號: 貓頭虎技術團隊 更新日期: 2024年6月6日 博主貓頭虎的技術世界 🌟 歡迎來到貓頭虎的博客 — 探索技術的無限可能! 專欄鏈接: &…

獨立游戲之路 -- 上架TapTap步驟和注意事項

個人開發者游戲上架TapTap上架步驟和注意事項 一、TapTap 介紹二、獨立游戲上架 TapTap 的步驟2.1 創建游戲2.2 提交游戲審核2.3 TapTap 平臺上發布。 三、注意事項3.1 關于備案3.2 遵守 TapTap 的規定3.3 保證游戲質量 四、常見問題4.1 隱私政策問題4.2 先發布還是先優化&…

C語言學習--鏈式結構

結構體的應用: //數據結構與算法 數據結構 ---- 指的是 數據的組織形式 數組 --- 數據結構 數組特點 連續性,有序性,單一性 數據操作(訪問)時的特點 -------------------…

Ubuntu24.04記錄網易郵箱大師的安裝

郵箱大師下載 官網自行下載,下載后文件名“mail.deb" https://dashi.163.com/ 安裝發現缺少依賴 #mermaid-svg-8wqpqFSBVOPD7NGP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8wqpqFSBVOPD7NGP …

PIVOT函數-動態列

一、需求說明 原始表&#xff1a; select * from pathogen_pro; 將pm_name的值轉成對應的列&#xff0c;效果如下 二、PIVOT函數說明 PIVOT(<聚合函數>([聚合列值]) FOR [行轉列前的列名] IN([行轉列后的列名1],[行轉列后的列名2],[行轉列后的列名3],.......[行轉列后…

Julia編程11:變量作用域 Scope of Variables

There are two main types of scopes in Julia, global* scope* and local* scope*. Julia有全局變量作用域和局部變量作用域&#xff0c;函數或者一些結構體、循環體如for等是否內部是局部環境可以參照下表。 ConstructScope typeAllowed withinmodule, baremoduleglobalglo…

.Net 基于.Net8開發的一個Asp.Net Core Webapi后端框架

1.項目結構 該項目是基于.net8開發的Asp.Net Core WebApi后端服務,集成了Efcore,Autofac,Jwt,AutoMapper,Serilog,Quartz,MiniExcel等組件。該框架簡單易上手&#xff0c;沒有額外的學習成本; 該項目采用了多層結構設計&#xff0c;有利于解耦&#xff0c;包含公共層&#xff0…

Linux入門學習指南

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

MySQL數據庫整體知識點簡述

目錄 第一章&#xff1a;數據庫系統概述 第二章&#xff1a;信息與數據模型 第3章 關系模型與關系規范化理論 第四章——數據庫設計方法 第六-七章——MySQL存儲引擎與數據庫操作管理 第九章——索引 第10章——視圖 第11章——MySQL存儲過程與函數 第12章——MySQL 觸…

【SIPMRCP】freeswitch中的transfer和bridge有什么區別

在FreeSWITCH中&#xff0c;transfer和bridge是兩個用于處理通話的不同概念&#xff0c;它們之間的主要區別體現在功能和用途上。以下是關于這兩個概念的清晰解釋和區別&#xff1a; transfer&#xff08;轉移&#xff09; 功能&#xff1a;transfer主要用于將通話從一個目標…

IIS7整合Tomcat9服務器,并搭建ASP+PHP+JSP完整運行環境

本文以Windows Vista系統為例&#xff0c;詳細講解IIS7整合Tomcat服務器&#xff0c;同時支持ASPPHPJSP三種Web動態網頁技術的方法。 Vista系統自帶的IIS版本為7.0&#xff0c;能安裝的IE瀏覽器的最高版本為IE9。IE9也是Vue2前端框架支持的最低瀏覽器版本。 【準備工作】 去微…

【TB作品】msp430g2553單片機,讀取GY-30光強,串口發送

硬件 //GY-30 //SCL–P1.4 //SDA–P1.5 //VCC–3.3V //GND–GND //ADDR–不接 部分程序 #include <msp430.h> #include "gy30.h"void Send_Byte(char data) {while (!(IFG2 & UCA0TXIFG)); // USCI_A0 TX buffer ready?UCA0TXBUF data…

藍橋杯物聯網競賽_STM32L071_20_用printf將數據顯示在OLED上

需求&#xff1a; 第十五屆國賽確實有點變態&#xff0c;顯示部分大概有6個所以需要大量將sprintf與OLED_ShowString配合使用才能顯示相應格式的數據&#xff0c;所以我在想能不能簡化一下這一部分直接用寫好的printf語句將數據顯示到顯示屏上呢&#xff1f; 代碼&#xff1a…

樹--搜索二叉樹

現有一棵結點數目為n的二叉樹&#xff0c;采用二叉鏈表的形式存儲。對于每個結點均有指向左右孩子的兩個指針域&#xff0c;而結點為n的二叉樹一共有n-1條有效分支路徑。那么&#xff0c;則二叉鏈表中存在2n-(n-1)n1個空指針域。那么&#xff0c;這些空指針造成了空間浪費。 例…