文章目录

  • 图像二值化
    • 简单阈值(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-图像二值化相关推荐

  1. OpenCV图像二值化,Python

    OpenCV图像二值化,Python 原图: 二值化处理(只有黑和白): import cv2if __name__=="__main__":image = cv2.imread( ...

  2. OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别: 对图像进行二值化处理,对[ cv.threshold ]函数的理解. 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为 ...

  3. [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)

    参考链接: python opencv 基础6: cv2.threshold()二值图像 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明 ...

  4. python opencv图像二值化函数_python opencv 二值化 计算白色像素点的实例

    python opencv 二值化 计算白色像素点的实例 贴部分代码 #! /usr/bin/env python # -*- coding: utf-8 -*- import cv2 import ...

  5. python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)

    前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明显的明暗不同的区域,如下图 可以看到左边部分因为整体偏暗,导致二值化后变成全黑,丢失了所有 ...

  6. opencv 二值化 python_Python OpenCV 图像二值化-阈值分割

    1.二值化处理 # 手动二值化处理 # 设置阈值大小 threshold thresh = 125 # 设置超过阈值像素值的最大值 maxval = 255 # THRESH_BINARY:超过阈值为 ...

  7. OpenCV-Python 图像二值化

    OpenCV-Python 图像二值化 一.什么是图像二值化 二.图像二值化 Ⅰ先获取阈值: Ⅱ根据阈值去二值化图像 ⅢOpenCV中的二值化方法 三.全局阈值函数cv2.threshold · 函数 ...

  8. OpenCV+python:图像二值化

    1,图像二值化概念及方法 一个像素点的颜色是由RGB三个值来表现的,所以一个像素点矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,它们也都是同样大小的矩阵. 在图像处理中,用RGB三个分量(R ...

  9. 【OpenCV 4开发详解】图像二值化

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  10. Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法

    Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录

最新文章

  1. java bean配置文件_Spring中多配置文件及引用其他bean的方式
  2. 《数据库系统概念》7-函数、存储过程、触发器
  3. [BUUCTF-pwn]——ciscn_2019_n_1
  4. eclipse 的help没有Eclipse Marketplace
  5. [省选联考 2020 A/B 卷] 冰火战士(树状数组上二分)
  6. wpf和winform的那点区别
  7. java.lang.NoClassDefFoundError: Could not initialize class org.apache.batik.bridge.CursorManager
  8. Chipmunk2D中文手册
  9. 成功解决 ValueError: Not a TBLoader or TBPlugin subclass: <class ‘tensorboard_plugin_wit.wit_plugin_load
  10. 中规中矩的linux安装jdk 1.8
  11. 潭州学院html学习(day03)
  12. zend及Slim 漏洞合集
  13. 南京大学计算机 吴迪,南京大学(共206人).doc
  14. 从安格视,安维到安尼
  15. 获取当前时间和一年后时间(中国标准时间)时间处理
  16. 世界上鲜为人知的100件事
  17. 【数据分析】用户价值分析
  18. 部分银行卡号规则(二)
  19. [Paper]Application of deep convolutional neural network for automated detection of myocardial...
  20. 数字冰雹入选2020爱分析·数据智能厂商全景报告

热门文章

  1. Learning to Rank 简介
  2. Codeforces 1129C - Morse Code
  3. unpacked value/target cannot be used in assignment
  4. 前端面试不用怕!一分钟带你了解es6的解构赋值
  5. 按PEP8风格自动排版Python代码
  6. 名片管理系统python详解_详解Python做一个名片管理系统
  7. 简洁的PHP图床源码烟雨图床程序源码
  8. JavaScript注释(多行注释+单行注释)
  9. 数据结构::递归时间复杂度的计算
  10. 〖EXP〗Ladon打印机漏洞提权CVE-2021-1675复现