文章目錄
- 處理流程
- 顏色空間
- 二值圖像
- 攝像頭
python圖像處理教程:初步📷插值變換📷形態學處理📷濾波
處理流程
opencv是跨平臺圖像處理庫,為許多編程語言提供了接口,Python自然在列,但在使用pip安裝時需要注意install的是【opencv-python】。
作為專業的圖像處理庫,opencv自然也提供了讀取、處理、顯示以及保存圖片的全流程功能,其初步使用如下
import cv2path = 'lena.jpg'
img=cv2.imread(path)
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)cv2.imshow("img",img)
cv2.imshow("gray",img_gray)cv2.waitKey(0)
cv2.destroyAllWindows()
其中
- imread用于讀取圖片。
- cvtColor用于轉換圖片的色彩空間,【COLOR_RGB2GRAY】表示將RGB圖像轉換為灰度圖像。
- imshow用于顯示圖片,其兩個輸入分別是窗口名稱與將要顯示的圖像。
- waitKey 等待按下鍵盤,輸入為等待時間,為0則表示不接受按鍵。
- destroyAllWindows 用于關閉所有窗口。
彈出窗口如下。
顏色空間
在opencv中,通過cvtColor函數可以完成色彩空間的轉換,其輸入參數分別是待轉換圖像和轉換方法,其轉換方法是已經整形常量,其變量名稱類似于【RGBA2GRAY】,2即To,表示從一種顏色空間轉向另一種。
GRAY即灰度圖像,只有一個通道,除此之外,opencv還提供了許多種顏色空間,下面列舉三種。
人類對顏色的感知,主要是通過紅、綠、藍這三種感光細胞實現的,正因如此,RGB格式的圖像才如此普遍地被接受。如果再加上透明通道Alpha,則構成RGBA格式的圖像。在opencv中,其通道順序并不一定全都是紅綠藍,也可能是藍綠紅,即BGR。
但是,人類并不能感知不同顏色疊加前后的關聯,即我們所認知的色彩并不能簡單地被三原色直觀地表示。為此出現了另一種顏色空間,即HSV,這三個字母分別表示色相、飽和度以及明度。
如果進一步研究人類對顏色的感知,可以將色彩空間分為兩個相互正交的色調,即紅綠色軸(a)和藍黃軸(b),通過這兩個通道就可以表示所有的顏色,再加上亮度值L,就構成了Lab色彩空間。
二值圖像
從顏色空間的定義來說,黑白圖像也應位列其中,只不過這個空間過于狹窄,只有黑白兩個數值。而其轉換方式也很簡單,只需設置一個閾值 T T T,讓像素灰度大于 T T T的置為白色,否則置為黑色,若 T T T不同,則轉換結果不同。
由于多了一個參數,故而opencv并未將其作為一種轉換類型,而是提供了另一個專用的二值化函數threshold,這個函數通過指定閾值和二值化類型,以實現從灰度圖到二值圖像的轉換,當閾值不同時,lena圖的二值化情況如下
bImgs = {}
for th in [50, 100, 150]:ret, bImg = cv2.threshold(img_gray, th, 255, cv2.THRESH_BINARY)bImgs[f"th={th}"] = bImgfor i,key in enumerate(bImgs,1):cv2.namedWindow(key, cv2.WINDOW_NORMAL)cv2.resizeWindow(key, 256, 256)cv2.moveWindow(key, 256*i, 300)cv2.imshow(key, bImgs[key])cv2.waitKey(0)
threshold的輸入參數分別是灰度圖像、閾值、默認值以及二值化類型,【THRESH_BINARY】表示,當灰度值小于閾值時置0,大于閾值時設為默認值,在本例中就是255。
此外,在打開多個窗口時,用到了resizeWindow和moveWindow來更改窗口尺寸以及移動窗口。
攝像頭
除了打開圖像文件之外,在opencv中還可以創建VideoCapture對象,可以讀取攝像頭。下面就打開電腦自帶的相機,并將其影像二值化之后展示,效果如下
繪圖代碼如下。
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
flag = cap.isOpened()
index = 1
while (flag):ret, frame = cap.read()gray = cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)ret, bImg = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY)cv2.imshow("camera", bImg)k = cv2.waitKey(1) & 0xFFif k == ord('s'):cv2.imwrite(f"{index}.jpg", bImg)print(f"save{index}.jpg successfuly!")index += 1elif k == ord('q'):breakcap.release()
cv2.destroyAllWindows()
其中,cap即為VideoCapture對象,cap.read用于讀取當前幀,其返回值ret是一個成功判定符,frame即為抓取到的圖像。在讀取圖像之后,將其轉灰度,并進行二值化,最后在"camera"窗口中顯示。
接下來捕捉按鍵,當檢測到按下【s】時,調用imwrite保存圖像;當檢測到【q】時,退出窗口。