OpenCV 学习笔记03 threshold函数
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对应图像
参考:
基本的阈值操作(赞)
numpy 辨异 (五)—— numpy.ravel() vs numpy.flatten()
OpenCV 学习笔记03 threshold函数的更多相关文章
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- OpenCV 学习笔记03 drawContours函数
opencv-python 4.0.1 轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, color[, thickness[, li ...
- OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓
本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数
凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...
- opencv学习笔记之cvSobel 函数解析
首先,我们来开一下计算机是如何检测边缘的.以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函 ...
- OpenCV 学习笔记03 直线和圆检测
检测边缘和轮廓不仅重要,还经常用到,它们也是构成其他复杂操作的基础. 直线和形状检测与边缘和轮廓检测有密切的关系. 霍夫hough 变换是直线和形状检测背后的理论基础.霍夫变化是基于极坐标和向量开展的 ...
- 【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法
虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究. OpenCVchm文档中对cv ...
- OpenCV学习笔记:resize函数改变图像的大小
OpenCV提供了resize函数来改变图像的大小,函数原型如下: , , int interpolation=INTER_LINEAR ); 参数解释: src:输入,原图像,即待改变大小的图像: ...
随机推荐
- 解决webstorm本地IP访问页面出错的问题,webstorm支持IP访问
想在手机端访问webstorm做出的页面,遇到了根据IP地址访问页面错误的问题,试了网上的方法:“设置webstorm可以被外部连接访问”,依旧不能解决 解决方法: 在webstorm下:ctrl+a ...
- docker toolbox在win7下的安装
1.下载安装docker toolbox docker toolbox的下载地址: http://mirrors.aliyun.com/docker-toolbox/windows/docker-to ...
- C++中引用传递与指针传递的区别
最近Garena面试的过程中,面试官提了一个问题,C++中引用传递和指针传递的区别? 根据自己的经验,联想到了swap函数,只知道既可以用引用来实现,又可以用指针传递来实现,至于二者有何区别,自己还真 ...
- 【Linux】Ubuntu配置服务自启动 sysv-rc-conf
在Ubuntu下,配置服务系统开机自启动,使用的不是chkconfig,而是sysv-rc-conf. 且看如下: 安装: sudo apt-get install sysv-rc-conf 帮助信息 ...
- 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- ...
- 用Github pages搭建自己制作的网页
本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建站点的方法.发现不 ...
- sublime text 3中文乱码问题解决的方法
一.首先要确保本机sublime已经有安装包管理器,假设没有.安装方法:http://blog.chinaunix.net/uid-12014716-id-4269991.html 文中的第一步:安装 ...
- Java多线程之创建线程的三种方式比较
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6560057.html 一:继承Thread类创建线程 1:继承Thread类定义线程子类: 2:重写run( ...
- JSP之include动态包含与静态包含
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6044676.html JSP中,include是一个经常用到的标签.当应用程序中所有的页面的某些部分(如标题. ...
- 《Cocos2d-JS 开发之旅》即将发行,Cocos2d-x联合创始人林顺作序力荐
受电子工业出版社邀请,经过半年多的酝酿,<Cocos2d-JS 开发之旅>(作者:郑高强)已经出版了,本书详细讲述如何使用Cocos2d-JS制作HTML5游戏和原生手机游戏,另外还有部分 ...