Python----計算機視覺處理(opencv:像素,RGB顏色,圖像的存儲,opencv安裝,代碼展示)

一、計算機眼中的圖像

像素

????????像素是圖像的基本單元,每個像素存儲著圖像的顏色、亮度和其他特征。一系列像素組合到一起就形成 了完整的圖像,在計算機中,圖像以像素的形式存在并采用二進制格式進行存儲。根據圖像的顏色不 同,每個像素可以用不同的二進制數表示。

????????日常生活中常見的圖像是RGB三原色圖。RGB圖上的每個點都是由紅(R)、綠(G)、藍(B)三個顏 色按照一定比例混合而成的,幾乎所有顏色都可以通過這三種顏色按照不同比例調配而成。在計算機 中,RGB三種顏色被稱為RGB三通道,根據這三個通道存儲的像素值,來對應不同的顏色。例如,在使 用“畫圖”軟件進行自定義調色時,其數值單位就是像素。

二、RGB顏色

三、計算機中圖像的存儲

????????在計算機中,圖像都是以數組的形式存在的。一個RGB圖像放到內存中就是一個 三維數組,其中第一維表示圖像的寬度,第二維表示圖像的高度,第三維則是圖 像中每一個像素點的RGB三個像素值,但是在OpenCV中像素值的存儲順序是 BGR而不是RGB。

計算機處理圖像本質上就是對三維數組中的像素值進行操作。

四、opencv安裝

pip install opencv-python

官方網址

OpenCV - Open Computer Vision Library

五、圖形繪畫

????????主要功能是生成一個700x700的圖像,其上繪制了網格線和交叉的紅色方塊,并分別提取了該圖像的RGB通道。最后,使用Matplotlib庫顯示了整個圖像和各個分離的通道。

5.1、導入模塊

import cv2  # 導入OpenCV庫,用于圖像處理  
import numpy as np  # 導入NumPy庫,用于數組和矩陣操作  
from matplotlib import pyplot as plt  # 導入Matplotlib庫,用于繪圖  

5.2、創建圖像

創建一個空白的 700x700 彩色圖像

# 創建一個700x700的黑色圖像,包含三個顏色通道(RGB)  
image = np.zeros((700, 700, 3), dtype=np.uint8)  

5.3、為圖像添加色彩

# 使用雙層循環在圖像上繪制網格和交叉的紅色方塊  
for i in range(0, 700, 100):  # 外層循環,步長為100,從0到600  for j in range(0, 700, 100):  # 內層循環,同樣步長為100  # 繪制水平網格線  image[i, :, :] = (255, 255, 255)  # 將第i行的所有像素設為白色  # 繪制垂直網格線  image[:, j, :] = (255, 255, 255)  # 將第j列的所有像素設為白色  # 繪制交叉的紅色方塊  if i != 0 and j != 0 and i != 600 and j != 600 and (i == j or i + j == 600):  image[i:i+100, j:j+100, :] = (0, 0, 255)  # 將指定區域設為紅色  

?另一種方式

for i in range(0, 700, 100):for j in range(0, 700, 100):top_left=(j,i)botton_right=(j+99,i+99)if i!=0 and i!=600  and (i==j or i+j==600):cv2.rectangle(image,top_left,botton_right,(0,0,255),-1)else:cv2.rectangle(image,top_left,botton_right,(255,255,255),1) 

5.4、將BGR轉化為RGB

# 將BGR格式的圖像轉換為RGB格式,以便正確顯示  
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  

5.5、分割RGB通道

# 分離圖像的紅、綠、藍通道  
r, g, b = cv2.split(image_rgb)  

5.6、對三通道進行操作

# 創建三個單獨的通道圖像,初始為全零(黑色)  
blue_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 藍色通道  
green_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 綠色通道  
red_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 紅色通道  # 將分離出的通道放入對應的通道圖像中  
blue_channel[:, :, 0] = b  # 將藍色通道的值放入藍色通道圖像的第一個通道  
green_channel[:, :, 1] = g  # 將綠色通道的值放入綠色通道圖像的第二個通道  
red_channel[:, :, 2] = r  # 將紅色通道的值放入紅色通道圖像的第三個通道  # 將單獨的通道圖像轉換為RGB格式  
blue_channel_rgb = cv2.cvtColor(blue_channel, cv2.COLOR_BGR2RGB)  
green_channel_rgb = cv2.cvtColor(green_channel, cv2.COLOR_BGR2RGB)  
red_channel_rgb = cv2.cvtColor(red_channel, cv2.COLOR_BGR2RGB)  

5.7、通過matplotlib顯示圖像

plt.subplot(232)  # 在2行3列的網格中,放置第2個子圖(1-indexed)  
plt.imshow(image_rgb)  # 顯示原始的RGB圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(234)  # 在2行3列的網格中,放置第4個子圖  
plt.imshow(blue_channel_rgb)  # 顯示藍色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(235)  # 在2行3列的網格中,放置第5個子圖  
plt.imshow(green_channel_rgb)  # 顯示綠色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(236)  # 在2行3列的網格中,放置第6個子圖  
plt.imshow(red_channel_rgb)  # 顯示紅色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.tight_layout()  # 自動調整子圖參數,以便給子圖留出更合適的空間  
plt.show()  # 顯示所有繪制的圖像  

5.8、通過cv顯示圖像

cv2.imshow('image_rgb', image)  cv2.waitKey(0)  # 等待用戶按鍵

5.9、完整代碼?

import cv2  # 導入OpenCV庫,用于圖像處理  
import numpy as np  # 導入NumPy庫,用于數組和矩陣操作  
from matplotlib import pyplot as plt  # 導入Matplotlib庫,用于繪圖  # 創建一個700x700的黑色圖像,包含三個顏色通道(RGB)  
image = np.zeros((700, 700, 3), dtype=np.uint8)  # 使用雙層循環在圖像上繪制網格和交叉的紅色方塊  
for i in range(0, 700, 100):  # 外層循環,步長為100,從0到600  for j in range(0, 700, 100):  # 內層循環,同樣步長為100  # 繪制水平網格線  image[i, :, :] = (255, 255, 255)  # 將第i行的所有像素設為白色  # 繪制垂直網格線  image[:, j, :] = (255, 255, 255)  # 將第j列的所有像素設為白色  # 繪制交叉的紅色方塊  if i != 0 and j != 0 and i != 600 and j != 600 and (i == j or i + j == 600):  image[i:i+100, j:j+100, :] = (0, 0, 255)  # 將指定區域設為紅色  # 將BGR格式的圖像轉換為RGB格式,以便正確顯示  
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 分離圖像的紅、綠、藍通道  
r, g, b = cv2.split(image_rgb)  # 創建三個單獨的通道圖像,初始為全零(黑色)  
blue_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 藍色通道  
green_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 綠色通道  
red_channel = np.zeros((700, 700, 3), dtype=np.uint8)  # 紅色通道  # 將分離出的通道放入對應的通道圖像中  
blue_channel[:, :, 0] = b  # 將藍色通道的值放入藍色通道圖像的第一個通道  
green_channel[:, :, 1] = g  # 將綠色通道的值放入綠色通道圖像的第二個通道  
red_channel[:, :, 2] = r  # 將紅色通道的值放入紅色通道圖像的第三個通道  # 將單獨的通道圖像轉換為RGB格式  
blue_channel_rgb = cv2.cvtColor(blue_channel, cv2.COLOR_BGR2RGB)  
green_channel_rgb = cv2.cvtColor(green_channel, cv2.COLOR_BGR2RGB)  
red_channel_rgb = cv2.cvtColor(red_channel, cv2.COLOR_BGR2RGB)  # 使用Matplotlib繪制圖像  
plt.subplot(232)  # 在2行3列的網格中,放置第2個子圖(1-indexed)  
plt.imshow(image_rgb)  # 顯示原始的RGB圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(234)  # 在2行3列的網格中,放置第4個子圖  
plt.imshow(blue_channel_rgb)  # 顯示藍色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(235)  # 在2行3列的網格中,放置第5個子圖  
plt.imshow(green_channel_rgb)  # 顯示綠色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.subplot(236)  # 在2行3列的網格中,放置第6個子圖  
plt.imshow(red_channel_rgb)  # 顯示紅色通道圖像  
plt.axis('off')  # 關閉坐標軸  plt.tight_layout()  # 自動調整子圖參數,以便給子圖留出更合適的空間  
plt.show()  # 顯示所有繪制的圖像  # 使用OpenCV顯示原始圖像(BGR格式)  
cv2.imshow('image_rgb', image)  cv2.waitKey(0)  # 等待用戶按鍵

六、庫函數

6.1、cvtColor()

????????將圖像從一個色彩空間轉換為另一個色彩空間。

????????該函數將輸入圖像從一個色彩空間轉換為另一個色彩空間。在從 RGB 色彩空間轉換的情況下,應明確指定通道的順序(RGB 或 BGR)。請注意,OpenCV 中的默認顏色格式通常稱為 RGB,但實際上是 BGR(字節是相反的)。因此,標準 (24 位) 彩色圖像中的第一個字節將是 8 位藍色分量,第二個字節將是綠色,第三個字節將是紅色。然后,第 4 個、第 5 個和第 6 個字節將是第二個像素(藍色、綠色、紅色),依此類推。

R、G 和 B 通道值的常規范圍為:

  • 0 到 255 表示CV_8U圖像
  • 0 到 65535(CV_16U圖像
  • 0 到 1 表示CV_32F圖像
cv.cvtColor(	src, code[, dst[, dstCn[, hint]]]	) ->	dst
函數描述
src輸入圖像:8 位無符號、16 位無符號 ( CV_16UC... ) 或單精度浮點。
dst輸出圖像的大小和深度與 src 相同。
code色彩空間轉換代碼
dstCn目標圖像中的通道數;如果參數為 0,則 Channels 的數量會自動從 src 和 code 中得出。
hint實現修改標志
COLOR_BGR2GRAY
Python:cv.COLOR_BGR2GRAY

在 RGB/BGR 和灰度之間轉換,顏色轉換

COLOR_BGR2RGBA
Python:cv.COLOR_BGR2RGBA

在 RGB 和 BGR 色彩空間之間轉換(帶或不帶 Alpha 通道)

COLOR_BGR2BGR565
Python:cv.COLOR_BGR2BGR565

在 RGB/BGR 和 BGR565 之間轉換(16 位圖像)

6.2、?拆分和合并圖像通道

????????有時,您需要單獨處理圖像的 B、G、R 通道。在這種情況下,您需要將 BGR 圖像拆分為單個通道。在其他情況下,您可能需要加入這些單獨的通道以創建 BGR 圖像。您可以簡單地通過以下方式執行此作:

>>> b,g,r = cv.split(img)
>>> img = cv.merge((b,g,r))

假設您要將所有紅色像素設置為零 - 您無需先拆分通道。Numpy 索引更快:

>>> img[:,:,2] = 0

?6.3、imshow()

????????在指定窗口中顯示圖像。

????????函數 imshow 在指定窗口中顯示圖像。如果窗口是使用?cv::WINDOW_AUTOSIZE?標志創建的,則圖像將以其原始大小顯示,但它仍受屏幕分辨率的限制。否則,將縮放圖像以適合窗口。

cv.imshow(	winname, mat	) ->	None
函數描述
winname窗口的名稱
mat要顯示的圖像。

注意

此函數后應調用?cv::waitKey?或?cv::p ollKey?來執行 GUI 內務處理任務,這些任務是實際顯示給定圖像并使窗口響應鼠標和鍵盤事件所必需的。否則,它不會顯示圖像,并且窗口可能會鎖定。例如,waitKey(0)?將無限顯示窗口,直到任意一個鍵(適合圖像顯示)。waitKey(25)?將顯示一個幀,并等待大約 25 ms 的按鍵作(適用于逐幀顯示視頻)。要刪除窗口,請使用?cv::d estroyWindow。

[僅限 Windows 后端]按 Ctrl+C 會將圖像復制到剪貼板。按 Ctrl+S 將顯示一個對話框以保存圖像。

[僅限 Wayland 后端]支持格式已擴展。

  • 如果圖像是 8 位簽名的,則像素將偏移 128。也就是說,值范圍 [-128,127] 映射到 [0,255]。
  • 如果圖像是 16 位簽名的,則像素將除以 256 并偏移 128。也就是說,值范圍 [-32768,32767] 映射到 [0,255]。

6.4、waitKey()

????????等待按下的鍵。

????????函數 waitKey 無限等待 key 事件(當delay < 0)或 delay 毫秒數(當它為正數時)。由于作系統在切換線程之間有最短時間,因此該函數不會完全等待延遲毫秒,它至少會等待延遲毫秒,具體取決于當時計算機上正在運行的其他內容。它返回所按下的鍵的代碼,如果在指定時間過去之前沒有按下任何鍵則返回 -1。要檢查是否按下了某個鍵但不等待它,請使用 polKey。

cv.waitKey([, delay]) ->retval
函數描述
delay延遲(以毫秒為單位)。0 是表示 “永遠” 的特殊值。

注意

函數?waitKey?和?pollKey?是 HighGUI 中唯一可以獲取和處理 GUI 事件的方法,因此需要定期調用其中一個函數以進行正常的事件處理,除非在負責事件處理的環境中使用 HighGUI。

僅當至少創建了一個 HighGUI 窗口并且該窗口處于活動狀態時,該功能才有效。如果有多個 HighGUI 窗口,則其中任何一個窗口都可以處于活動狀態。

6.5、rectangle()

cv.rectangle(	img, pt1, pt2, color[, thickness[, lineType[, shift]]]	) ->	img
cv.rectangle(	img, rec, color[, thickness[, lineType[, shift]]]	) ->	img
函數描述
img圖像。
pt1矩形的頂點。
pt2與 pt1 相對的矩形的頂點。
color矩形顏色或亮度(灰度圖像)。
thickness構成矩形的線條的粗細。負值(如?FILLED)表示函數必須繪制填充矩形
lineType線路的類型。
shift點坐標中的小數位數。

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

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

相關文章

SQLiteStudio:一款免費跨平臺的SQLite管理工具

SQLiteStudio 是一款專門用于管理和操作 SQLite 數據庫的免費工具。它提供直觀的圖形化界面&#xff0c;簡化了數據庫的創建、編輯、查詢和維護&#xff0c;適合數據庫開發者和數據分析師使用。 功能特性 SQLiteStudio 提供的主要功能包括&#xff1a; 免費開源&#xff0c;可…

【軟考網工-實踐篇】DHCP 動態主機配置協議

一、DHCP簡介 DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff0c;動態主機配置協議。 位置&#xff1a;DHCP常見運行于路由器上&#xff0c;作為DHCP服務器功能&#xff1a;用于自動分配IP地址及其他網絡參數給網絡中的設備作用&#xff1a;簡化網絡管理&…

【Linux學習筆記】Linux用戶和文件權限的深度剖析

【Linux學習筆記】Linux用戶和文件權限的深度剖析 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 前言 文章目錄 【Linux學習筆記】Linux用戶和文件權限的深度剖析前言一. Linux權限管理1.1 文件訪問者的分類&#xff08;人)…

Centos離線安裝openssl-devel

文章目錄 Centos離線安裝openssl-devel1. openssl-devel是什么&#xff1f;2. openssl-devel下載地址3. openssl-devel安裝4. 安裝結果驗證 Centos離線安裝openssl-devel 1. openssl-devel是什么&#xff1f; openssl-devel 是 Linux 系統中與 OpenSSL 加密庫相關的開發包&…

深度學習篇---Opencv中Haar級聯分類器的自定義

文章目錄 1. 準備工作1.1安裝 OpenCV1.2準備數據集1.2.1正樣本1.2.2負樣本 2. 數據準備2.1 正樣本的準備2.1.1步驟2.1.2生成正樣本描述文件2.1.3示例命令2.1.4正樣本描述文件格式 2.2 負樣本的準備2.2.1步驟2.2.2負樣本描述文件格式 3. 訓練分類器3.1命令格式3.2參數說明 4. 訓…

Smart Time Plus smarttimeplus-MySQLConnection SQL注入漏洞(CVE-2024-53544)

免責聲明 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x01…

58.Harmonyos NEXT 圖片預覽組件架構設計與實現原理

溫馨提示&#xff1a;本篇博客的詳細代碼已發布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下載運行哦&#xff01; Harmonyos NEXT 圖片預覽組件架構設計與實現原理 文章目錄 Harmonyos NEXT 圖片預覽組件架構設計與實現原理效果預覽一、組件架構概述1. 核心組件層…

虛擬機下ubuntu進不了圖形界面

6.844618] piix4_smbus 0000:07.3: SMBus Host ContrFoller not enabled! 7.859836] sd 2:0:0:0:0: [sda] Assuming drive cache: wirite through /dev/sda1: clean, 200424/1966080 files, 4053235/7864064 blocks ubuntu啟動時&#xff0c;卡在上面輸出位置 當前遇到的原因…

Appium高級操作--從源碼角度解析--模擬復雜手勢操作

書接上回&#xff0c;Android自動化--Appium基本操作-CSDN博客文章瀏覽閱讀600次&#xff0c;點贊10次&#xff0c;收藏5次。書接上回&#xff0c;上一篇文章已經介紹了appium在Android端的元素定位方法和識別工具Inspector&#xff0c;本次要介紹使用如何利用Appium對找到的元…

SpringBoot學生宿舍管理系統的設計與開發

項目概述 幽絡源分享的《SpringBoot學生宿舍管理系統的設計與開發》是一款專為校園宿舍管理設計的智能化系統&#xff0c;基于SpringBoot框架開發&#xff0c;功能全面&#xff0c;操作便捷。該系統涵蓋管理員、宿管員和學生三大角色&#xff0c;分別提供宿舍管理、學生信息管…

愛普生溫補晶振 TG5032CFN高精度穩定時鐘的典范

在科技日新月異的當下&#xff0c;眾多領域對時鐘信號的穩定性與精準度提出了極為嚴苛的要求。愛普生溫補晶振TG5032CFN是一款高穩定性溫度補償晶體振蕩器&#xff08;TCXO&#xff09;。該器件通過內置溫度補償電路&#xff0c;有效抑制環境溫度變化對頻率穩定性的影響&#x…

【原創】在高性能服務器上,使用受限用戶運行Nginx,充當反向代理服務器[未完待續]

起因 在公共高性能服務器上運行OllamaDeepSeek&#xff0c;如果按照默認配置啟動Ollama程序&#xff0c;則自己在遠程無法連接你啟動的Ollama服務。 如果修改配置&#xff0c;則會遇到你的Ollama被他人完全控制的安全風險。 不過&#xff0c;我們可以使用一個方向代理&#…

Bash和Zsh的主要差異是?

Bash&#xff08;GNU Bourne-Again Shell&#xff09; 和 Zsh&#xff08;Z Shell&#xff09; 都是功能強大的Unix/Linux Shell&#xff0c;廣泛用于交互式使用和腳本編寫。 盡管它們有很多相似之處&#xff0c;但在功能、語法、配置選項等方面也存在一些顯著的區別。 是Bas…

芯科科技推出的BG29超小型低功耗藍牙?無線SoC,是藍牙應用的理想之選

具有擴大的內存和超低功耗特性的超小型BG29是互聯健康設備的理想之選 低功耗無線領域內的領導性創新廠商Silicon Labs&#xff08;亦稱“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;今日宣布&#xff1a;推出全新的第二代無線開發平臺產品BG29系列無線片上系統…

【數據挖掘】知識蒸餾(Knowledge Distillation, KD)

1. 概念 知識蒸餾&#xff08;Knowledge Distillation, KD&#xff09;是一種模型壓縮和知識遷移技術&#xff0c;旨在將大型復雜模型&#xff08;稱為教師模型&#xff09;中的知識傳遞給一個較小的模型&#xff08;稱為學生模型&#xff09;&#xff0c;以減少計算成本&…

選型消息隊列(MQ):ActiveMQ、RabbitMQ、RocketMQ、Kafka對比

選型消息隊列&#xff08;MQ&#xff09;&#xff1a;ActiveMQ、RabbitMQ、RocketMQ、Kafka對比 選型消息隊列&#xff08;MQ&#xff09;1. 引言2. 消息隊列核心指標3. MQ 技術對比分析4. 詳細分析及案例4.1 ActiveMQ&#xff1a;傳統企業級 MQ 方案4.2 RabbitMQ&#xff1a;高…

AWK 入門教程:強大的文本處理工具

AWK 是一種強大的文本處理工具&#xff0c;廣泛用于 Linux/Unix 系統中對文本文件或數據流進行操作。它能夠基于條件篩選、統計字段、重新排列數據等。主要特點包括&#xff1a; 2. AWK 的基本語法 2.1 AWK 程序的結構 AWK 程序的結構: awk pattern { action } file 2.2 常…

mysql select distinct 和 group by 哪個效率高

在有索引的情況下&#xff0c;SELECT DISTINCT和GROUP BY的效率相同&#xff1b;在沒有索引的情況下&#xff0c;SELECT DISTINCT的效率高于GROUP BY?。這是因為SELECT DISTINCT和GROUP BY都會進行分組操作&#xff0c;但GROUP BY可能會進行排序&#xff0c;觸發filesort&…

使用conda將python環境打包,移植到另一個linux服務器項目中

問題&#xff1a;因為新的服務器A不能聯網&#xff0c;導致離線pip install包耗時耗力&#xff0c;舊的服務器B中的Anaconda和A中是同一個版本&#xff0c;有現成的python環境&#xff0c;并且服務器B可以聯網&#xff0c;現想將B中的環境&#xff0c;直接移植到A中使用。 解決…

晶晨S905M/晶晨S905L2芯片-原機安卓4升級安卓7.1.2-通刷線刷固件包

晶晨S905M&#xff0f;晶晨S905L2芯片-原機安卓4升級安卓7.1.2-通刷線刷固件包 線刷方法&#xff1a;&#xff08;新手參考借鑒一下&#xff09; 1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b; 2、電腦上安裝好…