Python----計算機視覺處理(opencv:像素,RGB顏色,圖像的存儲,opencv安裝,代碼展示)
Python----計算機視覺處理(Opencv:圖片顏色識別:RGB顏色空間,HSV顏色空間,掩膜)
Python----計算機視覺處理(Opencv:ROI圖像切割)
一、圖像的多種屬性
????????圖像的多種屬性 圖像處理涉及到多種屬性,這些屬性可以幫助我們分析和理解圖像的內 容。以下是圖像的一些常見屬性,它們在圖像分類、分割、增強等任務中都起到了至關重要 的作用。
1.1、圖像分類
1.1.1、二值圖像
????????二值圖像表示的意思就是每一個像素點只由0和1構成,0表示黑色,1表示白色,而且這里 的黑色和白色是純黑和純白。
1.1.2、灰度圖像
????????灰度圖像就是一個8位的位圖。什么意思呢?就是說00000001一直到11111111,這就是二 進制表示。如果表示成我們常用的十進制就是0-255。其中0就表示純黑色,255就表示純白 色,中間就是處于純黑色到純白色的相關顏色。
1.1.3、彩色圖像
????????計算機中所有的顏色都可以由R(紅色通道)、G(綠色通道)、B(藍色通道)來組成,其 中每一個通道都有0-255個像素顏色組成。比如說R=234,G=252,B=4就表示黃色。顯示 出來的也是黃色。所以說彩色圖像由三個面構成,分別對應R,G,B。
1.2、顏色屬性
1.2.1、顏色空間
?圖像的顏色可以用不同的顏色空間表示,常見的顏色空間包括:
????????RGB:紅色、綠色和藍色三個通道組成,適用于顯示設備。
????????HSV:色調、飽和度和亮度組成,適用于圖像分割任務。
????????Grayscale(灰度):沒有顏色信息,僅有亮度信息。
????????YCbCr:亮度(Y)和色差(Cb、Cr)分量,常用于視頻編碼。
1.2.2、色調(Hue)
色調是指顏色的種類,通常用于描述色彩本身的感知。例如,紅色、綠色、藍色等。
????????飽和度(Saturation) 飽和度表示顏色的強度或純度,飽和度越高,顏色越鮮艷。
????????亮度(Brightness / Value) 亮度表示顏色的明亮程度,通常用于描述光的強度。
1.3、?幾何屬性
????????尺寸(Size) 圖像的寬度和高度,通常以像素為單位。
????????分辨率(Resolution) 圖像的清晰度,通常由每英寸的像素數(DPI)來表示。較高的 分辨率意味著圖像的細節更多。
????????比例(Aspect Ratio) 圖像寬高的比例,影響圖像的呈現效果和視覺感受。
常見比例:
????????1:1(正方形)
????????4:3(標準電視和舊型電視屏幕比例)
????????16:9(寬屏)
????????3:2(數碼相機和手機照片比例)
????????21:9(超寬屏)
1.4、紋理屬性
????????紋理(Texture)是指圖像中表面特征的模式或結構,它描述了圖像中的細節,如粗糙、平 滑、條紋、波紋等。
紋理的特點:
????????平滑或粗糙:圖像的表面可能是平滑的,也可能是粗糙的。平滑的紋理通常表示圖像中像素值變化較小,粗糙的紋理表示像素值變化較 大。
????????重復性:紋理常常呈現規律性或重復模式,像是平鋪的磚塊、樹皮的紋路等。通過重復性,計算機可以通過算法來識別出特定的紋理。
????????方向性:紋理可能具有一定的方向性,例如條紋、波紋等。方向性紋理的分析能夠提供圖像中物體或區域的結構信息。
????????尺度:紋理的特征可能在不同的尺度上有所不同。某些紋理可能在大尺度下清晰可見,而在小尺度下則難以辨認。
二、RGB與BGR色彩空間
????????OpenCV和PIL讀取圖片的格式分別是BGR和RGB。
????????OpenCV默認通道是BGR的。這是OpenCV的入門大坑之一,BGR是個歷史遺留問題, 為了兼容早年的某些硬件,OpenCV也不好改回來了。
安裝PIL
????????PIL 軟件包提供了基本的圖像處理功能,如:改變圖像大小,旋轉圖像,圖像格式轉換,色 場空間轉換,圖像增強,直方圖處理,插值和濾波等等。????????
pip install Pillow
import cv2
from PIL import Image
import numpy as npimg1=cv2.imread('./images/parrot.png')img2=np.array(Image.open('./images/parrot.png'))print('cv',img1[:10])
'''
cv [[[ 96 142 150][ 87 134 142][ 81 134 144]
'''
print('Image',img2[:10])
'''
Image [[[150 142 96][142 134 87][144 134 81]
'''
如何將RGB與BGR進行轉換
????????顏色變換是imgproc模塊中一個常用的功能。我們生活中大多數看到的彩色圖片都是RGB類 型的,但是在進行圖像處理時需要用到灰度圖、二值圖、HSV、HSI等顏色制式,OpenCV 提供了cvtColor0函數來實現這些功能。
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
三、HSB、HSV與HSL
3.1、RGB 的局限性
????????RGB 是我們接觸最多的顏色空間,由三個通道表示一幅圖像,分別為紅色(R),綠色(G)和藍 色(B)。
理由:
????????與人眼感知不完全匹配
????????無法準確表示所有顏色
????????色彩調節不直觀
????????設備依賴性強
3.2、HSB、HSV與HLS概念定義
????????HSB 和 HSV 基本上是相同的,差異主要是在命名上,而實際應用中,HSB 有時用來表示與 光的亮度相關的概念。
HSB 為 色相,飽和度,明度;
HLS 為 色相,飽和度,亮度,
HSV 為 色相,飽和度,明度。
H : 指的是色相(Hue),就是顏色名稱,例如“紅色”、“藍色”,、“綠色”;
S : 指的是飽和度(Saturation),即顏色的純度;
L : (Lightness) 和 B(Brightness)是明度,顏色的明亮程度
import cv2img1=cv2.imread('./images/parrot.png')
img2=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img3=cv2.cvtColor(img1,cv2.COLOR_BGR2HLS)
img4=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)cv2.imshow('BGR',img1)
cv2.imshow('RGB',img2)
cv2.imshow('HLS',img3)
cv2.imshow('HSV',img4)
cv2.waitKey(0)
四、ROI區域
????????在圖像處理過程中,我們可能會對圖像的某一個特定區域感興趣,該區域被稱為感興趣區域 (Region of Interest,ROI)。在設定感興趣區域 ROI 后,就可以對該區域進行整體操 作。在機器視覺、圖像處理等領域,ROI是一個重要的概念,常用于目標檢測、圖像分割和 物體跟蹤等任務中。
4.1、切片操作
????????Python 中的切片操作允許你從數組中提取子數組(子圖像)。切片的語法是[startend,意味著從 start 開始,到 end-1 結束。
roi = img[20:230, 130:300, :]
20:230 :提取圖像的行范圍。這里表示從第 20 行到第 230 行(包含 20 行,直到 229 行),這是從圖像中提取的垂直區域 (即圖像的高度部分)。
130:300 :提取圖像的列范圍。這里表示從第 130 列到第 300 列(包含 130 列,直到 299 列),這是從圖像中提取的水平區域 (即圖像的寬度部分)。
: :這表示所有的通道。即不限制顏色通道,提取所有的顏色通道(通常是 BGR,即藍色、綠色、紅色三個通道)。
4.2、ROI
import cv2# 讀取圖像
img = cv2.imread('./images/ROI.png')# 打印圖像的形狀(高度、寬度、通道數)
# 例如:(400, 600, 3) 表示高400像素,寬600像素,3個顏色通道(BGR)
print(img.shape)# 將圖像特定區域的藍色通道(索引為0)設置為0
# 區域定義:從行20到行229,從列130到列299
# [20:230] 表示從第20行開始,到第230行(不包含230行)
# [130:300] 表示從第130列開始,到第300列(不包含300列)
# [0] 表示藍色通道(OpenCV默認是BGR順序,所以0是藍色)
img[20:230, 130:300, 0] = 0# 提取圖像的感興趣區域(Region of Interest, ROI)
# 這個ROI是原始圖像中藍色通道被設置為0的同一塊區域
roi = img[20:230, 130:300, :]# 創建ROI的副本
# 這一步很重要,因為如果不使用.copy(),那么對roi的修改也會影響到原始的img圖像
roi = roi.copy()# 將ROI的所有像素的藍色通道設置為0
# 這一操作會使得提取出來的ROI圖像的藍色部分完全消失
roi[:, :, 0] = 0# 顯示修改后的原始圖像(其中一個區域的藍色通道被清除了)
cv2.imshow('images', img)# 顯示提取并修改后的ROI圖像(整個ROI的藍色通道被清除了)
cv2.imshow('roi', roi)# 等待按鍵,0表示無限等待,直到用戶按下任意鍵
cv2.waitKey(0)# 銷毀所有OpenCV創建的窗口
cv2.destroyAllWindows()
五、通道的分割與合并
????????在圖像處理中,通道是圖像數據的重要組成部分。例如,彩色圖像通常由三個通道(RGB 或 BGR)組成,每個通道表示一種顏色分量。在某些場景中,我們可能需要對單個通道進 行操作,這就需要用到 OpenCV 的通道分割與通道合并功能。????????
?5.1、分割通道
????????分割圖像的通道指的是將原始圖像的不同顏色通道提取出來,通常可以通過 csplit0 來完成。
5.2、合并通道
????????將分割出的通道重新合并成一個完整的圖像,可以使用cv.merge()
import cv2
import numpy as np# 讀取圖像
img1 = cv2.imread('./images/parrot.png')# 分離圖像通道
B, G, R = cv2.split(img1)# 創建空白圖像(與原圖尺寸相同)
# np.zeros_like(img1) 創建一個與 img1 形狀和數據類型相同的全零數組。
blank = np.zeros_like(img1)# 創建只包含藍色通道的圖像
# 我們將藍色通道 (B) 與兩個零通道合并,以創建一個只包含藍色信息的圖像。
blue_img = cv2.merge([B, np.zeros_like(B), np.zeros_like(B)])# 創建只包含綠色通道的圖像
# 類似地,我們創建只包含綠色通道的圖像。
green_img = cv2.merge([np.zeros_like(G), G, np.zeros_like(G)])# 創建只包含紅色通道的圖像
# 這是紅色通道的圖像。
red_img = cv2.merge([np.zeros_like(R), np.zeros_like(R), R])# 顯示原始圖像
cv2.imshow('Original Image', img1)# 顯示藍色通道圖像
cv2.imshow('Blue Channel', blue_img)# 顯示綠色通道圖像
cv2.imshow('Green Channel', green_img)# 顯示紅色通道圖像
cv2.imshow('Red Channel', red_img)# 顯示合并后的圖像 (與原始圖像相同)
img2 = cv2.merge([B, G, R])
cv2.imshow('Merged Image', img2)# 等待按鍵
cv2.waitKey(0)# 銷毀所有OpenCV窗口
cv2.destroyAllWindows()