python实现Otsu双阈值算法
最近在做双阈值的对比实验需要用到Otsu,发现网上没有python的实现,所以写下来记录一下。
Otsu双阈值算法的思想与单阈值的思想类似,单阈值的思想为:
g = w0(u0-u)^2+w1(u1-u)^2
使得g最大。
Otsu双阈值的思想则为:
g = w0(u0-u)^2+w1(u1-u)^2+w2(u2-u)^2
使得g最大。
u0为背景区域的平均值,u1为中间区域的平均值,u2为前景区域的平均值。
w0为背景区域的概率,w1为中间区域的概率,w2为前景区域的概率。
所以用python做简单的实现:
def Otsu2Threshold(src):Threshold1 = 0Threshold2 = 0weight, height = np.shape(src)hest = np.zeros([256], dtype=np.int32)for row in range(weight):for col in range(height):pv = src[row, col]hest[pv] += 1tempg = -1N_blackground = 0N_object = 0N_all = weight * heightfor i in range(256):N_object += hest[i]for k in range(i, 256, 1):N_blackground += hest[k]for j in range(i, 256, 1):gSum_object = 0gSum_middle = 0gSum_blackground = 0N_middle = N_all - N_object - N_blackgroundw0 = N_object / N_allw2 = N_blackground / N_allw1 = 1 - w0 - w2for k in range(i):gSum_object += k*hest[k]u0 = gSum_object/N_objectfor k in range(i+1, j, 1):gSum_middle += k*hest[k]u1 = gSum_middle / (N_middle+theta)for k in range(j+1, 256, 1):gSum_blackground += k*hest[k]u2 = gSum_blackground / (N_blackground + theta)u = w0 * u0 + w1 * u1 + w2 * u2print(u)g = w0 * (u - u0) * (u - u0) + w1 * (u - u1) * (u - u1) + w2 * (u - u2) * (u - u2)if tempg < g:tempg = gThreshold1 = iThreshold2 = jN_blackground -= hest[j]h, w = np.shape(src)img = np.zeros([h, w], np.uint8)for row in range(h):for col in range(w):if src[row, col] > Threshold2:img[row, col] = 255elif src[row, col] <= Threshold1:img[row, col] = 0else:img[row, col] = 126BlackgroundNum = 0AllNum = weight*heightfor i in range(weight):for j in range(height):if img[i, j] == 0:BlackgroundNum += 1BlackgroundRatio = BlackgroundNum/AllNumif BlackgroundRatio < 0.4: # 背景占比过少时,做一个反向操作w, h = np.shape(src)for i in range(w):for j in range(h):img[i, j] = 255 - img[i, j]return img
在主函数中调用算法:
imgpath = "./111.jpg"
src = cv2.imread(imgpath, flags=0)
cv2.imshow('src', src)
dst = Otsu2Threshold(src)
cv2.imshow("dst", dst)
cv2.waitKey(0)
实现效果:
原图:
双阈值化后的结果:
python实现Otsu双阈值算法相关推荐
- 在python中调用双模拟退火算法dual_annealing
原理 模拟退火算法(CSA)中最重要的概念就是Metrospolis准则,表示的是接收新解的概率,一般表示为 p=e−f(x2)−f(x3)Tp=e^{-\frac{f(x_2)-f(x_3)}{T} ...
- 基于OTSU算法和基本粒子群优化算法的双阈值图像分割
OTSU自适应阈值求法与粒子群算法的合作,将OTSU算法作为粒子群算法的适应值函数,来计算每个粒子的适应度与最优阈值相比较,经过3000次迭代最后取得优化后的阈值 原图: 经过联合算法优化的双阈值为9 ...
- 图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现
本文的基础是OpenCV的函数threshold(),关于函数threshold()的详细介绍,大家可以参考下面这篇博文: https://www.hhai.cc/thread-162-1-1.htm ...
- Otsu大津算法公式推导及python实现
目录 前言 一.类间平方差是什么? 二.公式推导及实现 1.求类间平方差 2.opencv-python编程实现 2.1 引入图像并灰度化 2.2 查看灰度值的分布情况 2.3 求全局平均阈值 2.4 ...
- OpenCV —— 阈值分割(直方图技术法,熵算法,Otsu,自适应阈值算法)
阈值分割 1. 全局阈值分割 直方图技术法 熵算法 Otsu算法 2. 局部阈值分割 自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键.可以使用手动设置阈值,也可以采用直方 ...
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
from:http://blog.csdn.net/onezeros/article/details/6136770 otsu算法选择使类间方差最大的灰度值为阈值,具有很好的效果 算法具体描述见ots ...
- 利用OTSU阈值算法在ZYNQ上实现浒苔识别
文章目录 前言 一.软件安装 二.算法实现 1.图片数据读入 2.数据处理 1.Matlab仿真 2.利用Matlab Coder将Matlab代码转为C代码 3.利用Vitis HLS将C代码转为V ...
- 自适应小波阈值去噪python_基于python的小波阈值去噪算法
小波图像去噪原理 图像和噪声在经小波变换后具有不同的统计特性:图像本身的能量对应着幅值较大的小波系数,主要集中在低频(LL)部分:噪声能量则对应着幅值较小的小波系数,并分散在小波变换后的所有系数中.基 ...
- 双阈值检测阈值选择_通过阈值进行计算机视觉高级车道检测
双阈值检测阈值选择 In my earlier post, I talked about finding lane lines using Edge Detection and Hough Trans ...
最新文章
- 统计之都统计分析和R语言方面的图书
- html加载出来图片乱掉,HTML基础 img alt 图片加载失败时,出现替代文本
- python基础之删除文件及删除目录的方法
- mysql数据库的链接地址_常用数据库连接URL地址大全
- 软件定义存储的系统架构图和关键技术
- Sequential Recommender Systems
- 学习React中遇到的问题
- WAVE族函数的使用
- oracle net Manager 配置连接 tiptop 鼎捷ERP 数据库
- 八国离线谷歌卫星影像地图内网发布
- 宁银消费金融来了 母行授信80亿,全国急招人
- 菜鸟教程学习——HTML5 video,audio,input(各种新元素),output,datalist
- 组合数学——计数原理和计数公式
- java 获取ftp 文件路径_java在浏览器上获取FTP读文件路径
- yum mysql的安装目录在哪_yum安装的mysql 目录结构
- 计算机键盘space键在哪,space是哪个键,详细教您space是哪个键
- Nest.js 怎样使用 hbs 的 partials?
- 如何更改IP地址使用代理ip软件
- 易能变频器说明书故障代码_易能变频器故障代码大全E013故障
- Live800|哪家在线客服系统性价比高?