代码编织梦想

阈值处理在计算机视觉技术中占有十分重要的位置,他是很多高级算法的底层逻辑之一。本实验将练习使用图像阈值处理技术来处理不同的情况的图像,并获得图像轮廓。

完成本期内容,你可以:

  • 了解图像阈值处理技术的定义和作用

  • 掌握各阈值处理技术的原理

  • 了解自适应阈值处理的使用场景

  • 学会选择合适的阈值处理方式

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


图像阈值处理函数

在图像处理过程中,阈值使得图像的像素值更单一,进而使得图像的效果更简单。首先把一幅彩色图像转换为灰度图像,这样图像的像素值的取值范围即可简化为0~255,然后通过阈值使用转换后的灰度图像呈现出只有黑色和宝白色的视觉效果。例如,当阈值为127时,把小于127的所有像素值都转换为0(即纯黑色),把大于127的像素值都转换为255(即纯白色),虽然会丢失一些灰度细节,但是会更明显的保留灰度图像主体的轮廓。

OpenCV中提供的对图像进行阈值处理的函数是cv2.threshold()。

函数原型: retval,dst = cv2.threshold(src, thresh, maxval, type);

retval为处理时所采用的阈值。

dst为转换后的图像。

参数描述如下:

参数描述
src原始图像
thresh阈值,阈值在125~150范围内取值的效果最好
maxval阈值处理采用的最大值
type阈值处理类型

阈值处理类型,如下:

类型含义
cv2.THRESH_BINARY二值化
cv2.THRESH_BINARY_INV反二值化阈值处理
cv2.THRESH_TOZERO低于阈值零处理
cv2.THRESH_TOZERO_INV超出阈值零处理
cv2.THRESH_TRUNC截断阈值处理

二值化处理

“非黑即白”的图像

二值化处理会将灰度图像的像素值两极分化,使得灰度图像呈现出只有纯黑色和纯白色的视觉效果。经过阈值处理后的图像轮廓分明、对比明显,因此二值化处理常用于图像识别。

if 像素值 <= 阈值: 
    像素值 = 0
if 像素值 > 阈值: 
    像素值 = 最大值

反二值化处理

反二值化处理也叫反二值化阈值处理,其结果为二值化处理的相反的结果。将大于阈值的像素值变为0,将小于或等于阈值的像素值变为最大值。原图中白色的部分会变成黑色,黑色的部分会变成白色。

if 像素值 <= 阈值: 
    像素值 = 像素值
if 像素值 > 阈值: 
    像素值 = 0

零处理

零处理会将某一个范围内的像素值变为0,并允许范围之外的像素保留原值。零处理包括低于阈值零处理和超出阈值零处理。

低于阈值零处理

低于阈值进行零处理也叫零阈值零处理,该处理会将低于或等于阈值的像素值变为0,大于阈值的像素值保持原值。

if 像素值 <= 阈值: 
    像素值 = 0
if 像素值 > 阈值: 
    像素值 = 原值

超出阈值零处理

超出阈值进行零处理也叫超阈值零处理,该处理会将大于阈值的像素值变为0,小于或等于阈值的像素值保持原值。

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 0

截断处理

截断处理也叫截断阈值处理,该处理会将图像中大于阈值的像素值变为和阈值一样的值,小于或等于阈值的像素保持原值。

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 阈值

自适应处理

OpenCV提供了一种改进的阈值处理技术:图像中不同区域使用不同的阈值,把这种改进的阈值处理技术称作自适应阈值处理,自适应阈值是根据图像中某一正方形区域内的所有像素值按照指定的算法计算得到的。与上文讲解的5中阈值处理类型相比,自适应阈值处理能更好地处理明暗分布不均的图像,获得更简单的图像。

if 像素值 <= 阈值: 
    像素值 = 原值
if 像素值 > 阈值: 
    像素值 = 阈值

OpenCV中提供的对图像进行自适应阈值处理的函数是cv2.adaptiveThreshold()。

函数原型: dst = cv2.adaptiveThreshold(src,maxValue,adaptiveMethod, threshholdType, blockSize, C);

dst为转换后的图像。

参数描述如下:

参数描述
src需要被处理的图像,该图像须是灰度图像
maxValue阈值处理采用的最大值
threshholdType阈值处理类型;需要注意的是,阈值处理类型必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV中的一个。
blockSize一个正方形区域的大小。
C常量。阈值等于均值或者加权值减去这个常量
adaptiveMethod自适应阈值的计算方法。

自适应阈值的计算方法,如下:

类型含义
cv2.ADAPTIVE_THRESH_MEAN_C对一个正方形区域内的所有像素平均加权
cv2.ADAPTIVE_THRESH_GAUSSIAN_C根据高斯函数按照像素与中心点的距离对一个正方形区域内的所有像素进行加权计算

Otsu方法

对于有些图像,当主观去设置阈值时,可能得到的效果并不好,这时就需要一个个的去尝试,知道找到最合适的阈值。逐个寻找最合适的阈值不仅工作量大,而且效率低。为此。OpenCV提供了Otsu方法,Otsu方法能够遍历所有可能的阈值,从中找到最合适的阈值。Otsu方法的语法和threshold()方法的语法基本一致。只不过在为type传递参数时,要多传递一个参数,cv2.THRESH_OTSU的作用是实现Otsu方法的阈值处理。

OpenCV中提供的对图像进行Otsu的函数是cv2.threshold()。

函数原型:retval,dst = cv2.threshold(src, thresh, maxval, type);

retval为处理时所采用的阈值。

dst为转换后的图像。

参数描述如下:

参数描述
src原始图像
thresh阈值,阈值在125~150范围内取值的效果最好
maxval阈值处理采用的最大值
type阈值处理类型

阈值处理类型,如下:

类型含义
cv2.THRESH_BINARY二值化
cv2.THRESH_BINARY_INV反二值化阈值处理
cv2.THRESH_TOZERO低于阈值零处理
cv2.THRESH_TOZERO_INV超出阈值零处理
cv2.THRESH_TRUNC截断阈值处理

具体步骤

1. 创建项目结构

创建项目名为利用阈值勾勒建筑轮廓,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

利用阈值勾勒建筑轮廓                      # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

2. 利用二值化阈值处理勾勒别墅轮廓图

  1. code文件夹下创建binary.py
  2. 读取dataset文件夹下的villa.png图片,并进行展示 ;
  3. 将图片进行二值化处理,并进行展示,标题为BINARY
  4. 将图片进行反二值化处理,并进行展示,标题为BINARY_INV
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2
# 读取图像
img = cv2.imread("../dataset/villa.png")
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化阈值处理
t1, dst1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 反二值化阈值处理
t2, dst2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("img", img)  # 显示图像
cv2.imshow("BINARY", dst1)
cv2.imshow("BINARY_INV", dst2)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

请添加图片描述

实验效果

3. 利用Otsu方法勾勒图像轮廓

  1. code文件夹下创建otsu.py
  2. 读取dataset文件夹下的tower.png图片,并进行展示 ;
  3. 将图片进行二值化处理,并进行展示,标题为BINARY
  4. 将图片进行Otsu处理,并进行展示,标题为Otsu
  5. 在图像上显示最合适的阈值;
  6. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

# 导入OpenCV
import cv2

# 读取图片
image = cv2.imread("../dataset/tower.png")

# 步骤一: 对图像进行二值化处理
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #转换为灰度图
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理

# 步骤二: 实现Otsu方法的阈值处理
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY  + cv2.THRESH_OTSU)
cv2.putText(dst2, "best threshold: " + str(t2), (0, 30),
         cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) # 在图像上绘制最合适的阈值


cv2.imshow("img", image) # 显示原始图像图像
cv2.imshow("BINARY", dst1) # 显示二值化阈值处理的图像
cv2.imshow("OTSU", dst2) # 显示实现Otsu方法的阈值处理
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 销毁所有窗口

请添加图片描述

实验效果

阈值处理在计算机视觉 技术中占有十分重要的位置,他是很多高级算法的底层逻辑之一。因为二值图像会忽略细节,放大特征,而很多高级算法要根据物体的轮廓来分析物体的特征,所以二值图像非常适合做复杂的识别运算,在进行识别运算之前,应先将图像转为灰度图像,再进行二值化阈值处理,这样就得到了算法所需要的物体(大致)轮廓图像。

点击下载源码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40186237/article/details/130846154

jeff dean的传奇人生:超级工程师们拯救谷歌_喜欢打酱油的老鸟的博客-爱代码爱编程

https://mp.weixin.qq.com/s/1Y8tbu0PHdfWYqmsZhQUOg   策划编辑 | Natalie 作者 | James Somers 译者 | 核子可乐 编辑 | Vincent, Natalie AI 前线导读: 在很多人眼中,Jeff Dean 就是谷歌技术的代名词,也是谷歌如此强大的重要原因。但实际

威胁狩猎简介<译文>-爱代码爱编程

2019独角兽企业重金招聘Python工程师标准>>> 什么是威胁狩猎 威胁狩猎也被叫做威胁搜索、网络狩猎或者网络威胁搜索,他不同于apt攻击或者红蓝军渗透测试这类模拟攻击者攻寻找黑入IT设施漏洞的行为。 在威胁狩猎中,安全专家们会打破常规化身为狩猎者。在一次威胁狩猎中,狩猎者们会预定一个风险假设:IT

Inferring Motion Direction using Commodity Wi-Fi for Interactive Exergames (WiDrancd)论文翻译-爱代码爱编程

Inferring Motion Direction using Commodity Wi-Fi for Interactive Exergames (WiDrance) 利用wifi推断运动方向的互动健身游戏(WiDance) #摘要 In-air interaction acts as a key enabler for ambient intell

面试-Day1-爱代码爱编程

面试: java中创建线程方式: ​ 1.继承于thread: ​ 1.创建一个继承于Thread类的子类 ​ 2.重写Thread类的run() ​ 将此线程执行的操作声明在run()中 ​ 3.创建Thread类的子类的对象 ​ 4.通过此对象调用start()方法 public class ThreadTest02 { pub

PTA乙级-爱代码爱编程

PTA乙级(寒假刷完计划) 写在前面,刷完PTA上的(PAT (Basic Level) Practice (中文))题目,一共110题目 如果我在刷的时候有磕磕绊绊,会写下题解或者tips tip**:不要美观,要快(大不了最后格式化);读题仔细,验证每一个样例! 有一个遗憾1055 :23/25我觉得我题意理解有很多问题,因

夜间灯光数据简介与下载链接-爱代码爱编程

夜间灯光数据可以被用来研究人类活动的空间分布,例如能源消费模式、勾勒城市边界,很多研究表明灯光的面积或亮度与人口密度、GDP、能源消耗、碳排放、贫困分布、不透水表面密度分布图、粮食需求分布图、城市建设中的钢铁使用情况分布、自然灾害、地区武装冲突等等有很高的相关性,可以利用夜间灯光数据做预测分析。本文将目前可获取的夜间灯光数据进行整理,大家可以根据自己的研究

day10 - 使用canny算子进行人像勾勒-爱代码爱编程

本期主要介绍canny算子,了解canny算子的流程以及各个流程的原理和实现。 ​ 完成本期内容,你可以: 了解canny算子的流程和应用 若要运行案例代码,你需要有: 操作系统:Ubuntu 16 以上 或者

生成对抗网络,从dcgan到stylegan、pixel2pixel,人脸生成和图像翻译。_pixel2pixel gan-爱代码爱编程

文章目录 一、day1:生成对抗网络介绍1.1 生成对抗网络概述1.1.1 GAN的应用1.1.2 GAN发展历史 1.2 GAN原理1.3 生成对抗网络的训练1.4 DCGAN及代码实现1.5 Pa