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()

posted @ 2021-09-09 11:32  马铃薯1  阅读(461)  评论(0编辑  收藏  举报