【OpenCV 完整例程】37. 图像的灰度化处理和二值化处理

【OpenCV 完整例程】37. 图像的灰度化处理和二值化处理

欢迎关注 『OpenCV 完整例程 100 篇』 系列,持续更新中
欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中

按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。

  • 二值图像:只有黑色和白色两种颜色的图像。每个像素点可以用 0/1 表示,0 表示黑色,1 表示白色。
  • 灰度图像:只有灰度的图像。每个像素点用 8bit 数字 [0,255] 表示灰度,如:0 表示纯黑,255 表示纯白。
  • 彩色图像:彩色图像通常采用红色(R)、绿色(G)和蓝色(B)三个色彩通道的组合表示。

OpenCV 中彩色图像使用 BGR 格式。彩色图像进行灰度化处理,可以在读取图像文件时直接读取为灰度图像,也可以通过颜色空间转换函数 cv2.cvtColor 将彩色图像转换为灰度图像。

灰度化处理相关函数和例程介绍,详见 [OpenCV 学习课-2.图像读取与显示]。

# 1.1 图像的读取
    imgFile = "../images/imgLena.tif"  # 读取文件的路径
    img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
    img2 = cv2.imread(imgFile, flags=0)  # flags=0 读取为灰度图像

# 1.10 图像显示(plt.imshow)
    imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)  # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
    imGray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)  # 图片格式转换:BGR(OpenCV) -> Gray    

进一步地,通过函数 cv2.threshold 可以对图像进行二值化处理。

函数说明:

cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst

函数 threshold() 可以将灰度图像转换为二值图像,图像完全由像素 0 和 255 构成,呈现出只有黑白两色的视觉效果。

灰度阈值化通过选取的灰度阈值 thresh,将每个像素的灰度值与阈值进行比较,将灰度大于阈值的像素点置为最大灰度,小于阈值的像素点置为最小灰度,得到二值图像,可以突出图像轮廓,把目标从背景中分割出来。

参数说明:

  • scr:变换操作的输入图像,nparray 二维数组,必须是单通道灰度图像!
  • thresh:阈值,取值范围 0~255
  • maxval:填充色,取值范围 0~255,一般取 255
  • type:变换类型
    • cv2.THRESH_BINARY:大于阈值时置 255,否则置 0
    • cv2.THRESH_BINARY_INV:大于阈值时置 0,否则置 255
    • cv2.THRESH_TRUNC:大于阈值时置为阈值 thresh,否则不变(保持原色)
    • cv2.THRESH_TOZERO:大于阈值时不变(保持原色),否则置 0
    • cv2.THRESH_TOZERO_INV:大于阈值时置 0,否则不变(保持原色)
    • cv2.THRESH_OTSU:使用 OTSU 算法选择阈值
  • 返回值 retval:返回二值化的阈值
  • 返回值 dst:返回阈值变换的输出图像

注意:

  1. 函数 cv2.threshold 进行固定阈值的二值化处理;函数 cv2.adaptiveThreshold 为自适应阈值的二值化处理函数,可以通过比较像素点与周围像素点的关系动态调整阈值。
  2. 确切地说,只有 type 为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV 时输出为二值图像,其它变换类型时进行阈值处理但并不是二值处理。

例程:1.47 图像的二值变换(固定阈值)

    # 1.47 固定阈值二值变换
    img = cv2.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)
    imgGray = cv2.imread("../images/imgLena.tif", flags=0)  # flags=0 读取为灰度图像
    # imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 颜色转换:BGR(OpenCV) -> Gray

    # cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
    ret1, img1 = cv2.threshold(imgGray, 63, 255, cv2.THRESH_BINARY)  # 转换为二值图像, thresh=63
    ret2, img2 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY)  # 转换为二值图像, thresh=127
    ret3, img3 = cv2.threshold(imgGray, 191, 255, cv2.THRESH_BINARY)  # 转换为二值图像, thresh=191
    ret4, img4 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY_INV)  # 逆二值图像,BINARY_INV
    ret5, img5 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_TRUNC)  # TRUNC 阈值处理,THRESH_TRUNC
    ret6, img6 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_TOZERO)  # TOZERO 阈值处理,THRESH_TOZERO

    plt.figure(figsize=(9, 6))
    titleList = ["1. BINARY(thresh=63)", "2. BINARY(thresh=127)", "3. BINARY(thresh=191)", "4. THRESH_BINARY_INV", "5. THRESH_TRUNC", "6. THRESH_TOZERO"]
    imageList = [img1, img2, img3, img4, img5, img6]
    for i in range(6):
        plt.subplot(2, 3, i+1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], 'gray')  # 灰度图像 ndim=2
    plt.show()

【OpenCV 完整例程】37. 图像的灰度化处理和二值化处理_第1张图片


(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接

Copyright 2021 youcans, XUPT

Crated:2021-11-18


欢迎关注 『OpenCV 完整例程 100 篇』 系列,持续更新中
欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中

【OpenCV 完整例程】01. 图像的读取(cv2.imread)
【OpenCV 完整例程】02. 图像的保存(cv2.imwrite)
【OpenCV 完整例程】03. 图像的显示(cv2.imshow)
【OpenCV 完整例程】04. 用 matplotlib 显示图像(plt.imshow)
【OpenCV 完整例程】05. 图像的属性(np.shape)
【OpenCV 完整例程】06. 像素的编辑(img.itemset)
【OpenCV 完整例程】07. 图像的创建(np.zeros)
【OpenCV 完整例程】08. 图像的复制(np.copy)
【OpenCV 完整例程】09. 图像的裁剪(cv2.selectROI)
【OpenCV 完整例程】10. 图像的拼接(np.hstack)
【OpenCV 完整例程】11. 图像通道的拆分(cv2.split)
【OpenCV 完整例程】12. 图像通道的合并(cv2.merge)
【OpenCV 完整例程】13. 图像的加法运算(cv2.add)
【OpenCV 完整例程】14. 图像与标量相加(cv2.add)
【OpenCV 完整例程】15. 图像的加权加法(cv2.addWeight)
【OpenCV 完整例程】16. 不同尺寸的图像加法
【OpenCV 完整例程】17. 两张图像的渐变切换
【OpenCV 完整例程】18. 图像的掩模加法
【OpenCV 完整例程】19. 图像的圆形遮罩
【OpenCV 完整例程】20. 图像的按位运算
【OpenCV 完整例程】21. 图像的叠加
【OpenCV 完整例程】22. 图像添加非中文文字
【OpenCV 完整例程】23. 图像添加中文文字
【OpenCV 完整例程】23. 图像添加中文文字
【OpenCV 完整例程】24. 图像的仿射变换
【OpenCV 完整例程】25. 图像的平移
【OpenCV 完整例程】26. 图像的旋转(以原点为中心)
【OpenCV 完整例程】27. 图像的旋转(以任意点为中心)
【OpenCV 完整例程】28. 图像的旋转(直角旋转)
【OpenCV 完整例程】29. 图像的翻转(cv2.flip)
【OpenCV 完整例程】30. 图像的缩放(cv2.resize)
【OpenCV 完整例程】31. 图像金字塔(cv2.pyrDown)
【OpenCV 完整例程】32. 图像的扭变(错切)
【OpenCV 完整例程】33. 图像的复合变换
【OpenCV 完整例程】34. 图像的投影变换
【OpenCV 完整例程】35. 图像的投影变换(边界填充)
【OpenCV 完整例程】36. 直角坐标与极坐标的转换
【OpenCV 完整例程】37. 图像的灰度化处理和二值化处理

你可能感兴趣的:(OpenCV,完整例程,100,篇,python,opencv,计算机视觉)