opencv-python   4.0.1

简介:该函数是对数组中的每一个元素(each array element)应用固定级别阈值(Applies a fixed-level threshold)

具体地讲,该函数的阈值操作属于像素级的操作,在灰度图中,每个像素都对应一个灰度值(0~255,0黑、255白),此时我们将阈值函数 threshold() 应用于图像,图像的灰度值与阈值进行比较,从而实现二值化处理,目的是滤除太大或太小值像素、消除噪声,从而从灰度图中获取二值图像(将图像的灰度值设置为0或255),实现增强整个图像呈现更为明显的黑白效果,同时也大大减少了数据量。

该函数支持几种类型的阈值处理方式,具体由其参数来确定。

1 函数解析

最简单的图像分割方法

threshold(src, thresh, maxval, type[, dst]) -> retval, dst

参数:

src - 输入数组/图像(多通道,8位或32位浮点)

thresh - 阈值

maxval - 最大值,与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值(maximum value)

type - 阈值类型

dst - 输出数组/图像(与src相同大小和类型以及相同通道数的数组/图像)。

此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以与上述值之一组合。 在这些情况下,函数使用Otsu或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。

返回值:

retval - 阈值 thresh

dst - 经函数处理后的图像 image

2 阈值类型枚举

关于阈值类型(枚举enum),有以下几类

1)二进制阈值化(THRESH_BINARY = 0)

假设阈值thresh为125,则大于125该值的(像素点的)灰度值设定为最大值(如8位灰度值最大为255),小于125该值的灰度值设定为0.

2)反二进制阈值化( THRESH_BINARY_INV = 1)

与二进制阈值化类似,只是最后设定值恰好相反。

3)截断阈值化(THRESH_TRUNC = 2)

设置目标阈值(如125),图像中大于该阈值的像素点灰度值 = 该阈值125,小于该阈值的灰度值则保持不变。

4)阈值化为0(THRESH_TOZERO = 3)

设置目标阈值(如125),图像中大于该阈值的像素点灰度值保持不变,小于该阈值的像素点灰度值变为0

5)反阈值化为0(THRESH_TOZERO_INV = 4)

与阈值化为0相反。

设置目标阈值(如125),图像中大于该阈值的部分全部为0,小于该阈值的像素点灰度值保持不变。

enum
cv::ThresholdTypes {
  cv::THRESH_BINARY = 0,
  cv::THRESH_BINARY_INV = 1,
  cv::THRESH_TRUNC = 2,
  cv::THRESH_TOZERO = 3,
  cv::THRESH_TOZERO_INV = 4,
  cv::THRESH_MASK = 7,
  cv::THRESH_OTSU = 8,
  cv::THRESH_TRIANGLE = 16
}

3 示例

3.1 关于返回值问题

import cv2
import numpy as np

img = cv2.imread('nice.jpg',0)

# 对img进行阈值/二值化操作
re = cv2.threshold(img,125,255,1)
re_thresh,re_img = cv2.threshold(img,125,255,1)
# re, = cv2.threshold(img,125,255,1) #ValueError: too many values to unpack (expected 1)
print(re)
print(re_thresh)
print(re_img)
# re[0] == re_thresh 阈值, re[1] == re_img 输出图像

3.2 阈值类型

1)二进制阈值化(THRESH_BINARY = 0)

import cv2
import numpy as np

# 以单通道形式读取图像,
img = cv2.imread('nice.jpg',0)

# 对img进行阈值/二值化操作
re_thresh,re_img = cv2.threshold(img,125,255,0)

# 先对图像进行输出,观察图像的变化
cv2.imshow("img",img)
cv2.imshow('re_img',re_img)
cv2.waitKey()

# 图像数组降维(一维)
# 再将其集合处理,观察数组中的元素个数
# 很明显经过二值化处理后的元素个数减少很多
img = np.ravel(img)
re_img = np.ravel(re_img)
print(set(img))
print(set(re_img))

运行

集合输出如下

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255}
{0, 255}

集合数据内容

在这里可以再温习以下 numpy 辨异 (五)—— numpy.ravel() vs numpy.flatten()

备注,导入的图像是RGB 3通道时并没有报错

# 去掉后面的通道限制 0
img = cv2.imread('nice.jpg')

2)反二进制阈值化( THRESH_BINARY_INV = 1)、2、3、4对应图像

参考:

https://docs.opencv.org/3.0.0/d7/d1b/group__imgproc__misc.html#ggaa9e58d2860d4afa658ef70a9b1115576a19120b1a11d8067576cc24f4d2f03754

OpenCV基础——threshold函数的使用

threshold —— opencv阈值操作

基本的阈值操作(赞)

numpy 辨异 (五)—— numpy.ravel() vs numpy.flatten()

OpenCV 学习笔记03 threshold函数的更多相关文章

  1. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  2. OpenCV 学习笔记03 drawContours函数

    opencv-python   4.0.1 轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, color[, thickness[, li ...

  3. OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓

    本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...

  4. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  5. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  6. opencv学习笔记之cvSobel 函数解析

    首先,我们来开一下计算机是如何检测边缘的.以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函 ...

  7. OpenCV 学习笔记03 直线和圆检测

    检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...

  8. 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法

    虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究.   OpenCVchm文档中对cv ...

  9. OpenCV学习笔记:resize函数改变图像的大小

    OpenCV提供了resize函数来改变图像的大小,函数原型如下: , , int interpolation=INTER_LINEAR ); 参数解释: src:输入,原图像,即待改变大小的图像: ...

随机推荐

  1. 解决webstorm本地IP访问页面出错的问题,webstorm支持IP访问

    想在手机端访问webstorm做出的页面,遇到了根据IP地址访问页面错误的问题,试了网上的方法:“设置webstorm可以被外部连接访问”,依旧不能解决 解决方法: 在webstorm下:ctrl+a ...

  2. docker toolbox在win7下的安装

    1.下载安装docker toolbox docker toolbox的下载地址: http://mirrors.aliyun.com/docker-toolbox/windows/docker-to ...

  3. C++中引用传递与指针传递的区别

    最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真 ...

  4. 【Linux】Ubuntu配置服务自启动 sysv-rc-conf

    在Ubuntu下,配置服务系统开机自启动,使用的不是chkconfig,而是sysv-rc-conf. 且看如下: 安装: sudo apt-get install sysv-rc-conf 帮助信息 ...

  5. VCAP5-DCA Objective 1.3 – Configure and Manage Complex Multipathing and PSA Plug-ins

    http://virtuallyhyper.com/2012/10/vcap5-dca-objective-1-3-configure-and-manage-complex-multipathing- ...

  6. 用Github pages搭建自己制作的网页

    本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建站点的方法.发现不 ...

  7. sublime text 3中文乱码问题解决的方法

    一.首先要确保本机sublime已经有安装包管理器,假设没有.安装方法:http://blog.chinaunix.net/uid-12014716-id-4269991.html 文中的第一步:安装 ...

  8. Java多线程之创建线程的三种方式比较

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6560057.html  一:继承Thread类创建线程 1:继承Thread类定义线程子类: 2:重写run( ...

  9. JSP之include动态包含与静态包含

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6044676.html JSP中,include是一个经常用到的标签.当应用程序中所有的页面的某些部分(如标题. ...

  10. 《Cocos2d-JS 开发之旅》即将发行,Cocos2d-x联合创始人林顺作序力荐

    受电子工业出版社邀请,经过半年多的酝酿,<Cocos2d-JS 开发之旅>(作者:郑高强)已经出版了,本书详细讲述如何使用Cocos2d-JS制作HTML5游戏和原生手机游戏,另外还有部分 ...