OpenCV-Python15:图像阈值处理

news2024/11/16 22:02:39

目录

目标

图像阈值及分割算法介绍

简单阈值算法 

自适应阈值算法 

Otsu`s 二值化算法

Otsu`s 二值化原理 


目标

  • 通过本文你将学到图像二值化、简单阈值处理、自适应阈值、Otsu`s 二值化等。
  • 将学习的函数有cv2.threshold,cv2.adaptiveThreshold 等。

图像阈值及分割算法介绍

        图像阈值是图像分割中常用的一种方法,通过将图像中的像素值与一个特定的阈值进行比较,将像素分为两个类别:小于阈值的像素被归为一类,大于等于阈值的像素被归为另一类。

常用的图像阈值分割算法包括:

  1. 全局阈值法:将图像中的所有像素都与一个全局阈值进行比较,从而将图像分为两个类别。常用的全局阈值法有基于直方图的Otsu算法和基于最大类间方差的Kapur算法。
  2. 自适应阈值法:将图像分为许多小的区域,在每个小区域内分别计算一个局部阈值,根据每个像素与其对应的局部阈值的比较结果进行分割。常用的自适应阈值法有基于局部平均值的均值法和基于局部中值的中值法。
  3. 大津阈值法(Otsu算法):通过最大化类间方差来确定最佳阈值,使得类间差异最大,类内差异最小。该方法适用于具有双峰直方图的图像。
  4. Kapur算法:基于最大类间方差原理,通过最大化类间熵来确定最佳阈值。相比于Otsu算法,Kapur算法对于非双峰直方图的图像更具鲁棒性。
  5. 均值法:将图像分成若干个小的区域,计算每个区域的像素平均值,将每个像素与其对应区域的平均值进行比较,从而确定像素的类别。
  6. 中值法:将图像分成若干个小的区域,计算每个区域的像素中值,将每个像素与其对应区域的中值进行比较,从而确定像素的类别。

        这些图像阈值分割算法各有优劣,选择适合具体应用场景的算法可以提高分割结果的准确性和鲁棒性,下面重点介绍一下OpenCV-Python中的几种重点算法。

简单阈值算法 

        简单阈值算法是一种全局阈值法,与名字一样,是一种非常简单的分割算法。原理是当像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。OpenCV中的这个算法的实现函数就是就是cv2.threshhold()

其参数的含义如下:

1.src:输入图像,即要进行阈值分割的原始图像,通常为灰度图像。

2.thresh:阈值,用于将像素分为两个类别的分界值。根据阈值与像素值的比较结果,将像素分为两类:小于阈值的像素被归为一类,大于等于阈值的像素被归为另一类。

3.maxval:当像素值大于等于阈值时,像素所赋予的新值,通常为255。

4.type:阈值分割的类型,用于指定阈值分割的方法。常用的类型有:

  • cv2.THRESH_BINARY:二值化,将大于阈值的像素置为maxval,小于阈值的像素置为0。
  • cv2.THRESH_BINARY_INV:反二值化,将小于阈值的像素置为maxval,大于阈值像素置为0。
  • cv2.THRESH_TRUNC:截断,将大于阈值的像素置为阈值,小于阈值的像素保持不变。
  • cv2.THRESH_TOZERO:取零,将小于阈值的像素置为0,大于阈值的像素保持不变。
  • cv2.THRESH_TOZERO_INV:反取零,将大于阈值的像素置为0,小于阈值的像素保持不变。

函数的返回值为:

  • retval:所选择的阈值。
  • dst:阈值分割后的图像。

不同方法的测试代码如下: 

import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('gradient.png',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 xrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()

效果如下:

自适应阈值算法 

        自适应阈值算法是一种根据图像局部区域的统计特性来确定阈值的方法,适用于图像中存在光照不均匀或者对比度较低的情况。Opencv-Python中提供了cv2.adaptiveThreshold()函数来实现自适应阈值算法。

cv2.adaptiveThreshold()函数的参数如下:

1.src:输入图像,即要进行阈值分割的原始图像。通常为灰度图像。

2.maxval:当像素值大于等于阈值时,像素所赋予的新值。通常为255。

3.adaptiveMethod:自适应阈值算法的方法。有两种可选:

  • cv2.ADAPTIVE_THRESH_MEAN_C:根据邻域均值确定阈值。
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:根据邻域加权平均值确定阈值。

4.thresholdType:阈值分割的类型,用于指定阈值分割的方法。常用的类型有:

  • cv2.THRESH_BINARY:二值化,将大于阈值的像素置为maxval,小于阈值的像素置为0。
  • cv2.THRESH_BINARY_INV:反二值化,将小于阈值的像素置为maxval,大于阈值的像素置为0。

5.blockSize:邻域大小,用于计算局部均值或者加权平均值。

6.C:从计算得到的局部均值或者加权平均值中减去的一个常数。

代码如下:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('dave.jpg',0)
# 中值滤波
img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#11 为Block size, 2 为C 值
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)

titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()

效果如下:

Otsu`s 二值化算法

        Otsu’s 二值化算法是一种自动确定阈值的方法,它可以根据图像的灰度直方图来确定一个最佳的阈值,从而将图像分割为前景和背景两部分。Opencv-Python中提供了cv2.threshold()函数来实现Otsu’s 二值化算法。

cv2.threshold()函数的参数如下:

1.src:输入图像,即要进行阈值分割的原始图像。通常为灰度图像。

2.thresh:阈值,用于将像素分为两类。在Otsu’s 二值化算法中,这个参数不需要指定。

3.maxval:当像素值大于等于阈值时,像素所赋予的新值。通常为255。

4.type:阈值分割的类型,用于指定阈值分割的方法。在Otsu’s 二值化算法中,应该使用cv2.THRESH_BINARY

5.dst:输出图像,即阈值分割后的图像。

函数的返回值为阈值。

下面是一个示例代码,展示了如何使用Otsu’s 二值化算法对图像进行阈值分割:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('noisy2.png',0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
#􈙹5,5􈙺为􅒇斯核的大小􈙽0 为标准差
blur = cv2.GaussianBlur(img,(5,5),0)
# 􄾷值一定􄌰􄕭为0􈙲
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
# 􄦈􄭻使用了pyplot 中画直方图的方法􈙽plt.hist, 􄌰注意的是它的参数是一维数组
# 所以􄦈􄭻使用了􈙹numpy􈙺ravel 方法􈙽将多维数组􄤛换成一维􈙽也可以使用flatten 方法
#ndarray.flat 1-D iterator over an array.
#ndarray.flatten 1-D array copy of the elements of an array in row-major order.

for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

效果如下:

Otsu`s 二值化原理 

        在这一部分我们会演示怎样使用Python 来实现Otsu`s二值化算法,从而告诉大家它是如何工作的。因为是双峰图,Otsu 算法就是要找到一个阈值t, 使得同一类加权方差最小,需要满下列关系式:


其中:


        其实就是在两个峰之找到一个值t将两个峰分开,并且使每一个峰内的方差最小。实现这个算法的Python 代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sat Jan 11 14:46:12 2014
@author: duan
"""
import cv2
import numpy as np
img = cv2.imread('noisy2.png',0)
blur = cv2.GaussianBlur(img,(5,5),0)
# find normalized_histogram, and its cumulative distribution function
# 􄕐算归一化直方图
#CalcHist(image, accumulate=0, mask=NULL)
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 xrange(1,256):
p1,p2 = np.hsplit(hist_norm,[i]) # probabilities
q1,q2 = Q[i],Q[255]-Q[i] # cum sum of classes
b1,b2 = np.hsplit(bins,[i]) # weights
# finding 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
# calculates the minimization function
fn = v1*q1 + v2*q2
if fn < fn_min:
fn_min = fn
thresh = i
# find otsu's threshold value with OpenCV function
ret, otsu = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print (thresh,ret)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GZ029 智能电子产品设计与开发赛题第9套

2023年全国职业院校技能大赛高职组 “GZ029智能电子产品设计与开发”赛项赛卷九 题目&#xff1a;模拟工业传送带物品检测系统的设计与开发 1 竞赛任务 在智能电视机上播放工业传送带传输物品视频&#xff0c;模拟工业传送带物品检测系统&#xff08;以下简称物品检测系统&…

训练效率提升40倍!开源图片生3D模型,Stable Zero123来啦

12月14日&#xff0c;著名生成式AI开源平台Stability.ai在官网开源了&#xff0c;图片生成高质量3D模型——Stable Zero123。 Stable Zero123是基于今年3月&#xff0c;丰田研究院和哥伦比亚大学联合开源的Zero123模型开发而成。主要通过更改渲染数据集和分数蒸馏对模型进行了…

leetcode -- 209 长度最小的子数组[滑动窗口/c++]

原题链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 滑动窗口其实就是同向双指针&#xff0c;因为计算结果的单调性&#xff0c;在符合条件的情况下&#xff0c;左右指针不必往回回溯&#xff0c;而实现优化的效果。 滑…

分布式数据库-课程总结

文章目录 参考资源HBase列族数据库简介与关系数据库的对比存储对比操作语句表级别语句表数据语句 数据库的原理存储结构架构 MongoDB文档数据库简介与关系数据库的对比存储对比操作语句 见PPT 命名规范数据库的原理 Redis键值内存数据库Neo4j图数据库 参考资源 http://172.16.…

佛山数字孪生赋能工业智能制造,助力制造业企业数字化转型

佛山数字孪生赋能工业智能制造&#xff0c;助力制造业企业数字化转型。数字孪生驱动的仿真服务可以模拟产品的各种真实功能&#xff0c;为不同的用户切换不同的应用场景。产品介绍、咨询和体验服务都可以通过产品数字孪生来完成。产品数字孪生在交易时可以交付给客户。产品销售…

HTTP协议请求详解

✏️✏️✏️今天给大家分享的是 HTTP 请求部分的基础知识。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈️动动你们发财的小…

大数据与人工智能——神经网络是如何工作的?

大数据与人工智能——神经网络是如何工作的&#xff1f; 我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神…

【改进YOLOv8】车辆测距预警系统:融合空间和通道重建卷积SCConv改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着交通工具的普及和道路交通的不断增加&#xff0c;车辆安全问题日益凸显。特别是在高速公路等高速道路上&#xff0c;车辆之间的距离和速度差异较…

可数集合(可列集合、可列无限集)

凡是和全体正整数所构成的集合对等的集合都称为可数集合、或者叫可列集合、可列无限集。 由于可以按大小顺序排成一个无穷序列&#xff0c;因此一个集合A是可数集合的充要条件为&#xff1a;A可以排成一个无穷序列 可数集合是无限集合。

服务器常用命令介绍和负载监控的工具插件推荐

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;❤️ ❤️ ❤️ 码字不易&#xff0c;如果喜欢可以关注我哦&#xff01; 如果本篇文章对你有所启发&#xff0c;欢迎访问我的个人博客 命令 服务器相关 5个常用命令 top Top命令不仅显示了当前内核服务的…

解决固定资产盘点问题,易点易动来帮忙!

固定资产盘点是企业管理中不可或缺的环节&#xff0c;然而&#xff0c;很多企业在固定资产盘点方面面临一系列问题&#xff1a; 盘点过程繁琐&#xff1a;传统的手动盘点方式需要耗费大量人力和时间&#xff0c;容易出现疏漏和错误&#xff0c;效率低下&#xff1b; 数据记录不…

2022最新云存储网盘系统,文件分享系统与文件存储系统。

资源入口 2022 最新云存储网盘系统, 文件分享系统与文件存储系统。 测试环境&#xff1a;Apache MySQL5.6 PHP7.0 安装 PHP 扩展 exif、fileinfo 从 PHP 禁用函数中 删除 shell_exec、proc_open、putenv 这三个 PHP 函数 PS&#xff1a;整体还不错的系统&#xff0c;注意的…

年薪30w+”,程序员涨薪秘诀竟然是它!

“程序员能纯靠技术渡过中年危机吗&#xff1f;” 知乎上的这个提问&#xff0c;吸引了大批码农留言&#xff0c;热赞均表示“能&#xff0c;很难”。因为难逃这两种结局&#xff1a; • 没精力学习&#xff0c;技术一迭代&#xff0c;被淘汰。 • 有技术&#xff0c;90%公…

爱名网被评为“最佳安全保障注册服务机构”

12月12日&#xff0c;由中国互联网络信息中心主办&#xff0c;中国科学院计算机网络信息中心、中国工业互联网研究院、中国互联网协会联合主办&#xff0c;人民邮电报社承办的第四届中国互联网基础资源大会&#xff08;CNIRC&#xff09;在北京举办。 在本届大会上&#xff0c…

官宣 鸿雁成为2023汇丰世界羽联世界巡回赛总决赛官方供应商

全屋智能和羽毛球运动能擦出怎样的火花&#xff1f; 鸿雁给你答案&#xff01; 12月13日&#xff0c;2023汇丰世界羽联世界巡回赛总决赛将在杭州举行。 鸿雁签约成为2023汇丰世界羽联世界巡回赛总决赛官方供应商&#xff0c;将携手世界羽联&#xff0c;为广大羽毛球爱好者们…

虹科技术 | IO-Link Wireless如何赋能工厂车间迈向无线自动化?

大规模定制、卓越运营和商业智能正在从根本上改变制造业&#xff0c;为了在竞争中立于不败之地&#xff0c;制造商需要更加灵活、通用、可扩展和具有成本效益的机器和生产线。随着制造商向工业 4.0 迈进&#xff0c;更好的适应性、更高的吞吐量和更短的停机时间是他们的共同要求…

electron中获取mac地址

electron中获取mac地址 引入为了方便做单点登录&#xff0c;我们往往需要使用某个唯一标识来标记客户端的设备&#xff0c;mac地址就是一个还不错的选择思路 我们可以使用Node.js的内置模块os&#xff0c;调用其中的networkInterfaces方法。该方法会返回一个包含网络接口信息…

Leetcode 51 N 皇后

题意理解&#xff1a; N皇后问题指的是在一个nn的棋盘上&#xff0c;防止皇后棋子&#xff0c;每行、每列、每45斜角只能有一个皇后存在。 这是一道困难的题&#xff1a;困难在于&#xff1a; 如何处理棋盘&#xff0c;如何表示棋子。 将期盼看作是2维数组&#xff0c;一行一行…

融资融券超详细攻略!4.5%融资利率怎么开通?

一、融资融券是什么&#xff1f; 融资&#xff1a;顾名思义融资就是找证券公司借钱&#xff0c;然后去二级市场参与交易&#xff0c;到期归还给证券公司资金。简单来说融资就是当我们在看涨某只股票&#xff0c;但没有充足的资金时&#xff0c;这时如果你满足融资融券的条件&am…

ros2+gazebo建立机器人

Building your own robot In this tutorial we will learn how to build our own robot in SDFormat. We will build a simple two wheeled robot.本文用SDF文件建立一个2轮机器人 You can find the finished SDF file for the tutorial here.SDF文件点击下载 What is SDF SD…