OpenCV-图像二值化
文章目录
- 图像二值化
- 简单阈值(OTSU和Triangle)
- cv2.threshold
- 示例
- 示例
- 自适应阈值
- cv2.adaptiveThreshold
- 示例
- 手动计算阈值
- 示例
- 大图像二值化
- 示例
图像二值化
简单阈值(OTSU和Triangle)
cv2.threshold
简单阈值
threshold(src, thresh, maxval, type[, dst]) -> retval, dst
- src:表示的是图片源
- thresh:表示的是阈值(起始值)
- maxval:表示的是最大值
- type:表示的是这里划分的时候使用的是什么类型的算法
注意:
- 当选择计算方式(如:cv.THRESH_OTSU)之后,前面所定义的thresh会不起作用
- type参数:图像处理方式 | 阈值计算方法
- 图像处理方式:cv.THRESH_BINARY、cv.THRESH_BINARY_INV、cv.THRESH_TOZERO等
- 阈值计算方法:cv.THRESH_OTSU、cv.THRESH_TRIANGLE
THRESH_BINARY 二进制阈值化 -> 大于阈值为1 小于阈值为0
THRESH_BINARY_INV 反二进制阈值化 -> 大于阈值为0 小于阈值为1
THRESH_TRUNC 截断阈值化 -> 大于阈值为阈值,小于阈值不变
THRESH_TOZERO 阈值化为0 -> 大于阈值的不变,小于阈值的全为0
THRESH_TOZERO_INV 反阈值化为0 -> 大于阈值为0,小于阈值不变
参考链接:
- 图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)
- 图像处理之三角法图像二值化
- Python-OpenCV中的cv2.threshold
示例
def image_binary(image):"""图像二值化(简单阈值)"""image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 这个函数的第一个参数就是原图像,原图像应该是灰度图。# 第二个参数就是用来对像素值进行分类的阈值。# 第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值# 第四个参数指定阈值类型(图像处理方式 | cv.THRESH_OTSU、cv.THRESH_TRIANGLE表示使用OTSU、TRIANGLE的阈值计算方法)ret, binary = cv.threshold(image_gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)# ret, binary = cv.threshold(image_gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)# ret, binary = cv.threshold(image_gray, 0, 255, cv.THRESH_TOZERO | cv.THRESH_OTSU)print("threshold value: %s" % ret)cv.imshow("threshold_demo", binary)cv.imshow("image", image)
结果:
示例
def image_threshold(image):"""显示多种图像二值化方法(简单阈值)"""image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, thresh1 = cv.threshold(image_gray, 127, 255, cv.THRESH_BINARY)ret, thresh2 = cv.threshold(image_gray, 127, 255, cv.THRESH_BINARY_INV)ret, thresh3 = cv.threshold(image_gray, 127, 255, cv.THRESH_TRUNC)ret, thresh4 = cv.threshold(image_gray, 127, 255, cv.THRESH_TOZERO)ret, thresh5 = cv.threshold(image_gray, 127, 255, cv.THRESH_TOZERO_INV)titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']images = [image, thresh1, thresh2, thresh3, thresh4, thresh5]for i in range(6):plt.subplot(2, 3, i + 1), plt.imshow(images[i], cmap='gray') # 将图像按2x3铺开,以灰度图的方式显示plt.title(titles[i])plt.xticks([]), plt.yticks([])plt.show()
结果:
注意: plt.imshow默认是带点绿色的图,想要显示灰度图需要传参cmap=‘gray’。
参考链接:
- plt.imshow()
- OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
自适应阈值
在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。
当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。
因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
cv2.adaptiveThreshold
自适应阈值
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
adaptiveMethod:Int类型的,这里有两种选择,不过这两种方法最后得到的结果要减掉参数里面的C值。
- ADAPTIVE_THRESH_MEAN_C(通过平均的方法取得平均值)———阈值取自相邻区域的平均值)
- ADAPTIVE_THRESH_GAUSSIAN_C(通过高斯取得高斯值)———阈值取自相邻区域的加权和
thresholdType:同type,见threshold
blockSize:Int类型的,这个值来决定像素的邻域块有多大。
C:偏移值调整量,计算adaptiveMethod用到的参数。
注意: 这里的blockSize的值要为奇数,否则会给出这样的提示:
Assertion failed (blockSize % 2 == 1 && blockSize > 1) in cv::adaptiveThreshold
参考链接:
- OpenCV阈值操作(Threshold,AdaptiveThreshold)
示例
def threshold_adaptive(image):"""图像二值化(自适应阈值)"""img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 中值滤波img = cv.medianBlur(img, 5)ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)# 11 为 Block size, 2 为 C 值th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)th3 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)titles = ['Original Image', 'Global Threshold (v = 127)', 'Adaptive Mean Threshold', 'Adaptive Gaussian Threshold']images = [img, th1, th2, th3]for i in range(4):plt.subplot(2, 2, i + 1), plt.imshow(images[i], cmap='gray')plt.title(titles[i])plt.xticks([]), plt.yticks([])plt.show()
结果:
手动计算阈值
手动将图像二值化
示例
def threshold_custom(image):"""手动将图像二值化"""gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)h, w = gray.shape[:2]m = np.reshape(gray, [1, w*h])mean = m.sum() / (w*h) # 求出整个灰度图像的平均值print("mean:", mean)ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)cv.imshow("threshold_custom", binary)
结果:
大图像二值化
示例
def big_image_threshold(image):"""大图像二值化"""print(image.shape)cw = 256 # cw、ch定义分隔的小块的大小ch = 256h, w = image.shape[:2]gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# cv.imshow("big_image_gray", gray)for row in range(0, h, ch): # 分割图片for col in range(0, w, cw):roi = gray[row:row+ch, col:col+cw] # 获取ROI(坐标为row,col的256*256的小矩形)# 对ROI区域进行图像二值化(自适应阈值),127是256/2,将ROI分割成四个小区域分别进行dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 2)gray[row:row + ch, col:col + cw] = dstprint(np.std(dst), np.mean(dst)) # 打印ROI区域的标准差和平均值cv.imwrite("result_big_image.jpg", gray) # 保存图像
结果:
分辨率:1000 * 1398(在windows上显示的宽高,OpenMV里是1398 * 1000)
分辨率:2362 * 3425(在windows上显示的宽高,OpenMV里是3425 * 2362)
对该算法进行优化:
def big_image_threshold_pro(image):"""优化大图像二值化"""print(image.shape)cw = 600 # cw、ch定义分隔的小块的大小ch = 600h, w = image.shape[:2]gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# cv.imshow("big_image_gray", gray)for row in range(0, h, ch): # 分割图片for col in range(0, w, cw):roi = gray[row:row + ch, col:col + cw] # 获取ROI(坐标为row,col的256*256的小矩形)# 对ROI区域进行图像二值化(自适应阈值)dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 299, 2)if np.std(dst) <= 60:gray[row:row + ch, col:col + cw] = 255else:gray[row:row + ch, col:col + cw] = dstprint(np.std(dst), np.mean(dst)) # 打印ROI区域的标准差和平均值cv.imwrite("result_big_imagePro.jpeg", gray) # 保存图像
个人优化后结果(与优化前做对比):
OpenCV-图像二值化相关推荐
- OpenCV图像二值化,Python
OpenCV图像二值化,Python 原图: 二值化处理(只有黑和白): import cv2if __name__=="__main__":image = cv2.imread( ...
- OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)
1. 学习目标 理解图像的分类,不同类型的图像的区别: 对图像进行二值化处理,对[ cv.threshold ]函数的理解. 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为 ...
- [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)
参考链接: python opencv 基础6: cv2.threshold()二值图像 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明 ...
- python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例
python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...
- python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)
前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图 可以看到左边部分因为整体偏暗,导致二值化后变成全黑,丢失了所有 ...
- opencv 二值化 python_Python OpenCV 图像二值化-阈值分割
1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...
- OpenCV-Python 图像二值化
OpenCV-Python 图像二值化 一.什么是图像二值化 二.图像二值化 Ⅰ先获取阈值: Ⅱ根据阈值去二值化图像 ⅢOpenCV中的二值化方法 三.全局阈值函数cv2.threshold · 函数 ...
- OpenCV+python:图像二值化
1,图像二值化概念及方法 一个像素点的颜色是由RGB三个值来表现的,所以一个像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,它们也都是同样大小的矩阵. 在图像处理中,用RGB三个分量(R ...
- 【OpenCV 4开发详解】图像二值化
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法
Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录
最新文章
- java bean配置文件_Spring中多配置文件及引用其他bean的方式
- 《数据库系统概念》7-函数、存储过程、触发器
- [BUUCTF-pwn]——ciscn_2019_n_1
- eclipse 的help没有Eclipse Marketplace
- [省选联考 2020 A/B 卷] 冰火战士(树状数组上二分)
- wpf和winform的那点区别
- java.lang.NoClassDefFoundError: Could not initialize class org.apache.batik.bridge.CursorManager
- Chipmunk2D中文手册
- 成功解决 ValueError: Not a TBLoader or TBPlugin subclass: <class ‘tensorboard_plugin_wit.wit_plugin_load
- 中规中矩的linux安装jdk 1.8
- 潭州学院html学习(day03)
- zend及Slim 漏洞合集
- 南京大学计算机 吴迪,南京大学(共206人).doc
- 从安格视,安维到安尼
- 获取当前时间和一年后时间(中国标准时间)时间处理
- 世界上鲜为人知的100件事
- 【数据分析】用户价值分析
- 部分银行卡号规则(二)
- [Paper]Application of deep convolutional neural network for automated detection of myocardial...
- 数字冰雹入选2020爱分析·数据智能厂商全景报告