第十四节,OpenCV学习(三)图像的阈值分割

图像的阈值处理

图像的阈值分割:图像的二值化(Binarization)

阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。

一、简单阈值

选取一个全局阈值,然后把图像分成非黑即白的二值图像。

cv2.threshold()【源图像矩阵,进行分类的阈值,高于(低于)阈值时赋予的新值,方法选择参数】

返回两个值:阈值,阈值处理后的图像矩阵。

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值翻转)
  • cv2.THRESH_TRUNC(得到图像为多像素值)
  • cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值,低于阈值时不作处理)
  • cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)
import cv2
import numpy as np
img = cv2.imread(‘dog.jpg‘, 0)# 灰度图
# 黑白二值
res, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 黑白二值翻转
res, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# 得到图像为多像素值
res, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# 当像素高于阈值时像素设置为255,低于阈值时不作处理
res, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
# 当像素低于阈值时设置为255,高于阈值时不作处理
res, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
print(res)
cv2.imshow(‘thresh1‘, thresh1)
cv2.imshow(‘thresh2‘, thresh2)
cv2.imshow(‘thresh3‘, thresh3)
cv2.imshow(‘thresh4‘, thresh4)
cv2.imshow(‘thresh5‘, thresh5)
cv2.imshow(‘gray-img‘, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、自适应阈值

简单阈值是一种全局性的阈值,只需要设定一个阈值,整个图像都和这个阈值比较,而自适应阈值可以看成一种局部性的阈值,通过设定一个区域大小,比较这个点与区域大小里面像素点的平均值的大小关系确定这个像素点的情况。

这种方法理论上得到的效果更好,相当于在动态自适应调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

import cv2
import numpy as np
img = cv2.imread(‘dog.jpg‘,0)
res, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 第一个参数为原始图像矩阵
# 第二个参数为像素值上限
# 第三个是自适应方法:
# cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
# -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和,权重为一个高斯窗口
# 第四个值得赋值方法:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# 第五个Block size:设定领域大小(一个正方形的领域)
# 第六个参数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)
th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow(‘img‘, img)
cv2.imshow(‘th1‘, th1)
cv2.imshow(‘th2‘, th2)
cv2.imshow(‘th3‘, th3)
cv2.imshow(‘th4‘, th4)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、Otsu‘s二值化

 cv2.threshold( )函数有两个返回值,一个是阈值,第二个是处理后的图像矩阵。

前面对于阈值的设定上,我们选择的阈值都是127,在实际情况中,有的图像阈值不是127得到的图像效果更好。那么这里就需要算法自己去寻找一个阈值,而Otsu‘s就可以自己找到一个认为最好的阈值。并且Otsu‘s非常适合于图像灰度直方图(只有灰度图像才有)具有双峰的情况。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(‘dog.jpg‘, 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 简单滤波
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # Otsu滤波
print(ret2)
cv2.imshow(‘img‘, img)
cv2.imshow(‘th1‘, th1)
cv2.imshow(‘th2‘, th2)
# 解决matplotlib中显示图像的中文乱码问题
plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘]
plt.rcParams[‘axes.unicode_minus‘] = False
plt.hist(img.ravel(), 256)
plt.title(‘灰度直方图‘)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

原文地址:https://www.cnblogs.com/wyx501/p/10713422.html

时间: 2024-10-06 11:52:48

第十四节,OpenCV学习(三)图像的阈值分割的相关文章

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

centos 监控cacti/nagios/zabbix 第三十四节课

centos   监控cacti/nagios/zabbix   第三十四节课 上半节课 下半节课 f

第三百二十四节,web爬虫,scrapy模块介绍与使用

第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy 使用了 Twisted异步网络库来处理网络通讯.

第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

第三百三十四节,web爬虫讲解2-Scrapy框架爬虫-Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻标题和rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息,那么这种一般都是 js 的 Ajax 动态请求生成的信息 我们以百度新闻为列: 1.分析网站 首先我们浏览器打开百度新闻,在网页中间部分找一条新闻信息 然后查看源码,看看在源码里是否有

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数值. 该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 stats 来使用无论数据收集(stats collection)开启或者关闭,数据收集器永远都是可用的. 因此您可以import进自己的模块并使用其API(增加值或者设置新的状态键(stat k

大白话5分钟带你走进人工智能-第十四节过拟合解决手段L1和L2正则

                                                                                                  第十四节过拟合解决手段L1和L2正则 第十三节中,我们讲解了过拟合的情形,也就是过度的去拟合训练集上的结果了,反倒让你的模型太复杂.为了去解决这种现象,我们提出用L1,L2正则去解决这种问题. 怎么把正则应用进去?我们重新审视目标函数,以前我们可以理解目标函数和损失函数是一个东西.而有正则的含义之后,目

centos LNMP第二部分nginx、php配置 第二十四节课

centos  LNMP第二部分nginx.php配置  第二十四节课 上半节课 下半节课 f

centos mysql 优化 第二十四节课

centos mysql  优化  第二十四节课 f

十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象

一.通过广播方式: 1.比如登录.假如下面这个方法是外界调用的,那么怎样在LoginActivity里面执行登录操作,成功之后在回调listener接口呢?如果是平常的类,可以通过构造函数将监听类对象传入即可.但是在Activity中不能传递监听对象,所以考虑使用广播来实现. public void login(final LoginOnClickListener listener) { Intent intent = new Intent(context, LoginActivity.clas