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 @   马铃薯1  阅读(539)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示