《数字图像处理-OpenCV/Python》连载:图像的阈值处理

《数字图像处理-OpenCV/Python》连载:图像的阈值处理


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第 9 章 图像的阈值处理


图像的阈值处理简单、直观,计算速度快,是很多图像处理算法的预处理过程。


本章内容概要

  • 学习图像的阈值处理方法,理解不同阈值对处理结果的影响。
  • 介绍利用图像局部特征的阈值处理方法,如自适应阈值处理和移动平均阈值处理。
  • 介绍HSV模型,学习基于HSV颜色范围的彩色图像阈值处理。

9.1 固定阈值处理

根据灰度值和灰度值的限制将图像划分为多个区域,或提取图像中的目标物体,是最基本的阈值处理方法。

当图像中的目标和背景的灰度分布较为明显时,可以对整个图像使用固定阈值进行全局阈值处理。如果图像的直方图存在明显边界,则很容易找到图像的分割阈值,但如果图像的直方图分界不明显,则很难找到合适的阈值,甚至可能无法找到固定阈值有效地分割图像。

当图像中存在噪声时,通常难以通过全局阈值将图像的边界完全分开。如果图像的边界是在局部对比下出现的,使用全局阈值的效果会很差。

OpenCV中的函数cv.threshold用于对图像进行阈值处理。

函数原型

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

参数说明

  • src:输入图像,是多维Numpy数组,允许为单通道图像或多通道图像。
  • dst:输出图像,与src的尺寸和通道数相同。
  • thresh:阈值,是浮点型数据,取值范围为0~255。
  • maxval:最大值,指饱和限值,用于部分变换类型,一般可取255。
  • type:阈值变换类型。
    • THRESH_BINARY:当大于阈值thresh时置为maxval,否则置为0。
    • THRESH_BINARY_INV:当大于阈值thresh时置为0,否则置为maxval。
    • THRESH_TRUNC:当大于阈值thresh时置为阈值thresh,否则保持不变。
    • THRESH_TOZERO:当大于阈值thresh时保持不变,否则置为0。
    • THRESH_TOZERO_INV:当大于阈值thresh时置为0,否则保持不变。
    • THRESH_OTSU:使用OTSU算法自动确定阈值,可以组合使用。
    • THRESH_TRIANGLE:使用Triangle算法自动确定阈值,可以组合使用。
  • retval:返回的阈值图像。

注意问题
(1)retval通常是二值化的阈值图像,但在某些类型(如TRUNC、TOZERO、TOZERO_INV)中返回的是阈值饱和图像。
(2)函数允许输入单通道或多通道图像,但是输入多通道图像时,要对各通道独立进行阈值处理。返回的阈值图像也是多通道图像,而不是黑白的二值图像,在使用时要特别谨慎。
(3)阈值变换类型为使用OTSU算法、Triangle算法时,只能处理8位单通道输入图像。
(4)阈值变换类型为使用OTSU算法、Triangle算法时,阈值thresh不起作用。


【例程0901】阈值处理之固定阈值法

本例程使用固定阈值法对灰度图像进行阈值处理。对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。


# 【0901】阈值处理之固定阈值法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

if __name__ == '__main__':
    # 生成灰度图像
    hImg, wImg = 512, 512
    img = np.zeros((hImg, wImg), np.uint8)  # 创建黑色图像
    cv.rectangle(img, (60, 60), (450, 320), (127, 127, 127), -1)  # 矩形填充
    cv.circle(img, (256, 256), 120, (205, 205, 205), -1)  # 圆形填充
    # 添加高斯噪声
    mu, sigma = 0.0, 20.0
    noiseGause = np.random.normal(mu, sigma, img.shape)
    imgNoise = np.add(img, noiseGause)
    imgNoise = np.uint8(cv.normalize(imgNoise, None, 0, 255, cv.NORM_MINMAX))

    # 阈值处理
    _, imgBin1 = cv.threshold(imgNoise, 63, 255, cv.THRESH_BINARY)  # thresh=63
    _, imgBin2 = cv.threshold(imgNoise, 125, 255, cv.THRESH_BINARY)  # thresh=125
    _, imgBin3 = cv.threshold(imgNoise, 175, 255, cv.THRESH_BINARY)  # thresh=175

    plt.figure(figsize=(9, 6))
    plt.subplot(231), plt.axis('off'), plt.title("1. Original"), plt.imshow(img, 'gray')
    plt.subplot(232), plt.axis('off'), plt.title("2. Noisy image"), plt.imshow(imgNoise, 'gray')
    histCV = cv.calcHist([imgNoise], [0], None, [256], [0, 256])
    plt.subplot(233, yticks=[]), plt.title("3. Gray hist")
    plt.bar(range(256), histCV[:, 0]), plt.axis([0, 255, 0, np.max(histCV)])
    plt.subplot(234), plt.axis('off'), plt.title("4. threshold=63"), plt.imshow(imgBin1, 'gray')
    plt.subplot(235), plt.axis('off'), plt.title("5. threshold=125"), plt.imshow(imgBin2, 'gray')
    plt.subplot(236), plt.axis('off'), plt.title("6. threshold=175"), plt.imshow(imgBin3, 'gray')
    plt.tight_layout()
    plt.show()


程序说明:
(1) 运行结果,使用固定阈值法对图像进行阈值处理如图9-1所示。图9-1(1)所示为程序生成的测试图,图9-1(2)所示为在图9-1(1)上添加了高斯噪声,图9-1(3)所示为图9-1(2)的灰度直方图,具有3个显著的灰度峰值分布。
(2) 图9-1(4)~(6)所示为不同阈值对图9-1(2)进行阈值处理所得到的二值图像,结果是完全不同的。表明对于多峰灰度分布图像,阈值大小会严重影响阈值处理的结果。
(3) 图9-1(4)~(6)的分割结果中都带有大量噪点,表明噪点也会影响阈值处理的结果。

图9-1 使用固定阈值法对图像进行阈值处理在这里插入图片描述
**


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/135164986)
Copyright 2023 youcans, XUPT
Crated:2023-12-23

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

猜你喜欢

转载自blog.csdn.net/youcans/article/details/135164986