【基础】基础的图像阈值处理

1. 阈值处理函数

openCV提供cv2.threshold()函数用于图像阈值化处理,其函数格式如下:

retval, dst = cv2.threshold(src, thresh, maxval, type, dst=None)
  • retval:返回的阈值。

  • dst阈值分割结果,与原始图像具有相同的大小和类型。

  • src:要进行阈值分割的图像。

  • thresh:设定的阈值。

  • maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)所赋予的值

  • type:代表阈值分割的类型,常用的有:

    • cv2.THRESH_BINARY

    • cv2.THRESH_BINARY_INV

    • cv2.THRESH_TRUNC

    • cv2.THRESH_TOZERO

    • cv2.THRESH_TOZERO_INV

    注:INV 即 Inverted 的缩写,表示: 倒转,颠倒,倒置。

2. 阈值二值化(Threshold Binary)

首先指定灰度值的阈值,遍历图像中像素值。

  • 如果像素的灰度值>这个阈值,则将这个像素设置为最大像素值;

  • 若像素的灰度值小于阈值,则将该像素点像素值赋值为0。

img

小验证:

image.png

3. 阈值反二值化(Threshold Binary Inverted)

首先也要指定一个阈值,不同的是在对图像进行阈值化操作时与阈值二值化相反

  • 当像素的灰度值超过这个阈值的时候为该像素点赋值为0;

  • 当该像素的灰度值低于该阈值时赋值为最大值。

img

小验证:

image.png

4. 截断(Truncate)

给定像素值阈值,在图像中像素的灰度值

  • 大于该阈值的像素点被设置为该阈值;

  • 小于该阈值的像素值保持不变。

img

小验证:

image.png

5. 阈值取零(Threshold To Zero)

与截断阈值化相反,

  • 如果像素点的灰度值如果大于该阈值,则像素值不变;

  • 如果像素点的灰度值小于该阈值,则该像素值设置为0。

img

小验证:

image.png

6. 阈值反取零(Threshold To Zero Inverted)

像素值大于阈值的像素赋值为0,而小于该阈值的像素值则保持不变,

https://pic3.zhimg.com/80/v2-b40fe3a58559a38362833efbb9f64726_1440w.png

小验证:

image.png

7. 程序演示

"""
Author: Will Wang
Email: WillWang1998@163.com
"""
import cv2
import numpy as np

gray = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
gray = cv2.resize(gray, (350, 350))

retval1, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
retval2, binaryinv = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
retval3, trunc = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)
retval4, tozero = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO)
retval5, tozeroinv = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO_INV)

image_stack1 = np.hstack((gray, binary, binaryinv))
image_stack2 = np.hstack((trunc, tozero, tozeroinv))

cv2.imshow('gray, binary, binaryinv', image_stack1)
cv2.imshow('trunc, tozero, tozeroinv', image_stack2)

cv2.waitKey(0)
cv2.destroyAllWindows()

image.png