大津阈值(otsuthresh)的Python实现

参照《数字图像处理》中对大津阈值的理论描述,Python可如下实现

import numpy as np
def otsuthresh(h):
    h = h/sum(h)
    i = np.arange(1,h.size+1)
    P1 = np.cumsum(h)
    m = np.cumsum(i*h)
    mG = m[-1]
    eps = 2.2204*pow(10,-16)
    sigSquared = np.power((mG*P1-m),2)/(P1*(1-P1)+eps)
    maxSigsq = max(sigSquared)
    T = np.mean(np.argwhere(sigSquared==maxSigsq)+1)
    T = (T-1)/(h.size-1)
    return T
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大津法Otsu's method)是一种自适应阈值分割方法,它通过找到一个阈值,使得两个类内的方差都最小,从而将图像分割为前景和背景。在大津法中,通过计算图像的灰度直方图和累积分布函数,然后根据不同的阈值计算类内方差,最终选择使类内方差最小的阈值作为最佳阈值。 在Python中,可以使用OpenCV库来实现大津法阈值分割。首先,读取图像并进行高斯模糊处理,然后计算图像的灰度直方图和累积分布函数。接下来,通过遍历不同的阈值,计算每个阈值下的类内方差,并选择使类内方差最小的阈值作为最佳阈值。最后,使用OpenCV的阈值分割函数将图像分割为前景和背景。 以下是一个使用大津法阈值分割的Python代码示例: ```python import cv2 import numpy as np # 读取图像并进行高斯模糊处理 img = cv2.imread('road.jpg', 0) blur = cv2.GaussianBlur(img, (5, 5), 0) # 计算灰度直方图和累积分布函数 hist = cv2.calcHist(\[blur\], \[0\], None, \[256\], \[0, 256\]) hist_norm = hist.ravel() / hist.max() Q = hist_norm.cumsum() bins = np.arange(256) # 初始化最小方差和阈值 fn_min = np.inf thresh = -1 # 遍历不同的阈值,计算类内方差 for i in range(1, 256): p1, p2 = np.hsplit(hist_norm, \[i\]) q1, q2 = Q\[i\], Q\[255\] - Q\[i\] b1, b2 = np.hsplit(bins, \[i\]) m1, m2 = np.sum(p1 * b1) / q1, np.sum(p2 * b2) / q2 v1, v2 = np.sum(((b1 - m1) ** 2) * p1) / q1, np.sum(((b2 - m2) ** 2) * p2) / q2 fn = v1 * q1 + v2 * q2 if fn < fn_min: fn_min = fn thresh = i # 使用OpenCV的阈值分割函数进行分割 ret, otsu = cv2.threshold(blur, thresh, 255, cv2.THRESH_BINARY) print("最佳阈值: ", thresh) print("OpenCV计算的阈值: ", ret) ``` 这段代码首先读取图像并进行高斯模糊处理,然后计算灰度直方图和累积分布函数。接下来,遍历不同的阈值,计算每个阈值下的类内方差,并选择使类内方差最小的阈值作为最佳阈值。最后,使用OpenCV的阈值分割函数将图像分割为前景和背景,并打印出最佳阈值和OpenCV计算的阈值。 希望对你有帮助! #### 引用[.reference_title] - *1* *2* [【opencv-python大津法Otsu阈值分割原理深入分析](https://blog.csdn.net/huangzhe0701/article/details/120485879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python+OpenCV:阈值分割](https://blog.csdn.net/liubing8609/article/details/109659209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值