Loading...
墨滴

未来现相

2021/11/15  阅读:31  主题:极客黑

图像阈值化处理

图像阈值化处理

图像的二值化或阈值化 (Binarization) 旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值 ,通过阈值 将图像的像素划分为两类:大于阈值 的像素群和小于阈值 的像素群。 灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如下所示:

$$\begin{cases} Y=0, & \text {gray =T} \end{cases} $$

阈值化操作在图像处理中是一种常用的算法,比如图像的二值化就是一种最常见的一种阈值化操作。

cv2.threshold()函数

opencv中对于图像阈值处理提供了cv2.threshold()函数

  • cv2.threshold()中包含四个参数,分别为:
    • 原图像
    • 分类的阈值
    • 高于(低于)阈值时赋予的新值
    • 一个方法选择参数,常用的有:
参数 作用
cv2.THRESH_BINARY 像素点的灰度值大于阈值,设其灰度值为最大值(255);小于阈值,设其灰度值为最小值(0)
cv2.THRESH_BINARY_INV 像素点的灰度值大于阈值,设其灰度值为最小值(0);小于阈值,设其灰度值为最大值(255)
cv2.THRESH_TRUNC 像素点的灰度值小于阈值,其灰度值不变;大于阈值,设其灰度值为阈值
cv2.THRESH_TOZERO 像素点的灰度值小于阈值,其灰度值不变;大于阈值,设其灰度值为最小值(0)
cv2.THRESH_TOZERO_INV 像素点的灰度值大于阈值,其灰度值不变;小于阈值,设其灰度值为最小值(0)

示例


import cv2
import pandas as pd
import matplotlib.pyplot as plt
from math import ceil

def Threshold(im):
    image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)  # 将图像转为灰色
    blurred = cv2.GaussianBlur(image, (55), 0)  # 高斯滤波
    # cv2.imshow("Image", image)  # 显示图像
    (T, thresh) = cv2.threshold(blurred, 155255, cv2.THRESH_BINARY)  # 阈值化处理,阈值为:155
    # cv2.imshow("Threshold Binary", thresh)

    (T, threshInv) = cv2.threshold(blurred, 155255, cv2.THRESH_BINARY_INV)  # 反阈值化处理,阈值为:155
    # cv2.imshow("Threshold Binary Inverse", threshInv)

    # cv2.imshow("Coins", cv2.bitwise_and(image, image, mask =threshInv))
    # cv2.waitKey(0)

    # 阈值化处理
    ret, thresh1 = cv2.threshold(image, 127255, cv2.THRESH_BINARY)
    ret, thresh2 = cv2.threshold(image, 127255, cv2.THRESH_BINARY_INV)
    ret, thresh3 = cv2.threshold(image, 127255, cv2.THRESH_TRUNC)
    ret, thresh4 = cv2.threshold(image, 127255, cv2.THRESH_TOZERO)
    ret, thresh5 = cv2.threshold(image, 127255, cv2.THRESH_TOZERO_INV)

    # 显示结果
    titles = ['Gray Image''BINARY''BINARY_INV''TRUNC''TOZERO''TOZERO_INV']
    images = [image, thresh1, thresh2, thresh3, thresh4, thresh5]
    for i in range(6):
        plt.subplot(23, i + 1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()


if __name__ == '__main__':

    img_path = "./jpg/p1.jpg"
    im=cv2.imread(img_path)
    Threshold(im)
    print("*" * 30 + "\n |\t\tEnd Of Program\t\t|\n" + "*" * 30)
欢迎关注:【未来现相】微信公众号!!!
欢迎关注:【未来现相】微信公众号!!!

未来现相

2021/11/15  阅读:31  主题:极客黑

作者介绍

未来现相