Opencv图像处理 图像噪点与降噪 形体学变换
圖像閾值
進行圖像閾值處理主要的使用圖像是二值圖。
例如如果需要講灰度圖轉換為二值圖,比如我們感興趣的區域灰度在[128,256],不感興趣的的范圍灰度值在[0,127],此時我們可以將[127,256]范圍轉換為白色(邏輯1),將[0,126]轉換為黑色(邏輯0)。而閾值的設定就是用于區分邏輯1與邏輯0之間的界限。
簡單閾值
直接設定閾值用于判斷,使用內置函數cv2.threshold
ret,dst = cv2.threshold(src, thresh, maxval, type[, dst])- ret : 判斷二值化是否成功 布爾類
- dst : 二值化后輸出的圖像
- src : 灰度圖源
- thresh : 設定的閾值
- maxval : 如果超過閾值會被設置為maxvam,一般為255(邏輯1)
- type : 二值化操作類型,一共分為五種,接下來會一一展示
cv.THRESH_BINARY
這個很好理解,由上圖可知超過閾值就會被設置為maxval
ret,thresh = cv.threshold(grey,127,255,cv.THRESH_BINARY)圖像顯示的代碼(方便需要使用的同學):
ret,thresh = cv.threshold(grey,127,255,cv.THRESH_BINARY)#圖像顯示 plt.figure(figsize = (10,10)) plt.subplot(121);plt.imshow(grey,cmap='gray');plt.title('origial') plt.subplot(122);plt.imshow(thresh,cmap='gray');plt.title('THRESH_BINARY') plt.show()這里注意一下opencv使用的是BGR模式,而matlibplot使用的RGB模式,二者正好相反,使用的時候需要注意通道。
這里的cmap='gray’是matplotlib用于處理灰度圖時使用的,如果不添加則會顯示一張綠油油的"偽灰度圖"。
運行結果為:
cv2.THRESH_BINARY_INV
顯而易見,這一種類型和THRESH剛好相反(畢竟inv表示invert的意思嘛)
一般來說追蹤深色物體需要使用該類型(二值化后白色表示感興趣的區域)
cv2.THRESH_TRUNC
這個方法的意思是,當像素值大于閾值時,將該像素設置為閾值(注意是閾值,而不知maxval)
這樣看就有一點類似于相機過曝的效果了,可以看到深色的區域還是保持不變的,只有偏白的區域變得更加白了
cv2.THRESH_TOZERO
這個類型的作用是,大于閾值部分的像素點灰度值不改變,其他像素點灰度變為邏輯0
cv2.THRESH_TOZERO_INV
這個方法和TOZERO剛好相反,大于閾值的部分灰度值變為0,其余灰度值保持不變
自適應閾值
很多情況下我們并不能提前預估好圖像的閾值,或者對同一張圖像的不同部分使用相同閾值進行處理這也是不合理的,有可能會使本來感興趣的區域被閾值篩掉。
使用自適應閾值能夠根據不同于區域選擇合適的閾值進行處理。自適應閾值使用adaptiveThreshold函數
dst = cv.AdaptiveThreshold(src, dst, maxValue, adaptive_method, thresholdType, blockSize=3, param1=5)- adaptive_method:自適應方法,一共有兩種類
- cv.ADAPTIVE_THRESH_MEAN_C 領域內進行計算
- cv.ADAPTIVE_THRESH_GAUSSIAN_C 領域內像素點進行加權和
- thresholdType: 閾值類型 只有兩種了
- THRESH_BINARY
- THRESH_BINARY_INV
- blockSize:規定每個自適應區域的大小
- C:常數,最后的閾值等于指定正方形區域的均值減C
Otsu’s 二值化(大津算法)
實際處理情況下,人工設置并不是一個很好的方法,所以這里可以使用Otsu’s二值化算法,讓計算機自己去選擇一個合適的閾值
它就是統計各個像素值的出現的次數,然后遍歷各種閾值(總共有256種可能的選擇),然后讓被劃分的那兩類的像素值的方差的加權和最小。加權和的權重就是對應類中像素值之和。這個方差就用統計學中的方差計算公式即可。
使用方法就是在參數type后面加上cv2.THRESH_OTSU
ret,thresh = cv.threshold(grey,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)注意thresh必須設置為0才能使用THRESH_OTSU
圖像去噪
圖像的降噪一般使用低通濾波器
需要提前了解的知識:卷積,二維卷積
圖像一般存在兩種最主要的噪點,椒鹽噪點與高斯噪點。
椒鹽噪點就是為白色或黑色的點點,是離散的;而高斯噪音一般是連續的,噪音的強度分布符合高斯分布
filter2D函數
平均濾波是2D濾波的一種特殊形式,2D濾波可以使用任意形式的卷積核進行卷積
cv.Filter2D(src, dst, kernel, anchor=(-1, -1))- kernl : 卷積核
- anchor : 內核錨點,默認值為(-1,-1)
平均卷積
平均卷積也是特殊的2D濾波,kernel中默認所有的元素都為1(也就是需要計算周邊所有的值),所以只要提供卷積核的邊長就好了。這種卷積防止能夠較好地處理椒鹽噪音。
#平均卷積 dst = cv.blur(src,ksize,anchor=None,borderType=None)高斯卷積(高斯模糊)
高斯卷積能夠較好地處理高斯噪聲,由于高斯噪音具有連續性,所以處理后的圖像也會較為柔和、
#高斯模糊 dst = cv.GaussianBlur(src,ksize,sigmaX,sigmaY=None)- sigmaX:高斯函數沿x軸方向的標準差
- sigmaY:高斯函數沿y軸方向的標準差
中值濾波
對于椒鹽噪聲,最好用的方法應該是中值濾波。
中值濾波是通過像素周圍的值或者本身的值來取代像素點的值,需要注意:中值濾波卷積核的大小必須為奇數
dst = cv.medianBlur(src,ksize)- ksize : 卷積核的大小,這里只需要傳入一個整數就好了
雙邊濾波
這是一種能夠保持圖像輪廓清晰的同時進行降噪的方法,在卷積的時候會同時考慮像素點和像素點之間的顏色相似度
dst = cv.billateralFilter(src,d,sigmaColor,sigmaSpace)- d: 領域直徑
- sigmaColor:灰度值相似性高斯函數標準差
- sigmaSpace:空間高斯函數標準差
有一個非常廣泛的引用途徑就是美顏濾鏡,可以用于去除死皮:
形態學轉換
形態學腐蝕
腐蝕的作用就是將圖像中前景物體的輪廓給腐蝕掉,其余部分保持不變。
dst = cv.erode(src,kernel,anchor = None,iterations = None)- anchor: 錨點,默認為(-1,-1)
- iterations:對圖像進行形態學腐蝕的次數
形態學腐蝕可以用于物體的分離
形態學膨脹
形態學膨脹與腐蝕的作用正好相反,膨脹的作用可以用于連接兩個分開的物體以及修復內部的孔洞
dst = cv.dilate(src,kernel,anchor=None,iterations=None)當修復內部空洞時,通常的做法是先腐蝕再膨脹,這樣在清除外部的噪點的同時修復孔洞。
形態學高級操作
高級操作是基于形態學膨脹和腐蝕進行的,使用函數mophotogyEx
dst = cv.mophotoEx(src,op,kernel,anchor = None,iterations = None)- op:形態學操作的名稱,接下來會逐個解釋
開閉運算
開運算表示先進行腐蝕再進行膨脹,對應于操作中的cv.MORPH_OPEN
閉運算表示先進性膨脹再進行腐蝕,對應于操作中的cv.MORPH_CLOSE,多用于填補黑點
梯度 禮帽 黑帽
形態學梯度表示形態學膨脹和腐蝕時間的差值,對應操作為cv.MORPH_GRADIENT
形態學禮帽表示輸入圖像與進行開運算之后的輸出圖像之間的差,對應操作為cv.MORPH_TOPHAT
形態學黑帽表示輸入圖像與進行閉運算之后的輸出圖像之間的差,對應操作為cv.MORPH_BLACKHAT
總結
以上是生活随笔為你收集整理的Opencv图像处理 图像噪点与降噪 形体学变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业环境中的LED照明降低成本,提高安全
- 下一篇: Golang学习日志 ━━ 调用系统默认