Otsu‘s Thresholding的工作原理「建议收藏」

Otsu‘s Thresholding的工作原理「建议收藏」Otsu’sThresholding的工作原理

大家好,又见面了,我是你们的朋友全栈君。

Otsu’s Thresholding的工作原理

在双峰图像(像素的直方图只包含两个峰值),一个好的阈值将在这两个值的中间。Otsu算法就是从图像的像素直方图中确定了一个最佳的全局阈值 t t t,可以最小化weighted within-class variance加权类内方差。

σ w 2 ( t ) = q 1 ( t ) σ 1 2 ( t ) + q 2 ( t ) σ 2 2 ( t ) \sigma_w^2(t) = q_1(t)\sigma_1^2(t)+q_2(t)\sigma_2^2(t) σw2(t)=q1(t)σ12(t)+q2(t)σ22(t)
权重:
q 1 ( t ) = ∑ i = 1 t P ( i ) & q 2 ( t ) = ∑ i = t + 1 I P ( i ) q_1(t) = \sum_{i=1}^{t} P(i) \quad \& \quad q_2(t) = \sum_{i=t+1}^{I} P(i) q1(t)=i=1tP(i)&q2(t)=i=t+1IP(i)
均值:
μ 1 ( t ) = ∑ i = 1 t i P ( i ) q 1 ( t ) & μ 2 ( t ) = ∑ i = t + 1 I i P ( i ) q 2 ( t ) \mu_1(t) = \sum_{i=1}^{t} \frac{iP(i)}{q_1(t)} \quad \& \quad \mu_2(t) = \sum_{i= t+1}^{I} \frac{iP(i)}{q_2(t)} μ1(t)=i=1tq1(t)iP(i)&μ2(t)=i=t+1Iq2(t)iP(i)
方差:
σ 1 2 ( t ) = ∑ i = 1 t [ i − μ 1 ( t ) ] 2 P ( i ) q 1 ( t ) & σ 2 2 ( t ) = ∑ i = t + 1 I [ i − μ 2 ( t ) ] 2 P ( i ) q 2 ( t ) \sigma_1^2(t) = \sum_{i=1}^{t} [i-\mu_1(t)]^2 \frac{P(i)}{q_1(t)} \quad \& \quad \sigma_2^2(t) = \sum_{i=t+1}^{I} [i-\mu_2(t)]^2 \frac{P(i)}{q_2(t)} σ12(t)=i=1t[iμ1(t)]2q1(t)P(i)&σ22(t)=i=t+1I[iμ2(t)]2q2(t)P(i)

import cv2 as cv
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
img = cv.imread('./images/kakaka.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img_gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
#img_blur = cv.GaussianBlur(img_gray, (5, 5), 0)

在这里插入图片描述

Numpy Otsu’s thresholding
hist_cv = cv.calcHist([img_gray],[0],None,[256],[0,256]) # (256,1)
hist_np = np.bincount(img_gray.ravel(), minlength=256)   # (256,)
hist_norm = hist_np/hist_np.sum()
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], 1.0 - Q[i]    # Q[255] = 1.0
    if q1 < 1.e-6 or q2 < 1.e-6:
        continue
    b1, b2 = np.hsplit(bins, [i])
    # means and variances
    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
    # weighted within-class variances
    fn = v1*q1 + v2*q2
    if fn < fn_min:
        fn_min = fn
        thresh = i
print("threshold t : %d"%thresh)
threshold t : 115

在这里插入图片描述

mask = np.zeros_like(img_gray)
mask[np.where(img_gray >= 115)] = 1
plt.imshow(img*mask.reshape(245, 250, 1))

在这里插入图片描述

OpenCV otsu’s thresholding
ret, otsu = cv.threshold(img_gray, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
print("threshold t : %d"%ret)
threshold t : 114
ROI
img_roi = cv.bitwise_and(img, img ,mask = otsu)

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142985.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 银行家算法C语言版「建议收藏」

    银行家算法C语言版「建议收藏」#include<stdio.h>#include<stdlib.h>#include<conio.h>#definem50#definetrue1#definefalse0intno1;//进程数intno2;//资源数intr;intallocation[m][m],need[m][m],available[m],max[m][m];charname1[m],name2[m];.

  • AirSim和UE4的环境配置

    关于具体的环境配置网上有很多的资料,之前也配置过这个环境,但是没有好好的整理过,每次遇到问题都是瞎搞,然后莫名其妙的解决了。这次的博客主要是把配置的过程要注意的地方记录一下。1、前提条件cmake3.10.3、VisualStudio2015professionalupdate3、UE4.16.3这是我的机器上的环境,作为参考。2、编译AirSim源码首先要到Air…

  • 矩阵范数的等价性(原创)[通俗易懂]

    矩阵范数的等价性(原创)[通俗易懂]矩阵范数的等价设F=R”role=”presentation”>F=RF=R\mathbbF=\mathbbR或C,”role=”presentation”>C,C,\mathbbC,对于任意两个Fn×n”role=”presentation”>Fn×nFn×n\mathbbF^{n\timesn}上的范数‖⋅&#x

  • 虚拟ip地址是如何实现的_虚拟服务器ip地址

    虚拟ip地址是如何实现的_虚拟服务器ip地址ARP是地址分析协议,其作用简单,将ip地址转换为MAC地址,使用于数据链路层。每个主机都有一个ARP高速缓存,存储同一网络中的IP地址与MAC地址之间的对应关系,当以太网中的主机发送数据时,首先要从该缓存中查询与目标IP相对应的MAC地址,并将数据发送到该MAC地址。该系统将自动维护此缓存。ARP高速缓存可以在Linux下使用arp命令。例如,物理机器A(IP为172.25.0.1)和物理机器B…

    2022年10月12日
  • iOS越狱包「建议收藏」

    iOS越狱包「建议收藏」编译完了的程序是xxx.app文件夹,我们需要制作成ipa安装包,方便安装找一个不大于500*500的png图片(程序icon图标即可),改名为:iTunesArtwork,注意不能有后缀名。建立一个文件夹,名为:Payload,把刚才编译的xxx.app拷贝到这个文件夹里面。然后选中Payload和iTunesArtwork,右键生成压缩zip文件,比如:xxx.zip,把后缀名

  • pycharm激活码2021.12.12_最新在线免费激活

    (pycharm激活码2021.12.12)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号