该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各类算法,包括图像锐化算子、图像加强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。但愿文章对您有所帮助,若是有不足之处,还请海涵~html
该系列在github全部源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,之后会分享更多代码,一块儿加油。python
同时推荐做者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像加强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解git
前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素
[Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
[Python图像处理] 五.图像融合、加法运算及图像类型转换
[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移github
本篇文章主要讲解Python调用OpenCV实现图像阈值化处理操做,包括二进制阈值化、反二进制阈值化、截断阈值化、反阈值化为0、阈值化为0。全文均是基础知识,但愿对您有所帮助。
1.阈值化
2.二进制阈值化
3.反二进制阈值化
4.截断阈值化
5.反阈值化为0
6.阈值化为0web
PS:文章参考本身之前系列图像处理文章及OpenCV库函数,同时部分参考网易云视频,推荐你们去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请你们下来补充。算法
PSS:2019年1~2月做者参加了CSDN2018年博客评选,但愿您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index网络
(注:该部分参考做者的论文《基于苗族服饰的图像锐化和边缘提取技术研究》)app
图像的二值化或阈值化(Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来。一般会设定一个阈值T,经过T将图像的像素划分为两类:大于T的像素群和小于T的像素群。
灰度转换处理后的图像中,每一个像素都只有一个灰度值,其大小表示明暗程度。二值化处理能够将图像中的像素划分为两类颜色,经常使用的二值化算法如公式1所示:svg
当灰度Gray小于阈值T时,其像素设置为0,表示黑色;当灰度Gray大于或等于阈值T时,其Y值为255,表示白色。
Python OpenCV中提供了阈值函数threshold()实现二值化处理,其公式及参数以下图所示:
retval, dst = cv2.threshold(src, thresh, maxval, type)函数
该方法先要选定一个特定的阈值量,好比127。新的阈值产生规则以下:
(1) 大于等于127的像素点的灰度值设定为最大值(如8位灰度值最大为255)
(2) 灰度值小于127的像素点的灰度值设定为0
例如,163->255,86->0,102->0,201->255。
关键字为 cv2.THRESH_BINARY,完整代码以下:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test.jpg') #灰度图像处理 GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #二进制阈值化处理 r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY) print r #显示图像 cv2.imshow("src", src) cv2.imshow("result", b) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出为两个返回值,r为127,b为处理结果(大于127设置为255,小于设置为0)。以下图所示:
该方法与二进制阈值化方法类似,先要选定一个特定的灰度值做为阈值,好比127。新的阈值产生规则以下:
(1) 大于127的像素点的灰度值设定为0(以8位灰度图为例)
(2) 小于该阈值的灰度值设定为255
例如,163->0,86->255,102->255,201->0。
关键字为 cv2.THRESH_BINARY_INV,完整代码以下:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test.jpg') #灰度图像处理 GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #反二进制阈值化处理 r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV) print r #显示图像 cv2.imshow("src", src) cv2.imshow("result", b) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
该方法须要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变,好比127。新的阈值产生规则以下:
(1) 大于等于127的像素点的灰度值设定为该阈值127
(2) 小于该阈值的灰度值不改变
例如,163->127,86->86,102->102,201->127。
关键字为 cv2.THRESH_TRUNC,完整代码以下:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test.jpg') #灰度图像处理 GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #截断阈值化处理 r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TRUNC) print r #显示图像 cv2.imshow("src", src) cv2.imshow("result", b) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示::
该方法先选定一个阈值,好比127,接着对图像的灰度值进行以下处理:
(1) 大于等于阈值127的像素点变为0
(2) 小于该阈值的像素点值保持不变
例如,163->0,86->86,102->102,201->0。
关键字为 cv2.THRESH_TOZERO_INV,完整代码以下:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test.jpg') #灰度图像处理 GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #反阈值化为0处理 r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV) print r #显示图像 cv2.imshow("src", src) cv2.imshow("result", b) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
该方法先选定一个阈值,好比127,接着对图像的灰度值进行以下处理:
(1) 大于等于阈值127的像素点,值保持不变
(2) 小于该阈值的像素点值设置为0
例如,163->163,86->0,102->0,201->201。
关键字为 cv2.THRESH_TOZERO,完整代码以下:
#encoding:utf-8 import cv2 import numpy as np #读取图片 src = cv2.imread('test.jpg') #灰度图像处理 GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #阈值化为0处理 r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO) print r #显示图像 cv2.imshow("src", src) cv2.imshow("result", b) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
完整五个算法的对比代码以下所示:
#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt #读取图像 img=cv2.imread('test.jpg') lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 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()
输出结果以下图所示:
但愿文章对你们有所帮助,若是有错误或不足之处,还请海涵。最近经历的事情太多,有喜有悲,关闭了朋友圈,但愿经过不断学习和写文章来忘记烦劳,将忧郁转换为动力。哎,总感受本身在感动这个世界,帮助全部人,而本身却…谁有关心秀璋?晚安。 (By:Eastmount 2018-10-30 晚上10点 https://blog.csdn.net/Eastmount/)