天天看點

python-OpenCV圖像門檻值處理和平滑處理

一、圖像的門檻值處理

ret, dst = cv2.threshold(src=,thresh=,maxval=,type=)

dst:輸出圖

src:輸入圖,隻能是單通道圖像,通常來說為灰階圖

thresh:門檻值

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

img_h = cv2.imread(r"C:\Users\admin\Desktop\yy.jpg", cv2.IMREAD_GRAYSCALE)
# 超過門檻值部分取maxval(最大值),否則0
ret1,img1 = cv2.threshold(img_h,127,255,cv2.THRESH_BINARY)
# 小于門檻值部分取maxval(最大值)  否則0
ret2,img2 = cv2.threshold(img_h,127,255,cv2.THRESH_BINARY_INV)
# 大于門檻值部分設為門檻值,否則不變
ret3,img3 = cv2.threshold(img_h,127,255,cv2.THRESH_TRUNC)
# 大于門檻值部分不改變,否則設為0
ret4,img4 = cv2.threshold(img_h,127,255,cv2.THRESH_TOZERO)
# 小于門檻值部分不改變嗎,否則設為0
ret5,img5 = cv2.threshold(img_h,127,255,cv2.THRESH_TOZERO_INV)
titles = ["ORIGINAL", "BINARY", "BINARY_INV", "TRUNC", "TOZERO", "TOZERO_INV"]
imgs = [img_h,img1,img2,img3,img4,img5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(imgs[i],"gray")
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
           

效果如下

python-OpenCV圖像門檻值處理和平滑處理

二、圖像的平滑處理

img = cv2.imread(r"C:\Users\admin\Desktop\yy2.jpg", cv2.IMREAD_GRAYSCALE)

# 均值濾波
# 簡單的平均卷積操作
# (3,3)為每次處理矩陣的大小
# 比如3*3的矩陣9個數,9個數相加除以9來代替中間點的像素值
blur = cv2.blur(img, (3, 3))

# 方框濾波
# normalize=True時,基本和均值一樣,可以選擇歸一化
# -1 基本為常量
box = cv2.boxFilter(img,-1,(3,3),normalize=True)
# 方框濾波
# normalize=False,容易越界,因為超過255,則就255
# 比如3*3的矩陣9個數,9個數相加代替中間點的像素值,超過255則為255
box = cv2.boxFilter(img,-1,(3,3),normalize=False)

# 高斯濾波
# 卷積核是滿足高斯分布,相當于更重視中間的像素值
aussian = cv2.GaussianBlur(img, (5,5), 1)

# 中值濾波
# 相當于用中值代替
# 比如3*3的矩陣9個數,取中值來代替中間點的像素值
median = cv2.medianBlur(img, 5)
           

繼續閱讀