一、環境準備
使用opencv庫來實現簡單的計算機視覺。
需要安裝兩個庫:opencv-python和opencv-contrib-python,版本可以自行選擇,注意不同版本的opencv中的某些函數名和用法可能不同
pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simplee
二、讀取圖片文件
1、使用pillow這個庫中的功能
from PIL import Image
aa=Image.open('timg98.jpg')
print(aa)
2、使用opencv中特有的讀取文件的方法?
import cv2 # 讀取的格式是BGR numpy
import matplotlib.pyplot as plt # matplotlib讀取的格式與opencv不同
import numpy as np# '''-------------------讀取圖片----------------------------'''
a = cv2.imread('timg98.jpg')#讀取圖片
# print(a) # NumPy數組,其中存儲了讀取的圖像文件的像素值。
cv2.imshow('tu',a) #顯示圖片。顯示圖片的名稱,顯示的圖片數據。將圖片以窗口的形式顯示,后邊的參數第一個參數是窗口名,第二個參數是保存圖片數據的變量b = cv2.waitKey(0)#這里的waitkey函數是設置將里面的數字為非零數,則是指經過多ms后圖片窗口會關閉,#如果里面的數字為0,則是窗口永久不會關閉,按下任意鍵時才會關閉
# # 當里面的參數設置為0時,waitkey這個函數會返回按下按鍵的ASCII碼的數值print(b) #顯示ASCII的數值,可以對應ASCII的表來查找對應的數值cv2.destroyAllWindows() #摧毀這個窗口,減少內存的占用,上面的waitkey已經關閉了窗口,在這里可以不用寫,但是在一些大的項目中,為了防止內存占用,往往需要添加。# # '''調試模型觀察shape,dtype、size屬性'''print("圖像形狀 (shape):", a.shape) #高、寬、通道數
print("圖像數據類型 (dtype):", a.dtype) #無符號 8 位整數,用于表示像素值的范圍在 0 到 255 之間。
print("圖像大小 (size):", a.size) #表示圖像的大小,通常是一個整數,表示圖像的總像素數,即圖像的高度乘以寬度乘以通道數
3、讀取圖片的灰度圖
c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE)?,其中cv2.IMREAD_GRAYSCALE是設置imread讀取圖片是設置圖片為灰度圖,如果后面設置為0,則顯示彩色圖片,不寫效果也是彩色。
c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE) #讀取圖片
c=cv2.resize(c,(500,500)) #圖片原尺寸過大,所以這里對圖片的大小進行重新設置cv2.imshow("tupian",c) #將圖片以窗口的形式顯示,后邊的參數第一個參數是窗口名,第二個參數是圖片的來源b=cv2.waitKey(0) #這里的waitkey函數是設置將里面的數字為非零數,則是指經過多ms后圖片窗口會關#閉,如果里面的數字為0,則是窗口永久不會關閉,按下任意鍵時才會關閉
# # 當里面的參數設置為0時,waitkey這個函數會返回按下按鍵的ASCII碼的數值print(b) #顯示ASCII的數值,可以對應ASCII的表來查找對應的數值cv2.destroyAllWindows() #摧毀這個窗口,減少內存的占用,上面的waitkey已經關閉了窗口,在這里可#以不用寫,但是在一些大的項目中,為了防止內存占用,往往需要添加print("圖像的形狀:",c.shape)print("圖像的數據類型:",c.dtype)print("圖像的大小:",c.size)#圖片的保存,后面的兩個參數,第一個是圖片保存的位置,第二個是圖片儲存的變量
cv2.imwrite('tupian_gray.jpg',b)
4、視頻文件的讀取
import cv2
# 打開視頻文件
video_capture = cv2.VideoCapture('轉場.mp4') # 攝像頭:0
# 檢查視頻是否成功打開
if not video_capture.isOpened():print("無法打開視頻文件")exit()
# 循環讀取視頻幀
while True:# 逐幀讀取視頻ret, frame = video_capture.read() #ret是布爾值,表示是否成功讀取了幀,frame 是讀取到的幀# 檢查是否成功讀取幀if not ret:break# 將圖像從一種顏色空間轉換為另一種顏色空間。frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 顯示當前幀cv2.imshow('Video', frame)# 檢查用戶是否按下 'esc' 鍵,如果是則退出循環if cv2.waitKey(100) == 27:break
# 釋放資源
video_capture.release()
cv2.destroyAllWindows()
5、區域切割
ROI:區域感興趣(Region of Interest)的縮寫。它指的是圖像或視頻中感興趣的特定區域,需要進行分析或處理。
ROI可以由用戶手動選擇,也可以使用計算機視覺算法自動檢測。
a = cv2.imread(r'./timg98.jpg')
b = a[100:300,100:300] #直接對numpy數組進行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(100000)
cv2.destroyAllWindows()
6、提取RGB顏色通道?
import cv2
# 1. 讀取圖像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取顏色通道
a1 = a[:, :, 0] # 藍色通道(B通道)
a2 = a[:, :, 1] # 綠色通道(G通道)
a3 = a[:, :, 2] # 紅色通道(R通道)
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)
# b 包含藍色通道
# g 包含綠色通道
# r 包含紅色通道
cv2.imshow('result', a2)
# 4. 設置窗口顯示時間,單位為毫秒(這里設置為100秒,可以根據需要調整)
cv2.waitKey(100000)
# 5. 關閉所有窗口
cv2.destroyAllWindows()
注意:我們這里是顯示藍色通道的圖像,但是所顯示的圖片確實灰色的,那是因為只顯示藍色通道時, 實際上是將藍色通道作為亮度值,而將綠色和紅色通道設置為默認的最大值,也就是255。這會導致圖像呈現為灰色。 想要展示只包含藍色通道信息的彩色圖像,可以將圖像中的綠色通道和紅色通道設為0,即移除綠色和紅色,只保留藍色。
7、圖片的復制.copy()
import cv2
a = cv2.imread(r'./timg98.jpg')
# 復制原始圖像以避免更改原始圖像
a_new = a.copy()
a_new[:, :, 1] = 0 # 綠色通道設為0
a_new[:, :, 2] = 0 # 紅色通道設為0
# 創建一個窗口來顯示修改后的圖像,并將其命名為'result'
cv2.imshow('result', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()
?8、合并顏色通道
import cv2
# 1. 讀取圖像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取顏色通道
a1 = a[:, :, 0] # 藍色通道(B通道)
a2 = a[:, :, 1] # 綠色通道(G通道)
a3 = a[:, :, 2] # 紅色通道(R通道)
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)
# b 包含藍色通道 g 包含綠色通道 r 包含紅色通道
# 使用cv2.merge()函數將三個通道重新合并成一個圖像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用這行代碼
cv2.imshow('result', img)
cv2.waitKey(100000)
cv2.destroyAllWindows()
9、圖片修改
1、圖片打碼?
# 圖片打碼
import numpy as npa = cv2.imread(r'./timg98.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩陣賦值必須是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
?2、圖片組合
a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b[200:350,200:350] = a[50:200,100:250]#注意:矩陣的大小必須要統一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()
3、圖片的放縮
cv2.resize
# 用于調整圖像的大小。它有以下幾個參數:
# src:要調整大小的輸入圖像,可以是numpy數組、PIL圖像或其他類型。
# dsize:輸出圖像的大小,可以是一個元組,例如(寬,高),或者使用整數標量來縮放原始圖像。如果dsize為None,則根據scalefx和scalefy縮放原始圖像。
# fx:沿x軸的縮放系數。
# fy:沿y軸的縮放系數。
a = cv2.imread('timg98.jpg')#方法一
a_new = cv2.resize(a,(200,600)) # 寬、高#方法二
# a_new = cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
# print(a.shape) # 高、寬、通道數cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()
10、圖像的運算
1、圖像的加法一
當某位置像素相加得到的數值小于255時,該位置數值為兩圖像的像素值相加之和,
當某位置像素相加得到的數值大于255時,該位置數值將截斷結果并將其減去256,例如相加之后時260,則世紀時260-256=4。
a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
c = a+10 #圖片,
cv2.imshow('yuan',a)
cv2.imshow('a+10',c)
cv2.waitKey(100000)c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(100000)
2、圖像的加法二
???????對于cv2的add()運算,當對圖像a,圖像b進行加法求和時,遵循以下規律
當某位置像素相加得到的數值小于255時,該位置數值為兩圖像的像素值相加之和
當某位置像素相加得到的數值大于255時,該位置數值為255
a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c = cv2.add(a,b) #也可以使用使用
cv2.imshow('a add b',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()
3、圖像的加權運算
就是計算在兩幅圖像的像素值之和時,將每幅圖像的權值考慮進來,可以用公式表示為dst=src1×α+src×β+γ
a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
#
c =cv2.addWeighted(a,0.2,b,0.8,0) # 10:圖像的亮度值(常數),將添加到加權和上
cv2.imshow('addWeighted',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()