Python+OpenCV实现阈值分割的方法详解
作者:用余生去守护 发布时间:2023-08-13 02:24:00
标签: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:阈值分割后的图像
来源:https://blog.csdn.net/qq_45365214/article/details/124750672


猜你喜欢
- <? //作者:www.tongqiong.com //header("content-type:text/html; ch
- 中文字体设计发展到现在,风格越来越多样化,特别是在广告(美术)字体方面,因为字数少 局限小,优秀的作品层出不穷,比较突出的应用在标志设计唱片
- 下面把代码写出来,希望大家批评指正. 首先domain对象.在这里使用的注解的方式,都是比较新的版本. User.java package
- 一、要求 1 创建数据表 CREATE TABLE [dbo].[StuScore]( [stuid] [int] NOT NULL, [s
- 一、concurrent模块的介绍concurrent.futures模块提供了高度封装的异步调用接口ThreadPoolExecutor:
- 示例很简单,注释里也都做了说明,这里就不多废话了。<?php/*从平台获取数据库名*/$dbname = "";/
- 数据类型:float — 浮点数可以精确到小数点后面15位int — 整型可以无限 * ool — 非零为true,零为falselist —
- 1.静态加载 CSS,图片资源文件在页面渲染过程中可以并行下载,不会阻塞。在IE8,FF下,也可以支持JS的并行下载。尽管页面的JS下载加速
- 正在看的ORACLE教程是:Oracle RMAN快速入门指南。前言: 这篇文章主要介绍RMAN的常用方法,其中包含了作者一些自己的经验,里
- 我在网站上设置了邮件列表功能,实现用户自动订阅和发送,但很多用户输入和提交的邮件地址格式都是无效的,无法处理。请问如何解决这一问题?&nbs
- if xxx 和if xxx is None的区别一、 if xxxNone,’’,0,[],{},
- 小编使用python中的django框架来完成!1,首先用pycharm创建django项目并配置相关环境这里小编默认项目都会创建setti
- 第一次用Python写这种比较实用且好玩的东西,权当练手吧游戏说明:* P键控制“暂停/开始”* 方向键控制贪吃蛇的方向源代码如下:from
- 按照某一列排序d = {'A': [3, 6, 6, 7, 9], 'B': [2, 5, 8, 0, 0]
- np.newaxis 新增一个轴 如何将数组[0,1,2]转换成列向量用ndarray[: , np.newaxis]代码实质就是将原本的(
- 当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要
- #-*- coding:utf-8 -*-import osif __name__ == '__main__':
- 本文实例讲述了php从文件夹随机读取文件的方法。分享给大家供大家参考。具体实现方法如下:function RandomFile($folde
- 本文主要介绍的是vue.js插入dom节点的方法,下面话不多说,来看看详细的介绍吧。html代码:<div id="app&
- 本文实例讲述了关于php中SimpleXML 函数的用法,此函数是允许您把 XML 转换为对象,分享给大家供大家参考。具体分析如下:Simp