Python+OpenCV实现阈值分割的方法详解

 更新时间:2022年05月16日 14:27:04   作者:用余生去守护  
阈值分割法是一种基于区域的图像分割技术,原理是把图像像素点分为若干类。本文将利用Python+OpenCV实现阈值分割,感兴趣的可以了解一下

一、全局阈值

原图:

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

1.效果图

2.源码

import cv2
import 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 cv2
import numpy as np
import 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)
#初始化阈值,定义全局变量imgs
thresh=130
imgs=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')
#新建滑动条,初始位置为130
cv2.createTrackbar('threshold value','Images',130,255,threshold_segmentation)
#第一次调用函数
threshold_segmentation(thresh)
#显示图像
while(1):
    cv2.imshow('Images',imgs)
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

三、自适应阈值分割

1.效果图

2.源码

代码如下(示例):

import cv2
import 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 cv2
import 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实现阈值分割的方法详解的详细内容,更多关于Python OpenCV阈值分割的资料请关注脚本之家其它相关文章!

相关文章

  • 教你用Python脚本快速为iOS10生成图标和截屏

    教你用Python脚本快速为iOS10生成图标和截屏

    这篇文章主要介绍了教你用Python快速为iOS10生成图标和截屏的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • python光学仿真面向对象光学元件类的实现

    python光学仿真面向对象光学元件类的实现

    这篇文章主要为大家介绍了python光学仿真面向对象光学元件类的实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • python脚本内运行linux命令的方法

    python脚本内运行linux命令的方法

    这篇文章主要介绍了python脚本内运行linux命令的方法,实例分析了Python基于subprocess模块操作Linux命令的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 使用BeautifulSoup4解析XML的方法小结

    使用BeautifulSoup4解析XML的方法小结

    这篇文章主要介绍了使用BeautifulSoup4解析XML的方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python魔术方法详解

    Python魔术方法详解

    这篇文章主要介绍了Python魔术方法详解,本文讲解了构造和初始化、用于比较的魔术方法、数值处理的魔术方法、普通算数操作符等内容,需要的朋友可以参考下
    2015-02-02
  • 3行Python代码实现剪辑音乐

    3行Python代码实现剪辑音乐

    你以为剪辑音乐要很久吗?其余3行语句Python就能瞬间搞定。本文就来详细为大家讲讲实现的步骤,文中的示例代码讲解详细,感兴趣的可以动手尝试一下
    2022-06-06
  • ptyhon实现sitemap生成示例

    ptyhon实现sitemap生成示例

    这篇文章主要介绍了ptyhon实现sitemap生成示例,需要的朋友可以参考下
    2014-03-03
  • Python中给List添加元素的4种方法分享

    Python中给List添加元素的4种方法分享

    这篇文章主要介绍了Python中给List添加元素的4种方法分享,本文讲解了append()、extend()、insert()、加号等4个方法,并给出了操作实例,需要的朋友可以参考下
    2014-11-11
  • Python异常处理之try...except语句

    Python异常处理之try...except语句

    Python异常处理是Python中重要的一部分,为了保证程序的稳定性和可靠性,我们需要使用异常处理来及时捕获,并以优雅的方式来处理这些异常,本教程将介绍如何处理 Python中的异常,需要的朋友可以参考下
    2023-06-06
  • Python实现的微信红包提醒功能示例

    Python实现的微信红包提醒功能示例

    这篇文章主要介绍了Python实现的微信红包提醒功能,结合实例形式分析了Python使用微信模块itchat实现微信红包提醒操作的相关实现技巧,需要的朋友可以参考下
    2019-08-08

最新评论