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

目录
  • 一、全局阈值
    • 1.效果图
    • 2.源码
  • 二、滑动改变阈值(滑动条)
    • 1.效果图
    • 2.源码
  • 三、自适应阈值分割
    • 1.效果图
    • 2.源码
    • 3.GaussianBlur()函数去噪
  • 四、参数解释

一、全局阈值

原图:

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

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阈值分割的资料请关注我们其它相关文章!

(0)

相关推荐

  • python+opencv实现阈值分割

    最近老师留了几个作业,虽然用opencv很简单一句话就出来了,但是还没用python写过.在官方文档中的tutorial中的threshold里,看到可以创建两个滑动条来选择type和value,决定用python实现一下 注意python中的全局变量,用global声明 开始出现了一些问题,因为毁掉函数每次只能传回一个值,所以每次只能更新value,后来就弄了两个毁掉函数,这个时候,又出现了滑动其中一个,另一个的值就会变为默认值的情况,这个时候猜想是全局变量的问题,根据猜想改动之后果然是. 感

  • 基于Python的图像阈值化分割(迭代法)

    1.阈值化分割原理 通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类.一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性. 在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中.像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类.经阈值化处理后的

  • opencv 阈值分割的具体使用

    阈值分割 像素图 原始图像像素图 见下面 红色线:标注一条阈值线 二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最大(如unit8的格式为255) 小于127的像素点灰度值设为0 反二进制阈值化 首先设定一条阀值线 如127 大于127的像素点灰度值设为最小为0 小于127的像素点灰度值设为最大(如unit8的格式为255) 截断阈值化 首先选定一个阀值,大于该阈值的像素点呗设定为该阈值,小于该阈值的不变 如:阈值127,大于127的像素点值为127:小于127的不变

  • 利用OpenCV实现局部动态阈值分割

    利用OpenCV实现局部动态阈值分割,参考Halcon dyn_threshold算子的思路实现. #include "dialog.h" #include <QApplication> #include "cv.h" #include "highgui.h" #include <QDebug> int main(int argc, char *argv[]) { IplImage *img = cvLoadImage(&

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

    目录 一.全局阈值 1.效果图 2.源码 二.滑动改变阈值(滑动条) 1.效果图 2.源码 三.自适应阈值分割 1.效果图 2.源码 3.GaussianBlur()函数去噪 四.参数解释 一.全局阈值 原图: 整幅图采用一个阈值,与图片的每一个像素灰度进行比较,重新赋值: 1.效果图 2.源码 import cv2 import matplotlib.pyplot as plt #设定阈值 thresh=130 #载入原图,并转化为灰度图像 img_original=cv2.imread(r'

  • Python OpenCV实现图片预处理的方法详解

    目录 一.图片预处理 1.1 边界填充(padding) 1.2 融合图片(mixup) 1.3 图像阈值 二.滤波器 2.1 均值滤波器 2.2 方框滤波器 2.3 高斯滤波器 2.4 中值滤波 2.5 所有滤波器按照上述顺序输出 一.图片预处理 1.1 边界填充(padding) 方法 : cv2.copyMakeBorder BORDER_REPLICATE:复制法,也就是复制最边缘像素. BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abc

  • python中验证码连通域分割的方法详解

    实现思路 是用深度遍历,对图片进行二值化处理,先找到一个黑色像素,然后对这个像素的周围8个像素进行判断,如果没有访问过,就保存起来,然后最后这个数组的最小x和最大x就是x轴上的切割位置.这种分割的方法还是只能适用于没有粘连的验证码,比垂直分割的好处是,可以处理位置比较奇怪的验证码. 示例代码 def cfs(img): """传入二值化后的图片进行连通域分割""" pixdata = img.load() w,h = img.size visit

  • Python OpenCV实现识别信用卡号教程详解

    目录 通过与 OpenCV 模板匹配的 OCR 信用卡 OCR 结果 总结 今天的博文分为三个部分. 在第一部分中,我们将讨论 OCR-A 字体,这是一种专为辅助光学字符识别算法而创建的字体. 然后我们将设计一种计算机视觉和图像处理算法,它可以: 本地化信用卡上的四组四位数字. 提取这四个分组中的每一个,然后单独分割 16 个数字中的每一个. 使用模板匹配和 OCR-A 字体识别 16 个信用卡数字中的每一个. 最后,我们将看一些将信用卡 OCR 算法应用于实际图像的示例. 通过与 OpenCV

  • 利用OpenCV实现YOLO对象检测方法详解

    目录 前言 什么是YOLO物体检测器? 项目结构 检测图像 检测视频 前言 本文将教你如何使用YOLOV3对象检测器.OpenCV和Python实现对图像和视频流的检测.用到的文件有yolov3.weights.yolov3.cfg.coco.names,这三个文件的github链接如下: GitHub - pjreddie/darknet: Convolutional Neural Networks https://pjreddie.com/media/files/yolov3.weights

  • C# OpenCV实现形状匹配的方法详解

    1. 多角度模板匹配测试效果如下图: 图1-1 图1-2 图1-3 正负角度均可正常识别,识别角度偏差<1° 2. 下面分享一下开发过程: a). ROI区域的生成,基于GDI+完成图形绘制,如图 绘制模板设置区域,用来生成需要的模板特征. ROI区域绘制代码如下: /// <summary> /// 区域绘制 /// </summary> /// <param name="graphics"></param> /// <pa

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

  • Python OpenCV对图像进行模糊处理详解流程

    其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作.那么它是什么操作呢?它就是图像的模糊(滤波)处理. 均值滤波 使用 opencv 中的cv2.blur(src, ksize)函数.其参数说明是: src: 原图像 ksize: 模糊核大小 原理:它只取内核区域下所有像素的平均值并替换中心元素.3x3 标准化的盒式过滤器如下所示: 特征:核中区域贡献率相同. 作用:对于椒盐噪声的滤除效果比较好. # -*-coding:utf-8-*- ""&q

  • Python OpenCV特征检测之特征匹配方式详解

    目录 前言  一.暴力匹配器 二.FLANN匹配器 前言  获得图像的关键点后,可通过计算得到关键点的描述符.关键点描述符可用于图像的特征匹配.通常,在计算图A是否包含图B的特征区域时,将图A称做训练图像,将图B称为查询图像.图A的关键点描述符称为训练描述符,图B的关键点描述符称为查询描述符. 一.暴力匹配器 暴力匹配器使用描述符进行特征比较.在比较时,暴力匹配器首先在查询描述符中取一个关键点的描述符,将其与训练描述符中的所有关键点描述符进行比较,每次比较后会给出一个距离值,距离最小的值对应最佳

  • Python高效处理大文件的方法详解

    目录 开始 处理文本 串行处理 多进程处理 并行处理 并行批量处理 将文件分割成批 运行并行批处理 tqdm 并发 结论 为了进行并行处理,我们将任务划分为子单元.它增加了程序处理的作业数量,减少了整体处理时间. 例如,如果你正在处理一个大的CSV文件,你想修改一个单列.我们将把数据以数组的形式输入函数,它将根据可用的进程数量,一次并行处理多个值.这些进程是基于你的处理器内核的数量. 在这篇文章中,我们将学习如何使用multiprocessing.joblib和tqdm Python包减少大文件

随机推荐