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:输入,原图像,即待改变大小的图像: ...
随机推荐
- WIN10系统 截图或者某些程序时屏幕会自动放大怎么办
右击这个应用程序,兼容性,以兼容模式运行,同时勾选高DPI设置时禁止显示缩放即可
- LintCode: Delete Node in the Middle of Singly Linked List
开始没看懂题目的意思,以为是输入一个单链表,删掉链表中间的那个节点. 实际的意思是,传入的参数就是待删节点,所以只要把当前节点指向下一个节点就可以了. C++ /** * Definition of ...
- ZH奶酪:如何在Ubuntu上安装Java/管理多个JAVA/设置JAVA_HOME
0.简介 Java的地位及重要性,大家都懂的,很多软件都依赖于jdk,在Ubuntu上安装Java的选择有很多,openJDK,Oracle Jdk... 1.安装默认 JRE/JDK(可选) 这是最 ...
- Python3中使用Mysql的用法。
一.Python2中一般使用MySqldb来调用Mysql,但是在Python3中不支持该包,使用pymysql来代替了,用法一模一样. 二.安装: pip install pymysql 三.例子: ...
- dynamicpdf文件打印
function printForm(PD_ID, sREP_ID) { var data = { id: '#SID#', t: '' + new Date(), PrintAction: 'Pri ...
- 架构师速成7.3-devops为什么非常重要
evops是一个非常高大上的名字,事实上说的简单点就是开发和运维本身就是一个团队的,要干就一起把事情干好.谁出了问题,站点都不行. 作为一个架构师.必需要devops,并且要知道怎样推行devops. ...
- LLVM lli llc
http://zke1ev3n.me/2016/01/18/%E5%9F%BA%E4%BA%8ELLVM%E7%9A%84%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7%86/ h ...
- Spring Boot 之 RESTfull API简单项目的快速搭建(二)
1.打包 -- Maven build 2.问题 [WARNING] The requested profile "pom.xml" could not be activated ...
- Shell与Bash
1:Shell编程的本质 Shell的意思是“壳程序”,它是一个视窗,供我们交互. 系统中有许多负责不同功能的可执行文件,他们被添加到PATH变量后,我们就可以在Shell中通过命令行调用.这些这些可 ...
- 排序基础之插入排序、冒泡排序、选择排序详解与Java代码实现
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594533.html 一:插入排序==逐个往前相邻数比较交换,小的在前 第一轮:A[1]与A[0]比较,小的 ...
