OpenCV圖像預處理常用函數(shù)及流程
1.OpenCV環(huán)境配置
在PyCharm終端中,運行如下命令
pip install opencv-python # 安裝opencv包
pip install opencv-contrib-python # 安裝opencv輔助包
由于默認使用的為外網(wǎng)資源,下載速度和穩(wěn)定性較差,具體看網(wǎng)絡狀態(tài)。如下命令為使用清華鏡像下載安裝相應的包
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple # 安裝opencv包
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple # 安裝opencv輔助包
在終端中運行命令時,Windows10系統(tǒng)可能會存在如下報錯:無法加載激活文件,因此在此系統(tǒng)上禁止運行腳本。此情況是因為windows新的權(quán)限執(zhí)行策略的改變,需要在PowerShell中進行權(quán)限的更改??赏ㄟ^開始菜單欄找到Windows PowerShell。注意使用以管理員身份運行,否則無法更改執(zhí)行策略。
在PowerShell中執(zhí)行如下命令:
Get-ExecutionPolicy
如果輸出值為
Restricted
則表明目前系統(tǒng)上禁止運行沒有數(shù)字簽名的腳本。需要運行如下命令,將執(zhí)行策略更改為remotesigned模式
Set-ExecutionPolicy Bypass
之后重啟Pycharm,重新執(zhí)行OpenCV的安裝命令即可。
2.圖像預處理流程及對應函數(shù)
OpenCV英文官方文檔鏈接:OpenCV: OpenCV-Python Tutorials
OpenCV中文文檔:OpenCV官方文檔_w3cschool
OpenCV中文文檔:OpenCV中文官方文檔 (woshicver.com)文章來源:http://www.zghlxwxcb.cn/news/detail-446842.html
(1)圖像讀取與顏色空間轉(zhuǎn)換
img_bgr = cv2.imread("1.jpg") # 讀取彩色圖像,在OpenCV中,圖像以BGR形式存儲
img_gray = cv2.imread("1.jpg", cv2.IMREAD_GRAYSCALE) # 讀取灰度圖像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV) # 顏色空間的轉(zhuǎn)換,從BGR轉(zhuǎn)換為HSV
img_gray1 = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) # 顏色空間的轉(zhuǎn)換,從BGR轉(zhuǎn)換為GRAY
(2)圖像的顯示
cv2.imshow("img_bgr", img_bgr) # 顯示圖像,參數(shù)分別為窗口名稱以及圖像變量
cv2.waitKey(0) # 圖像顯示時長,0表示等待鍵盤操作
cv2.destroyAllWindows() # 顯示結(jié)束,銷毀窗口
(3)圖像基本屬性
# 圖像的高度和寬度
img_bgr.shape # (1106, 656, 3) 返回結(jié)果時一個tuple類型,第一個數(shù)字表示圖像的高度,第二個數(shù)字表示圖像的寬度,第三個數(shù)字表示圖像的通道數(shù),BGR為3個通道,GRAY為2個通道
h,w = img_bgr.shape[:2] # (1106, 656)
# 獲取圖像的圖層信息
img_b = img_bgr[:, :, 0] # B通道
img_g = img_bgr[:, :, 1:2] # G通道
img_r = img_bgr[:, :, 2:3] # R通道
# 圖像的size
img_bgr.size # 2176608 即1106*656*3
# 直接獲取圖像的局部信息
img_bgr[0:100,0:500] # 沿h方向0到100,沿w方向0到500的范圍
# 在做預處理的時候,通常會使用到numpy模塊,用來創(chuàng)建數(shù)組(圖像)
np.zeros((100, 200), dtype=np.uint8) # 表示創(chuàng)建沿h=100,w=200的全黑圖像
(4)圖像濾波
常用濾波算法包含如下幾類:均值濾波、中值濾波、高斯濾波、雙邊濾波等文章來源地址http://www.zghlxwxcb.cn/news/detail-446842.html
# medianBlur(src, ksize, dst=None): 中值濾波可有效去除椒鹽噪聲,且能夠保證圖像的細節(jié)信息,不改變圖像邊緣線條的粗細
# src:待濾波圖像,ksize:濾波核,為int類型數(shù)據(jù)
img_median_blur = cv2.medianBlur(img_bgr, 3)
# blur(src, ksize, dst=None, anchor=None, borderType=None): 均值濾波在去除噪聲的同時,會使得圖像信息模糊
# src:待濾波圖像,ksize:濾波核,為tuple類型數(shù)據(jù)
img_blur = cv2.blur(img_bgr, (3, 3))
# GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None) 高斯濾波則可以有效去除高斯噪聲,會使圖像在一定程度上模糊
# src:待濾波圖像,ksize:濾波核,為tuple類型數(shù),sigmax:沿x方向的高斯標準差
img_gaussian = cv2.GaussianBlur(img_blur, (3, 3), sigmaX=1)
# bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None) 雙邊濾波是對高斯濾波的改進算法,主要去除高斯噪聲,同時較好的保留了圖像的邊緣信息
# src:待濾波圖像
# d:濾波時選取的空間距離參數(shù),表示濾波時使用像素的鄰域直徑,如果是非正數(shù),則會從sigmaSpace中計算得出。相當于高斯濾波中的濾波核。通常選取d=5,如果d過大,會導致濾波速度較慢
# sigmaColor:顏色空間標準差,代表濾波處理時選取的顏色差值范圍,值越大表示鄰域內(nèi)參與到的濾波的像素值越多
# sigmaSpace:坐標空間標準差,代表濾波處理時選取的坐標范圍,值越大,表示越遠區(qū)域內(nèi)的像素值差不多的像素能夠互相影響。
img_bilater = cv2.bilateralFilter(img, 5, 75, 75)
(5)圖像二值化
# threshold(src, thresh, maxval, type, dst=None):
# src:待二值化圖像,thresh:閾值
# maxval:使用THRESH_BINARY 和 THRESH_BINARY_INV 二值化方法時,將超過閾值部分的像素值設置為maxval所表示的像素值
# type:二值化所使用的方法包含THRESH_BINARY 和 THRESH_BINARY_INV,THRESH_OTSU,THRESH_TRIANGLE,THRESH_TRUNC,具體用法可參見官方文檔
_, img_threshold = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)
# 這里需要注意,threshold()函數(shù)主要用來處理二通道的圖像, 即灰度圖
(6)圖像形態(tài)學處理
# 形態(tài)學處理即對圖形進行腐蝕和膨脹處理,隨之帶來的概念有開運算和閉運算。一下以二值化圖像為例
# 腐蝕:黑色區(qū)域變多,而白色區(qū)域變少
# 膨脹:與腐蝕相反,白色區(qū)域變多,黑色區(qū)域變少
# 開運算:先腐蝕再膨脹
# 閉運算:先膨脹再腐蝕
# erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
# src:待腐蝕的圖像,kernel:腐蝕使用的核,iterations:腐蝕次數(shù)
# dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
# src:待膨脹的圖像,kernel:膨脹使用的核,iterations:膨脹次數(shù)
# morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
# src:待處理的圖像,kernel:處理時使用的核,iterations:次數(shù)
# op:MORPH_ERODE 腐蝕、MORPH_DILATE 膨脹、MORPH_OPEN 開運算、MORPH_CLOSE 閉運算
kernel = np.ones((3, 3)) # 定義一個全1的腐蝕核
cv2.erode(img_bgr, kernel, iterations=2) # 對img_bgr進行腐蝕,腐蝕兩次
cv2.dilate(img_bgr, kernel, iterations=2) # 對img_bgr進行膨脹,膨脹兩次
cv2.morphologyEx(img_bgr, cv2.MORPH_OPEN, kernel, iterations=2) # 進行兩次開運算
cv2.morphologyEx(img_bgr, cv2.MORPH_CLOSE, kernel, iterations=2) # 進行兩次閉運算
(7)圖像的邊緣提取
# Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None):
# image:待處理的圖像
# threshold1,threshold2:我們就可以設置兩個閾值,一個低閾值,一個高閾值。低閾值用來過濾噪聲和突變不明顯的線條,高閾值用來保留輪廓線。在低閾值和高閾值之間,且和輪廓線相鄰的線條可保留,否則舍棄
canny = cv2.Canny(img_bgr, 100, 200)
(8)圖像的輪廓提取
# findContours(image, mode, method, contours=None, hierarchy=None, offset=None):
# image:待處理圖像
# mode:輪廓的檢索模式,包含cv2.RETR_EXTERNAL表示只檢測外輪廓,cv2.RETR_TREE建立一個等級樹結(jié)構(gòu)的輪廓,cv2.RETR_LIST檢測的輪廓不建立等級關(guān)系,cv2.RETR_CCOMP建立兩個等級的輪廓,具體參見官網(wǎng)
# method:輪廓的近似辦法, cv2.CHAIN_APPROX_NONE存儲所有的輪廓點,cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標
contours, _ = cv2.findContours(img_threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img_bgr, contours, -1, (255, 0, 0), 2)
# 這里需要注意的是,findContours()主要針對二通道圖像,灰度圖
(9)仿射變換
# getPerspectiveTransform(src, dst, solveMethod=None): 求取變換矩陣
# src:原圖上選取的點,dst:轉(zhuǎn)換后對應的坐標點,返回值為一個二維矩陣
# warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None): 進行仿射變換
# src:要進行仿射變換的圖像,M:變換矩陣,dsize:變換后圖像的尺寸
src = np.float32([[748, 120], [750, 1300], [115, 1280], [110, 121]]) # 確定原圖上的四個點,這里隨意選取的點
dst = np.float32([[660, 0], [660, 1110], [0, 1110], [0, 0]]) # 確定仿射變換后對應的四個點,
M = cv2.getPerspectiveTransform(src, dst) # 確定放射變換矩陣
img_p = cv2.warpPerspective(img_bgr, M, (660, 1110)) # 進行透視變換
(10)霍夫圓變換
# HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None):
# image:要檢測的圓的圖像,minDist:檢測到的圓之間的最小中心距離,minRadius、maxRadius檢測到圓的最小半徑和最大半徑
# method:檢測方法,當前有cv2.HOUGH_GRADIENT和cv2.HOUGH_GRADIENT_ALT 2種方法,后者是前者的改進方法
# dp:檢測圓心的累加器精度和圖像精度比的倒數(shù),比如dp=1時累加器和輸入圖像有相同的分辨率,dp=2時累加器是輸入圖像一半大的寬高;method=cv2.HOUGH_GRADIENT_ALT時推薦設置dp=1.5
# param1:特定方法參數(shù),和method配合;當method=cv2.HOUGH_GRADIENT或method=cv2.HOUGH_GRADIENT_ALT時,該參數(shù)是canny檢測的高閾值,低閾值是該參數(shù)的一半;method=cv2.HOUGH_GRADIENT_ALT時,內(nèi)部使用Scharr計算圖像梯度,這個值通常要設置得更大。
# param2:特定方法參數(shù),和method配合;當method=cv2.OUGH_GRADIENT,它表示檢測階段圓心的累加器閾值,越小就會檢測到更多的圓,越大能通過檢測的圓就更加精確。當method=cv2.HOUGH_GRADIENT_ALT時,該參數(shù)可以看做是圓的“完美性”度量,它越接近1算法選擇的圓形形狀越好,一般可以設置在0.9。如果想要更好地檢測小圓,可以設置在0.85、0.8甚至更小,通過限制搜索范圍[minRadius,maxRadius]可以避免出現(xiàn)許多假圓。
# 具體可參考官方文檔,及如下博文:https://blog.csdn.net/juzicode00/article/details/122263456
cv2.HoughCircles(img_bgr, cv2.HOUGH_GRADIENT, 1, 100, param1=150, param2=200, minRadius=50, maxRadius=80) # 檢測圓的最大半徑80,最小半徑50,檢測到的兩個圓之間的距離最小為100,內(nèi)置canny算法的高閾值為150,低閾值為75
(11)霍夫直線檢測
# HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None):
# image:要檢測直線的圖像,rho累加器的距離分辨率,以像素為單位,theta:以弧度表示的參數(shù)的分辨率,threshold:閾值,被認為是一條直線的最低投票數(shù)
cv2.HoughLines(img_bgr, 1, np.pi / 180, 100, min_theta=np.pi / 6, max_theta=np.pi / 3) # 檢測角度在30°到60°之間的直線
到了這里,關(guān)于OpenCV圖像預處理常用函數(shù)及流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!