风雨兼程

  • 4

    获得赞
  • 6

    发布的文章
  • 0

    答辩的项目

OpenCV实践第三期:图像阈值化

Python3

最后更新 2020-04-24 11:32 阅读 278

最后更新 2020-04-24 11:32

阅读 278

Python3

一、图像阈值化简介

图像阈值化(也叫二值化),就是将图像上每一个像素点的像素值设置为一个定值,一般为0(黑色)或者白色(255),最后整个图像将会表现出出黑和白的观察效果。通常情况下,一幅图像糊了包含目标物体、还会包含背景和各种噪声(阈值化后噪声可能就是一些小白点),想要得到目标物体,常用的方法就是设定一个阈值,用阈值将图像的像素分割成两部分:大于阈值的像素和小于T的像素,所以也称为图像的二值化。

1.1 原始图像

1.jpg                                                                                       (夜幕降临的城市)

1.2 代码实践

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.

总结上述:

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.png 

1.3 效果展示 

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

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


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/article/407
讨论
500字
表情
每日优质讨论奖励 20FAI
发送
每日优质讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除