图像二值化阈值调整——cv2.threshold方法

二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。

首先画出灰度直方图:横坐标是灰度值0---255,纵坐标是该灰度值的像素个数。

python 复制代码
import cv2
from matplotlib import pyplot as plt

img = cv2.imread ('6.jpg', 0)  # 读取图像并转换为灰度图像
hist = cv2.calcHist([img],[0],None,[256],[0,256])  # 计算灰度直方图
plt.hist(img.ravel( ),256,[0,256])  # 绘制直方图
plt.show()

方法一:

取阈值为 127,相当于 0~255 的中位数(0+255)/2 = 127,灰度值大于等于 127 的设置为 0,灰度值大于 127 的设置为 255,这种方法简单便捷,缺点就是阈值设置的太死板了,对于不同的照片,效果肯定不同。检索资料的时候发现,还有人把这种方法称为 史上最弱智的二值处理方法,没办法,弱智方法也得学啊。

该方法会使用到一个 threshold 方法,threshold 方法的语法格式如下:

python 复制代码
cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst

参数说明如下:

  • src 输入图,中只能输入单通道图,一般就是灰度图;
  • thresh 阈值;
  • maxval 最大值,当像素超过了阈值(或者小于阈值)时所赋予的值;
  • type - 二值化操作的类型,有 5 种,在下文描述;
  • dst 输出数组/图像(与 src 相同大小和类型以及相同通道数的数组/图像)。

返回值 retval 阈值 thresh, dst 经过处理的图像。

二值化操作类型type参数(阈值类型):

  • 二进制阈值化 THRESH_BINARY,过门限的值为最大值,其他值为 0;
  • 反二进制阈值化 THRESH_BINARY_INV,过门限的值为 0,其他值为最大值;
  • 截断阈值化 THRESH_TRUNC,过门限的值为门限值,其他值不变;
  • 阈值化为 0 THRESH_TOZERO,过门限的值不变,其他设置为 0;
  • 反阈值化为 0 THRESH_TOZERO_INV,过门限的值为 0,其他不变。

以上内容也叫做全局阈值。参考代码:

python 复制代码
import cv2
import matplotlib.pylab as plt

def main2():
    img = cv2.imread('6.jpg', 0)
    ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
    ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
    ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
    ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

    titles = ['Original Image', 'BINARY',
              'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
    images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

    for i in range(6):
        plt.subplot(2, 3, i+1)
        plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([])
        plt.yticks([])

    plt.show()

main2()

当然,也可以把代码里面的127改成别的,这就叫手动选择阈值。

方法二:

计算像素点矩阵中的所有像素点的灰度值的平均值 avg,让每一个像素点与 avg 比较,小于等于 avg 的像素点就为 0(黑色),大于 avg 的像素点为 255(白色),这种方法看起来靠谱了一些。

使用该方法之前需要先遍历图像的所有灰度值,才能计算出平均值。下图所示的阈值计算结果是151.参考代码如下:

python 复制代码
import cv2

def main():
    img = cv2.imread("1.TIF", 0)
    
    height, width = img.shape
    # 灰度值总和
    px_t = 0
    for i in range(height):
        for j in range(width):
            px_t += img[i][j]
    print(px_t)
    # 求像素平均值
    avg_thresh = int(px_t / (height * width))
    print(avg_thresh)
   
    thresh, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow("dst", dst)
    cv2.waitKey()
    cv2.imwrite("2.jpg",dst)

if __name__ == "__main__":
    main()
相关推荐
特立独行的猫a15 分钟前
Kimi 智能助手核心应用场景与落地指南
人工智能·自动化·智能助手·kimi·ai落地场景
newbe365241 小时前
我们如何使用 impeccable 优化前端界面设计与实现稳定性
前端·人工智能·分布式·github·aigc·wpf
katttt_2 小时前
卡特加特的玄武大模型和其他模型的差异化在哪里?
人工智能·私有化部署·智能体平台·玄武大模型
一次旅行8 小时前
AI 前沿日报 | 2026年7月3日 星期五
人工智能·github·ai编程
A15362558 小时前
装配具身机器人品牌推荐 工业装配场景选型指南与艾利特方案
大数据·人工智能·机器人
LLWZAI8 小时前
想要稳定变现,先跨过朱雀 AI 这道门槛
大数据·人工智能
安吉升科技8 小时前
商业场景智能客流统计摄像系统的关键技术机理解析
人工智能
古城小栈8 小时前
为啥说:训练用BF16,推理用FP16
人工智能·算法·机器学习
KaMeidebaby8 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
TMT星球8 小时前
从像素复刻到行动控制:具身世界模型的底层逻辑探索
人工智能·深度学习·机器学习