python+OpenCV笔记(二十一):图像阈值化(threshold、adaptiveThreshold)

        图像阈值化是图像分割的方法,而分割本身是将图像按强度、颜色或者任何其他图像属性区分为不同的相关像素组的过程。

        OpenCV中有两个最基本的图像分割方法:threshold、adaptiveThreshold。

一、threshold

OpenCV API:

ret, dst = cv2.threshold(src, thresh, maxval, type)

参数:

  1. src:输入的图像(只能为单通道图像,例如灰度图)
  2. thresh:阈值。通过阈值水平的像素被接受,不通过的则不接受。
  3. maxVal:方法中用到的阈值。
  4. type:二值化操作的类型,包含以下5种类型:
    方法 说明
    cv2.THRESH_BINARY 超过阈值的像素设置为maxVal,不超过的设置为0
    cv2.THRESH_BINARY_INV 不超过阈值的像素设置为maxVal,超过的设置为0
    cv2.THRESH_TRUNC 超过阈值的设为thresh
    cv2.THRESH_TOZERO 低于阀值的设为0
    cv2.THRESH_TOZERO_INV 低于阀值的设为maxVal

返回值:

  1. ret:用于阈值化的值,等同于thresh
  2. dst:阈值化后生成的图像

代码编写

下面,我们用阈值函数筛选出图像中接近黑色的像素

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

src = cv.imread("E:\\qi.png")
img = src.copy()

# 1. BGR->GRAY
# 2. 图像阈值化(小于60接受,并且设置为maxVal,不接受的设置为0)
# 3. GRAY->BGR
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, dst = cv.threshold(img, 60, 255, cv.THRESH_BINARY_INV)
dst = cv.cvtColor(dst, cv.COLOR_GRAY2BGR)

# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(src[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("结果")
plt.show()

二、 adaptiveThreshold

        该函数用来对灰度图应用自适应阈值,取决于传递给它的自适应方法。

        该函数可以单独地、自动地计算每个像素的阈值,但仍需要传递几个参数,包括最大阈值,块大小(可以是3、5、7等)以及一个将从计算得到的块均值中减去的常量值,该值可以为0。

OpenCV API:

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数:

  1. src,maxValue,threshType等同于上文中的(src,maxVal,type)。
  2. adaptiveMethod:包含以下2种类型:
    1. cv2.ADAPTIVE_THRESH_MEAN_C
    2. cv2.ADAPTIVE_THRESH_GAUSSIAN_C
  3. blockSize:图片分块的大小
  4. C:常量值
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

src = cv.imread("E:\\qi.png")
img = src.copy()

# 1. BGR->GRAY
# 2. 自适应阈值化
# 3. GRAY->BGR
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
dst = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C
                           , cv.THRESH_BINARY_INV, 7, 0)
dst = cv.cvtColor(dst, cv.COLOR_GRAY2BGR)

# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(src[:, :, ::-1])
axes[0].set_title("原图")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("结果")
plt.show()

猜你喜欢

转载自blog.csdn.net/qq_45832961/article/details/122511320