千家信息网

Python+OpenCV怎么实现阈值分割

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"Python+OpenCV怎么实现阈值分割",在日常操作中,相信很多人在Python+OpenCV怎么实现阈值分割问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2025年01月19日Python+OpenCV怎么实现阈值分割

这篇文章主要介绍"Python+OpenCV怎么实现阈值分割",在日常操作中,相信很多人在Python+OpenCV怎么实现阈值分割问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python+OpenCV怎么实现阈值分割"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、全局阈值

    原图:

    整幅图采用一个阈值,与图片的每一个像素灰度进行比较,重新赋值;

    1.效果图

    2.源码

    import cv2import matplotlib.pyplot as plt#设定阈值thresh=130#载入原图,并转化为灰度图像img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3)#采用5种阈值类型(thresholding type)分割图像retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY)retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV)retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC)retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO)retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV)#采用plt.imshow()显示图像imgs=[img_original,img_binary,img_binary_invertion,img_trunc,img_tozero,img_tozero_inversion]titles=['original','binary','binary_inv','trunc','tozero','tozero_inv']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()

    二、滑动改变阈值(滑动条)

    1.效果图

    2.源码

    代码如下(示例):

    import cv2import numpy as npimport matplotlib.pyplot as plt#载入原图,转化为灰度图像,并通过cv2.resize()等比调整图像大小img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)img_original=cv2.resize(img_original,(0,0),fx=0.3,fy=0.3)#初始化阈值,定义全局变量imgsthresh=130imgs=0#创建滑动条回调函数,参数thresh为滑动条对应位置的数值def threshold_segmentation(thresh):    #采用5种阈值类型(thresholding type)分割图像    retval1,img_binary=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY)    retval2,img_binary_invertion=cv2.threshold(img_original,thresh,255,cv2.THRESH_BINARY_INV)    retval3,img_trunc=cv2.threshold(img_original,thresh,255,cv2.THRESH_TRUNC)    retval4,img_tozero=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO)    retval5,img_tozero_inversion=cv2.threshold(img_original,thresh,255,cv2.THRESH_TOZERO_INV)    #由于cv2.imshow()显示的是多维数组(ndarray),因此我们通过np.hstack(数组水平拼接)    #和np.vstack(竖直拼接)拼接数组,达到同时显示多幅图的目的    img1=np.hstack([img_original,img_binary,img_binary_invertion])    img2=np.hstack([img_trunc,img_tozero,img_tozero_inversion])    global imgs    imgs=np.vstack([img1,img2])#新建窗口cv2.namedWindow('Images')#新建滑动条,初始位置为130cv2.createTrackbar('threshold value','Images',130,255,threshold_segmentation)#第一次调用函数threshold_segmentation(thresh)#显示图像while(1):    cv2.imshow('Images',imgs)    if cv2.waitKey(1)==ord('q'):        breakcv2.destroyAllWindows()

    三、自适应阈值分割

    1.效果图

    2.源码

    代码如下(示例):

    import cv2import matplotlib.pyplot as plt#载入原图img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)#全局阈值分割retval,img_global=cv2.threshold(img_original,130,255,cv2.THRESH_BINARY)#自适应阈值分割img_ada_mean=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,3)img_ada_gaussian=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)imgs=[img_original,img_global,img_ada_mean,img_ada_gaussian]titles=['Original Image','Global Thresholding(130)','Adaptive Mean','Adaptive Guassian',]#显示图片for i in range(4):    plt.subplot(2,2,i+1)    plt.imshow(imgs[i],'gray')    plt.title(titles[i])    plt.xticks([])    plt.yticks([])plt.show()

    3.GaussianBlur()函数去噪

    代码如下(示例):

    import cv2import matplotlib.pyplot as plt#载入原图img_original=cv2.imread(r'E:\py\python3.7\test2\test14yuzhi\cell.png',0)#高斯滤波img_blur=cv2.GaussianBlur(img_original,(13,13),13)  #根据情况修改参数#自适应阈值分割img_thresh=cv2.adaptiveThreshold(img_original,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)img_thresh_blur=cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,15,3)#显示图像imgs=[img_thresh,img_thresh_blur]titles=['img_thresh','img_thresh_blur']for i in range(2):    plt.subplot(1,2,i+1)    plt.imshow(imgs[i],'gray')    plt.title(titles[i])    plt.xticks([])    plt.yticks([])plt.show()

    四、参数解释

    1.cv2.threshold(src, thresh, maxval, type)

    参数:

    src:输入的图像

    thresh:图像分割所用的阈值(threshold value)

    maxval:当阈值类型(thresholding type)采用cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV时像素点被赋予的新值

    type:介绍6种类型:

    cv2.THRESH_BINARY(当图像某点像素值大于thresh(阈值)时赋予maxval,反之为0。注:最常用)

    cv2.THRESH_BINARY_INV(当图像某点像素值小于thresh时赋予maxval,反之为0)

    cv2.THRESH_TRUNC(当图像某点像素值大于thresh时赋予thresh,反之不变。注:虽然maxval没用了,但是调用函数不能省略)

    cv2.THRESH_TOZERO(当图像某点像素值小于thresh时赋予0,反之不变。注:同上)

    cv2.THRESH_TOZERO_INV(当图像某点像素值大于thresh时赋予0,反之不变。注:同上)

    cv2.THRESH_OTSU(该方法自动寻找最优阈值,并返回给retval,见下文)

    返回值:

    retval:设定的thresh值,或者是通过cv2.THRESH_OTSU算出的最优阈值

    dst:阈值分割后的图像

    到此,关于"Python+OpenCV怎么实现阈值分割"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

    阈值 图像 像素 原图 函数 参数 类型 学习 代码 全局 效果 效果图 数组 源码 灰度 示例 位置 图片 方法 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 爬虫服务器时间和本地时间不一致 怎样查看数据库密钥 网络安全法 英语 浙江迅唯网络技术有限公司 计算机网络技术学习知识 网络安全架构与运维实战 陇剑杯网络安全大赛题目 怎样租服务器和域名 SCSVR 服务器 数据库数据做错了还能改吗 什么时候实施网络安全等级 服务器开机了 进raid管理 金山区网络技术服务创新服务 计算机网络技术相关大题 自身网络安全心理建设论文 创建苹果账户连接服务器失败 bbs数据库交互 数据库用命令查询所有列表 新乡合一网络技术 计算机服务器操作系统分类 中国操作系统支持的数据库软件 换手机后王者荣耀服务器找不到 如何安装数据库oracle 学校网络安全的目标是什么 阿里云服务器有哪些安全 新华三服务器 自主知识产权 软件开发要学哪些内容 数据库崩溃问题排查 u8服务器ip在哪看 宁夏移动城管软件开发公司
    0