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:输入,原图像,即待改变大小的图像: ...
随机推荐
- JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...
- 【树形DP】 HDU 2412 Party at Hali-Bula
给出根节点(BOSS) 然后还有N-1个边 A B 由B指向A (B为A 的上司) 每次仅仅能选择这个关系中的当中一个 求最多选几个点 而且输出是不是唯一的 重点推断是否唯一: 1.若下属不去和去都 ...
- asp.net对象合并
public class com { /// <summary> /// 把参数转为JSON字符串 /// </summary> /// <param name=&quo ...
- 让你的ASP.NET虚拟主机也支持子网站
现在asp.net虚拟主机一般都可以绑定多个域名,但是通过这几个域名打开的页面都一样.如何使绑的这几个域名分别打开不通的页面(即实现子网站的功能)呢? 其实很简单,只需4个步骤: 1)给虚拟主机 ...
- Lintcode: Add Binary
C++ class Solution { public: /** * @param a a number * @param b a number * @return the result */ str ...
- 解决工作中遇到的一个"打开,保存"文件框的bug的过程
工作中遇到的这个问题还是很有意思的.其中嵌套了很多奇葩性的问题. (转载请指明出于breaksoftware的csdn博客) 我们来看下故事的发生过程,QA同学发现我们存在如下的bug 看到如此多的串 ...
- vasa构架
- 转:NGNIX模块开发——nginx的配置系统
From:http://tengine.taobao.org/book/chapter_02.html nginx的配置系统 nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成.这些配置 ...
- java面试第二天
局部变量:不是声明在类体括号里面的变量 (1)必须要先赋值,后使用,否则通不过编译,局部变量没有默认初始化值 (2)作用范围:定义开始到定义它的代码块结束 (3)同一范围内,不允许2个局部变量命名冲突 ...
- 双足步行机器人的ZMP与CoP检测
静态步行与动态步行 机器人步态分为静态步行和动态步行.当机器人做静态步行运动时,身体的各个部分运动速度很小,机器人的整体稳定性较易控制.静态步行稳定性采用机器人的重心地面投影点(Center of G ...