opencv-python 學習 |閾值分割與平滑處理

關於圖像閾值分割的一些基本操作以及一些濾波的函數。

圖像閾值

notice:在用plt.imshow和cv2.imshow顯示同一幅圖時可能會出現顏色差別很大的現象。這是因爲:
opencv的接口使用BGR,而matplotlib.pyplot 則是RGB模式

ret, dst = cv2.threshold(src, thresh, maxval, type)
src:輸入圖,只能輸入單通道圖像,通常來說爲灰度圖
dst:輸出圖
threshold是設定的閾值
maxval是當灰度值大於(或小於)閾值時將該灰度值賦成的值
type規定的是當前二值化的方式
以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超過閾值部分取maxval(最大值),否則取0
  • cv2.THRESH_BINARY_INV THRESH_BINARY的反轉
  • cv2.THRESH_TRUNC 大於閾值部分設爲閾值,否則不變
  • cv2.THRESH_TOZERO 大於閾值部分不改變,否則設爲0
  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反轉
import cv2
import matplotlib.pyplot as plt 
image = cv2.imread('dog_2.jpeg')
image_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
image_gray.shape
(646, 700)
plt.imshow(image_gray)
<matplotlib.image.AxesImage at 0x1277d61d0>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-84YFzuRI-1587201952446)(output_3_1.svg)]

ret,thresh1 = cv2.threshold(image_gray,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(image_gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(image_gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(image_gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(image_gray,127,255,cv2.THRESH_TOZERO_INV)
titles = ['original image','binary','binary_inv','trunc','tozero','tozero_inv']
images = [image_gray,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()

在這裏插入圖片描述

圖像平滑

圖像平滑是指用於突出圖像的寬大區域、低頻成分、主幹部分或抑制圖像噪聲和干擾高頻成分的圖像處理方法,目的是使圖像亮度平緩漸變,減小突變梯度,改善圖像質量。

# 均值濾波 blur = cv2.blur(img, (3, 3))  
#需要傳入兩個參數,一個是需要濾波的圖像,一個是卷積核的大小。
# 簡單的平均卷積操作
blur = cv2.blur(image,(3,3))
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

方框濾波

基本和均值一樣,可以選擇歸一化
如果歸一化normalize等於True,那麼和均值濾波一樣,如果normalize爲False,那麼大部分都將會發生越界的情況。


box = cv2.boxFilter(image,-1,(3,3),normalize=True)
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
box = cv2.boxFilter(image,-1,(3,3),normalize=False)
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# plt.imshow(box)
<matplotlib.image.AxesImage at 0x1280c60f0>

在這裏插入圖片描述

高斯濾波

高斯模糊的卷積核裏的數值是滿足高斯分佈,相當於更重視中間的

dst = cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
src: 輸入圖像矩陣,可爲單通道或多通道,多通道時分別對每個通道進行卷積
dst:輸出圖像矩陣,大小和數據類型都與src相同
ksize:高斯卷積核的大小,寬,高都爲奇數,且可以不相同
sigmaX: 一維水平方向高斯卷積核的標準差
sigmaY: 一維垂直方向高斯卷積核的標準差,默認值爲0,表示與sigmaX相同
borderType:填充邊界類型

gaussian = cv2.GaussianBlur(image,(5,5),1)
cv2.imshow('gaussian',gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
# plt.imshow(gaussian)

中值濾波

相當於用中值代替.中值平滑也有核,但並不進行卷積計算,而是對核中所有像素值排序得到中間值,用該中間值來代替錨點值。
cv2.medianBlur(src,ksize,dst)
-src: 輸入圖像對象矩陣,可以爲單通道或多通道
-ksize:核的大小,格式爲 3 #注意不是(3,3)
-dst:輸出圖像矩陣,大小和數據類型都與src相同

median = cv2.medianBlur(image,5)
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np 
# 展示所有的 
res = np.hstack((image,blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows('median vs average')
cv2.waitKey(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章