图像的二值化之python+opencv
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。
简单的阈值-(全局阈值):
Python-OpenCV中提供了阈值(threshold)函数:
cv2.threshold()
函数:第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指用来对像素值进行分类的阈值。
第三个参数 y 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第四个参数 Methods 指,不同的不同的阈值方法,这些方法包括:
•cv2.THRESH_BINARY 图(1)
•cv2.THRESH_BINARY_INV 图(2)
•cv2.THRESH_TRUNC 图(3)
•cv2.THRESH_TOZERO 图(4)
•cv2.THRESH_TOZERO_INV 图(5)
破折线为将被阈值化的值;虚线为阈值
图(1)
大于阈值的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于阈值的像素点的灰度值设定为0。
图(2)
大于阈值的像素点的灰度值设定为0,而小于该阈值的设定为255。
图(3)
像素点的灰度值小于阈值不改变,大于阈值的灰度值的像素点就设定为该阈值。
图(4)
像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。
图(5)
像素点的灰度值大于该阈值的不进行任何改变,像素点的灰度值小于该阈值的,其灰度值全部变为0。
Python+opencv代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('1.bmp')
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh1=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(GrayImage,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO_INV)
titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [GrayImage, 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()
效果图:
自适应阈值:
当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
cv2.adaptiveThreshold()
函数:第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第三个参数 adaptive_method 指: CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
第四个参数 threshold_type 指取阈值类型:必须是下者之一 • CV_THRESH_BINARY,
• CV_THRESH_BINARY_INV
第五个参数 block_size 指用来计算阈值的象素邻域大小: 3, 5, 7, ...
第六个参数 param1 指与方法有关的参数。对方法CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数, 尽管它可以是负数。
自适应阈值: 对方法CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。
对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。
例如:
采用方法 CV_ADAPTIVE_THRESH_MEAN_C,阈值类型:CV_THRESH_BINARY, 阈值的象素邻域大小 block_size 选取3,参数param1 取3和5时:
部分原图像像素值 当参数param1为5时
部分原图像像素值 当参数param1为7时
选取对应领域(3*3)求其均值,然后减去参数param1的值为自适应阈值。测试时求得均值为小数时,貌似进行四舍五入之后再减去参数param1。(可能是我没测试准确,无聊时测试一下,共同学习)
Python+opencv代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('1.bmp')
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 中值滤波
GrayImage= cv2.medianBlur(GrayImage,5)
ret,th1 = cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)
#3 为Block size, 5为param1值
th2 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY,3,5)
th3 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\cv2.THRESH_BINARY,3,5)
titles = ['Gray Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [GrayImage, 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()
效果图:
图像的二值化之python+opencv相关推荐
- OpenCV图像二值化,Python
OpenCV图像二值化,Python 原图: 二值化处理(只有黑和白): import cv2if __name__=="__main__":image = cv2.imread( ...
- 基于python的图像二值化处理(opencv)
图像二值化处理 (python-opencv) 二值化 图像的二值化,在图像处理中是十分重要的一个步骤.是几乎所有后续的图像处理的基础和前提.只有根据不同场景选择不同的二值化处理,才能对一幅图片较好的 ...
- 【OpenCV图像处理】二、图像的二值化操作
图像的逻辑运算就是将两幅图像的对应像素进行逻辑运算.逻辑运算主要包括 与(AND)或(OR)及补运算.要对灰度图像进行逻辑运算,就要首先对图像进行二值化处理. 二值化的公式如下: 我们对灰度图像进行二 ...
- Python图像的二值化
什么是图像二值化 在认识二值化前,我们先简单介绍一下几个概念: 彩色图像 彩色图像有blue,green,red三个通道,取值范围均为0-255 灰度图 灰度图:只有一个通道,取值范围在0-255,所 ...
- Opencv全局二值化和局部二值化(python实现)
文章目录 1.前置知识 (1).什么是形态学处理 (2).形态学图像处理 2.二值化 (1)全局二值化 1)函数 2)阈值类型 3)代码实战 (2)局部二值化(自适应阈值) 1)函数 2)阈值类型 1 ...
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
十三种基于直方图的图像全局二值化算法实现 1. 什么是基于直方图的图像全局二值化算法 2. 灰度平均值 3. 百分比阈值(P-Tile法) 3. 基于双峰的阈值 3.1 基于平均值的阈值 3.2 基于 ...
- python-opencv 图像阈值二值化
本文讲解基于OpenCV-python的图像二值化API及浅显原理讲解 文章目录 一. 阈值 1. 简单阈值 2. 自适应阈值 二. 图像二值化 1. 全局图像二值化 2. 局部图像二值化 3. Ot ...
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
源:十三种基于直方图的图像全局二值化算法原理.实现.代码及效果.
最新文章
- 计算机论文学术不端,吉林大学计算机科学与技术学院 博士、硕士学位论文反学术不端行为暂行规定...
- 新CCIE笔记之'口口相传'路由协议
- ssh密码长度漏洞java_Linux中 OpenSSH 输入验证错误漏洞(CVE-2019-16905) 修复解决方案...
- a commit git 参数是什么意思_深入理解Git - 一切皆commit
- 分支限界法实现最优装载c++_分支限界法
- 今天网络又出问题了,现在的问题变成原IP地址不可用
- redis数据类型为key的常用命令
- php学习_与mysql的连接 2013.01.04
- LDA(线性判别分析)详解 —— matlab
- 【注意力机制】CBAM详解
- 【Elasticsearch】使用Elasticsearch中的copy_to来提高搜索效率
- gzdeflate函数_PHP中的gzcompress、gzdeflate、gzencode函数详解_php实例
- java 数组不重复_java如何找出数组中的不重复数字
- linux C语言基础学习总结
- 华为设备MSTP配置命令
- 穷查理宝典_穷查理宝典
- s3c6410地址映射
- Beautiful Soup 4.2.0 文档¶
- 程序员技术入股的那些坑!保护好你的核心技术,想走?没那么容易!
- Linux 安装WinUSB
热门文章
- java中StringTokenizer使用
- 怎么清理mysql的死链接_网站死链如何解决?其实很简单
- 分区助手专业版5.0下载与使用方法
- python strftime函数_PyThon中time strftime()函数用法
- 37岁京东程序员“被猝死”,当事人辟谣:已报警
- Java图形化界面---
- 盘古石杯全国电子数据取证大赛晋级赛wp(未完)
- <artifactId>里面的字符串不能有空格
- GeniePath:Graph Neural Networks with Adaptive Receptive Paths
- SQL Server数据库入门学习