opencv实现阈值分割
文章目录
- 基础函数
- 直方图阈值
- 实现
- threshold 函数使用
- 三角法阈值
- 实现
- 迭代法阈值
- 算法步骤
- Python语法补充
- 实现
- 大津法
- 理论
- cv实现
- 底层复现
- 自适应阈值
- 理论
- 具体操作步骤
- 优化
- CV实现
- 底层复现
基础函数
在此列出,后面将直接使用,不再赘述
- 导入库
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
- 展示函数
def show(img):if img.ndim == 2:plt.imshow(img, cmap='gray', vmin=0, vmax=255)else:img = cv.cvtColor(img, cv.COLOR_BGR2RGB)plt.imshow(img)plt.show()
直方图阈值
算法描述:根据图像灰度直方图,人工寻找阈值
算法特点:适用双峰图像
实现
导入图片
img = cv.imread('pic/eagle.jpg', 0)
show(img)
画出直方图
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
plt.hist(img.flatten(), np.arange(-0.5, 256, 1), color='g')
plt.show()
二值化
_, img_bin = cv.threshold(img, 125, 255, cv.THRESH_BINARY)
show(img_bin)
threshold 函数使用
三角法阈值
论文:AUTOMATIC MEASUREMENT OF SISTER CHROMATID EXCHANGE FREQUENCY
算法思想:几何法,适用单峰图像
距离最远的点,即为分割点
实现
img = cv.imread('pic/blossom', 0)
show(img)
plt.hist(img.flattern(), np.arange(-0.5, 256, 1), color='g')
plt.show()
th, img_ = cv.threshold(img, 0, 255, cv.THRESH_TRIANGLE)
print(th)
show(np.hstack([img, img_bin])
三角法自动寻找阈值,第二个参数随便写就行
迭代法阈值
算法步骤
- 选取初始分割阈值,通常可选图像灰度平均值TTT
- 根据阈值TTT将图像像素分割为背景和前景,分别求出两者的平均灰度T0和T1T_0和T_1T0和T1
- 计算新的阈值T′=T0+T12T'={T_0+T_1 \over 2}T′=2T0+T1
- 若T==T′T==T'T==T′,则迭代结束,TTT即为最终阈值。否则令T=T′T=T'T=T′,转第(2)步。
前景为>T>T>T的部分,背景为<T<T<T的部分
Python语法补充
a = np.random.randint(0, 10, (4, 4))
a[a <= 5]
a[a <= 5].mean()
实现
img = cv.imread('pic/eagle', 0)T = img.mean()while True:t0 = img[img < T].mean() // 背景平均灰度值t1 = img[img >= T].mean() // 前景平均灰度值t = (t0 + t1) / 2print(T, t)if T == t: // 可适当放宽条件, abs(T-t) < 1breakT = t
T = int(T) // 浮点数没有用print(f"Best Threshold = {T}")
Best Threshold = 120
大津法
理论
算法思想:最大类间方差
对于给定阈值TTT,可以将图像分为目标和背景。其中背景点数占图像比例为p0p_0p0,平均灰度值为m0m_0m0。而且标定数占图像比例为p1p_1p1,平均灰度值为m1m_1m1,其中满足
p0+p1=1p_0+p_1=1p0+p1=1
整幅图像的平均灰度值为常数,跟阈值无关,且为
mˉ=p0m0+p1m1\bar m = p_0m_0+p_1m_1mˉ=p0m0+p1m1
类间方差为
σ2=p0(m0−mˉ)2+p1(m1−mˉ)2\sigma^2=p_0(m_0-\bar m)^2+p_1(m_1-\bar m)^2σ2=p0(m0−mˉ)2+p1(m1−mˉ)2
代入p0+p1=1和mˉp_0+p_1=1和\bar mp0+p1=1和mˉ可简化为
σ2=p0p1(m0−m1)2\sigma^2=p_0p_1(m_0-m_1)^2σ2=p0p1(m0−m1)2
遍历灰度值,找出能使σ2\sigma^2σ2最大的值
cv实现
img = cv.imread('pic/eagle.jpg', 0)th, img_bin = cv.threshod(img, -1, 255, cv.THRESH_OTSU)
print(th)
show(img_bin)
底层复现
img = cv.imread('pic/eagle', 0)Sigma = -1
T = 0for t in range(0, 256):bg = img[img <= t]obj = img[img > t]p0 = bg.size / img.sizep1 = obj.size / img.sizem0 = 0 if obj.size==0 else bg.mean()m1 = 0 if obj.size==0 else obj.mean()sigma = p0*p1*(m0-m1)**2if sigma > Sigma:Sigma = sigmaT = t
自适应阈值
理论
算法思想:局部二值化
全局二值化容易受阴影影响,所以可以局部二值化。自适应阈值分割的本质就是局部二值化。
具体操作步骤
- 对某个像素值,原来为SSS,取其周围的n×nn \times nn×n的区域,求区域均值或高斯加权值,记为T;
- 对8位图像,如果S>TS>TS>T,则该像素点二值化为255,否则为0.
优化
- 在实际操作中,通过卷积操作,即均值模糊或高斯模糊,实现求区域均值或高斯加权值;
- 上面步骤中,增加超参数CCC,CCC可以为任何实数,当S>T−CS>T-CS>T−C时,把原像素二值化为255.
- 也可以设置超参数 α∈[0,1]\alpha \in [0,1]α∈[0,1],当S>(1−α)TS>(1-\alpha)TS>(1−α)T时把原像素点二值化为255,通常取α=0.15\alpha=0.15α=0.15。
注:邻域大小一般要大于目标大小,但也不能太大,否则效果不好。
CV实现
img = cv.imread('pic/page', 0)
show(img)
img_bin = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 21, 6)
show(img_bin)
6 就是上面的C,21就是核大小
底层复现
一. 通过超参数C实现
img = cv.imrad('pic/page', 0)C = 0
winSize = 21 // 和一个字体差不多大img_blur = cv.blur(img, (winSize, winSize))
show(img > img_blur)
C = 6img_bin = np.uint8(img>img_blur.astype(np.int) - C) * 255show(img_bin)
二. 通过超参数α\alphaα实现
img = cv.imread('pic/page.jpg', 0)alpha = 0.15
winSize = 21img_blur = cv.GaussianBlur(img, (winSize, winSize), 5)
img_bin = np.uint8(img > (1-alpha) * img_blur) * 255 show(img_bin)
对于参数不是很敏感
opencv实现阈值分割相关推荐
- Python+OpenCV:阈值分割
Python+OpenCV:阈值分割 阈值分割 ############################################################################ ...
- OpenCV自适应阈值分割函数:adaptiveThreshold()介绍
OpenCV自适应阈值分割函数:adaptiveThreshold()介绍 [注意] 1. adaptiveThreshold()函数的ThresholdTypes参数只能设置为"CV_TH ...
- opencv 图像阈值分割图像
最简单的图像分割的方法. 应用举例:从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体).这样的图像分割方法是基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分 ...
- opencv 图像分割 阈值分割 图像二值化 灰度图
# -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...
- python+openCV 自适应阈值分割
当图像各局部亮度不同时,全局阈值就很难将背景和目标分割.因此提出了自适应阈值,即在图像的不同区域采用不同的阈值进行分割.利用函数cv2.adaptiveThreshold()进行分割. cv2.ada ...
- python+opencv实现阈值分割
系列文章目录 文章目录 系列文章目录 前言 一.全局阈值 1.效果图 2.源码 二.滑动改变阈值(滑动条) 1.效果图 2.源码 三.自适应阈值分割 1.效果图 2.源码 3.GaussianBlur ...
- 基于OpenCV和C++实现最大阈值分割算法
代码如下:: /******************************************************************************************** ...
- halcon 阈值分割
Halcon算子学习:图像阈值分割算子 前言 1.threshold-全局固定阈值分割 2.Binary Threshold-自动全局阈值分割 3.dyn_threshold-局部动态阈值分割 小结: ...
- opencv阈值分割类型
threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type); src:输入图,只能输入单通道图 ...
- opencv 阈值分割 — threshold()
OpenCV阈值分割函数:threshold() 函数原型: double threshold(InputArray src, OutputArray dst, double thresh, doub ...
最新文章
- 美酒节成就及任务攻略指引
- AndroidMenifest.xml file missing 报错
- eclipse java字体 太小,如何在Eclipse for Java文本编辑器中更改字体大小?
- 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(四)
- 如何使用css3做简单的动画效果?
- 丰桥自助打印顺丰面单
- 最小生生树算法-prim/kruskal
- ADA程序实例(面向对象特性之多态)
- 原生js生成渐变色数组集合
- 汇编语言学习笔记(续)
- 2022年度“十大基础研究关键词”在深发布
- ABAQUS学习之路
- ThinkPHP 5.0.23 远程代码执行 漏洞复现
- 特征多项式的基无关性
- 微信公众号 服务器自动回复,微信订阅后台自动回复功能的实现
- Altair Simdroid 流体分析模块介绍
- vb发出声音音乐代码
- 微信登录功能实现(可用)
- 电脑快捷方式图标变白的解决方式
- 秋季锻炼“十大法宝”
热门文章
- 中国大学MOOC(慕课)离线下载视频支持电脑播放
- mergesort java_排序--归并排序MergeSort(Java实现)
- Java开发框架!高级java工程师简历模板
- 可以在电脑上在线录制视频GIF的软件,不需要下载安装
- kali xss漏洞扫描工具使用教程
- 大二学生web期末大作业 在线电影网站 HTML+CSS+JS
- 高职高考计算机网课app,本人准备高职高考,但是初中数学基础不行,所以求一套不错的初中数学练习题,教材的话我就刷网课。...
- ps画画模糊笔刷_杨雪果ps笔刷|杨雪果CG绘画笔刷(Blur's good brush)下载v7.0 免费版 - 欧普软件下载...
- mac tree命令
- 【java】读取html乱码