文章目錄
- 一、影像閾值
- 二、影像平滑
- (一)均值濾波
- (二)方框濾波
- (三)高斯濾波
- (四)中值濾波
一、影像閾值
影像是由多個像素點組成的,每個像素點有一個數值,影像閾值就是一個適當的數值,通過每個像素點的值與閾值進行比較,根據比較結果對不同像素點進行不同處理,
-
opencv閾值處理函式
def threshold(src: Any, thresh: Any, maxval: Any, type: Any, dst: Any = None)引數說明
src:輸入影像物件,該物件需要是
單通道影像,一般采用灰度圖
dst:輸出影像物件
thresh:閾值(設定的值),一般采用127
maxval:當像素點值超過閾值(或者小于閾值,根據type進行選擇),像素點所賦予的數值
type:操作型別
五種型別說明
①cv2.THRESH_BINARY
二值化,超過閾值部分取maxval,否則取0
②cv2.THRESH_BINARY_INV
二值化,小于閾值部分取maxval,否則取0
③cv2.THRESH_TRUNC
大于閾值部分設定為閾值,否則不變
④cv2.THRESH_TOZERO
大于閾值部分不變,否則設定為0
⑤cv2.THRESH_TOZERO_INV
小于閾值部分不變,否則設定為0 -
實際處理實體
代碼內容import cv2 import matplotlib.pyplot as plt # 讀取影像 img = cv2.imread("Lena.png") ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) titles = ['ORIGINAL', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in range(6): plt.subplot(2, 3, i+1) plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()
通過實際舉例可以看出實際結果與文字描述相符合的,
二、影像平滑
通過不同的濾波方式,將帶有噪聲圖片進行處理,
制作帶有噪聲的影像
def sp_noise(image,prob):
'''
添加椒鹽噪聲
prob:噪聲比例
'''
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
img = sp_noise(img, 0.01)
cv2.imshow("Lena", img)
# 等待時間,毫秒級,0表示任意鍵結束
cv2.waitKey(0)
# 銷毀創建的視窗
cv2.destroyAllWindows()

(一)均值濾波
均值濾波是先構造一個全為1的矩陣,將構造的矩陣在影像矩陣上進行對應位置相加,然后再取均值,用均值取代中心像素點的值,接著在影像矩陣上進行平滑移動,重復相加取均值,
-
opencv實作均值濾波函式
cv2.blur(影像物件,構造矩陣核) -
實際濾波舉例
blur = cv2.blur(img, (3, 3)) cv2.imshow("Lena", img) cv2.waitKey(0) cv2.destroyAllWindows()
(二)方框濾波
方框濾波跟均值濾波基本方式相同,不會取均值,主要在于多了一個歸一化引數,當不進行歸一化操作時,出現出界的情況,就取值為255,
-
opencv方框濾波函式
cv2.boxFilter(濾波物件, -1, 構造矩陣核, 歸一化引數) -
實際舉例
bor1 = cv2.boxFilter(img, -1, (3, 3), normalize=True) bor2 = cv2.boxFilter(img, -1, (3, 3), normalize=False) # plt.subplot(121), plt.imshow(bor1), plt.title('NORMALIZE') # plt.subplot(122), plt.imshow(bor2), plt.title('NOt NORMALIZE') # plt.show() res = np.hstack((bor1, bor2)) cv2.imshow("Lena", res) cv2.waitKey(0) cv2.destroyAllWindows()
(三)高斯濾波
高斯濾波重點在于構造的矩陣核,該矩陣核符合高斯分布,中間更加重要,
-
opencv高斯濾波函式
cv2.GaussianBlur(濾波物件, 構造矩陣核, 1) -
實際舉例
guass = cv2.GaussianBlur(img, (5, 5), 1) cv2.imshow("Lena", guass) cv2.waitKey(0) cv2.destroyAllWindows()
(四)中值濾波
中值濾波是將對應矩陣核中對應的值進行排序,取最中間的值作為結果,
-
opencv均值濾波函式
cv2.medianBlur(濾波影像物件, ksize) # ksize表示矩陣大小為ksize*ksize -
實際舉例
median = cv2.medianBlur(img, 5) cv2.imshow("Lena", median) cv2.waitKey(0) cv2.destroyAllWindows()
通過濾波方式結果,可以發現對于椒鹽噪聲來說,采用中值濾波可以很好的去除,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317728.html
標籤:其他
