OpenCV图像处理(十二)---图像阈值化

2022-06-01 19:12:43 浏览数 (2)

如果两个热力学系统中的每一个都与第三个热力学系统处于热平衡(温度相同),则它们彼此也必定处于热平衡。这一结论称做“热力学第零定律”。又称热平衡定律,是热力学的四条基本定律之一,是一个关于互相接触的物体在热平衡时的描述,以及为温度提供理论基础。

前言

在上期的文章中,我们简要学习了有关图像梯度的知识,中间用数学知识进行了解读,最后用一句话进行了概括,今天,我们将继续学习图像的有关知识--图像阈值化(二值化)。

一、图像阈值化

图像阈值化(也叫二值化),就是将图像上每一个像素点的像素值设置为一个定值,一般为0(黑色)或者白色(255),最后整个图像将会表现出出黑和白的观察效果。

  通常情况下,一幅图像糊了包含目标物体、还会包含背景和各种噪声(阈值化后噪声可能就是一些小白点),想要得到目标物体,常用的方法就是设定一个阈值,用阈值将图像的像素分割成两部分:大于阈值的像素和小于T的像素,所以也称为图像的二值化。

1.1 原始图像

(夜幕降临的城市)

1.2 代码实践

代码语言:javascript复制
import cv2
import numpy as np

# OpenCV阈值化函数实践
def img_thres(coor_image):
    # 根据官方解释,第一步图像输入必须是灰度图像,
    image_gray = cv2.cvtColor(coor_image, 0)
    # 显示原始图像,后面进行对比
    cv2.imshow("src_image", image_gray)

    #-----------------实例一----------------------

    #函数第四个参数采用 cv2.THRESH_BINARY_INV
    # 阈值为50,大于50的像素值设定为0, 小于的就是200
    what1, image_thresh_50 = cv2.threshold(image_gray, 50, 200, cv2.THRESH_BINARY_INV)
    print("what1:{}".format(what1))
    cv2.imshow("dst_thresh_50", image_thresh_50)
    
    #-----------------实例二----------------------

    # 函数第四个参数采用cv.THRESH_BINARY
    # 阈值为30,大于30的的像素值设定为230(一般为白色) 小于30的就是0像素值
    what2, image_thresh_30 = cv2.threshold(image_gray, 30, 230, cv2.THRESH_BINARY)
    #打印看看返回值是啥?
    print("what2:{}".format(what2))
    cv2.imshow("dst_thresh_30", image_thresh_30)


    # #-----------------实例三----------------------
    #函数第四个参数采用 cv2.THRESH_TRUNC
    # 截断 大于70的像素值设定为70  小于70的像素不变
    what3, image_thresh_70 = cv2.threshold(image_gray, 70, 180, cv2.THRESH_TRUNC)
    print("what3:{}".format(what3))
    cv2.imshow("dst_thresh_70", image_thresh_70)

    # #-----------------实例四----------------------
    # 截断 小于140的像素值设定为140  大于140的像素值不变
    what4, image_thresh_140 = cv2.threshold(image_gray, 140, 200, cv2.THRESH_TOZERO)
    print("what4:{}".format(what4))
    cv2.imshow("dst_thresh_140", image_thresh_140)

if __name__ == '__main__':
    coor_image = cv2.imread("./1.jpg")
    img_thres(coor_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在opencv的教程网站中,我们能够找到这样一段话:If pixel value is greater than a threshold value, it is assigned one value (may be white), else it is assigned another value (may be black).First argument is the source image, which should be a grayscale image. Second argument is the threshold value which is used to classify the pixel values. Third argument is the maxVal which represents the value to be given if pixel value is more than (sometimes less than) the threshold value.

总结上述:

代码语言:javascript复制
cv2.threshold(src, thresh, maxval, type, dst=None)

第一个参数 src : 指原图像(根据上述英文原图像应该是灰度图)。

第二个参数 x : 阈值大小(超过或低于这个大小都会被处理)。

第三个参数 y : 最大值(当超过或低于第二个参数时,一般就设定为第三个值)

第四个参数 Methods :那到底是低于设定为最大值还是高于设定为最大值呢,就看第三个参数的类型了。

method阈值类型一般有以下几种:

cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0

cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值

cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变

cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0

cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变

附上一张图片,以便观察:

其中dst表示目标图像,src表示原始图像,将原始图像的单个像素与阈值作比较,超过限定的原始原始像素变为相应的最大值或0(也就是目标像素是0或最大值)

1.3 效果展示

(各种阈值化操作后的结果)

结语

今天的分享到此结束了,阈值化操作很实用哦,特别是以后的去除噪点,图像分割等等都会涉及到一定的阈值操作,大家一定好学会哦。

我们下期再见!

编辑:玥怡居士|审核:小圈圈居士

0 人点赞