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()
· 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应用必不可少的技术