1. 程式人生 > 其它 >05-閾值分割

05-閾值分割

閾值分割
影象閾值分割是一種簡單的影象分割方法,通過將彩色影象轉化成灰度影象,然後利用合適的閾值,進行二值化,也就是從影象中提取出我們需要的輪廓

1.簡單閾值
選取一個全域性閾值,然後就把整幅影象分成非黑即白的二值影象
retval,dst = cv2.threshold(src,thresh,maxval,type)
其中,retval是返回的閾值,dst是返回閾值處理後的影象;第一個引數src是原影象,第二個引數threshold是閾值大小,第三個引數maxval是高於(低於)閾值時賦予的新值,第四個引數type是是閾值分割方法

常用的閾值分割方法
cv2.THRESH_BINARY(二進位制閾值化)

cv2.THRESH_BINARY_INV(反二進位制閾值化

cv2.THRESH_TRUNC(截斷閾值化

cv2.THRESH_TOZERO(閾值化為0)

cv2.THRESH_TOZERO_INV(反閾值化為0)

import cv2

img = cv2.imread(r"image\lenacolor.png",cv2.IMREAD_COLOR)
# 彩色圖轉灰度圖
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

# cv2.THRESH_BINARY(二進位制閾值化)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow(
"thresh1", thresh1) # cv2.THRESH_BINARY_INV(反二進位制閾值化) ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) cv2.imshow("thresh2", thresh2) # cv2.THRESH_TRUNC(截斷閾值化) ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) cv2.imshow('thresh3', thresh3) # cv2.THRESH_TOZERO(閾值化為0) ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) cv2.imshow(
'thresh4', thresh4) # cv2.THRESH_TOZERO_INV(反閾值化為0) ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) cv2.imshow('thresh5', thresh5) print("返回的閾值:",ret) cv2.waitKey(0) cv2.destroyAllWindows()

自適應閾值
簡單閾值是一種全域性性的閾值,只需要設定一個閾值,整個影象都和這個閾值比較。而自適應閾值可以看成一種區域性性的閾值,也就是說,動態自適應的調整屬於自己畫素點的閾值,而不是整幅圖都用一個閾值。此時的閾值是根據影象上的每一個小區域計算畫素的平均值
dst = cv2.adaptiveThreshold(src,x,adaptive_method,threshold_type,block_size,param1)
其中,dst是返回閾值處理後的影象;第一個引數src是原影象,第二個引數x是高於(低於)閾值時賦予的新值,第三個引數 adaptive_method是自適應方法(CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C),第四個引數threshold_type是閾值型別(cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV),第五個引數block_size是用來計算閾值的畫素鄰域大小,第六個引數param1是對方法CV_ADAPTIVE_THRESH_MEAN_C,先求出區域中的均值,再減掉param1;CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出區域中的加權和(gaussian), 再減掉param1

import cv2

img = cv2.imread(r"image\lenacolor.png",cv2.IMREAD_COLOR)
# 彩色圖轉灰度圖
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

th6 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th7 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th8 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)


cv2.imshow('th6', th6)
cv2.imshow('th7', th7)
cv2.imshow('th8', th8)

cv2.waitKey(0)
cv2.destroyAllWindows()