Python+OpenCV图像处理实验
目录
1、灰度化功能
2、反转功能
3、通道分离功能
4、噪音、滤波功能
5、高斯双边滤波功能
6、均值偏移滤波功能
7、图像二值化功能
8、Canny边缘检测功能
9、直线检测功能
10、圆形检测功能
11、轮廓发现功能
12、人脸检测功能
这个项目是我在GitHub上看到的,和我之前的Python+OpenCV实时图像处理,异曲同工,只不过是我对实时视频的处理,这个是图像处理,功能上感觉这个项目更加全面一些,特学习并分享~
该项目可实现图像的多样化处理,基本上包含了OpenCV模块常用的图像处理功能,非常适合初学者理解和应用,包括:灰度化功能、反转功能、通道分离功能、噪音滤波功能、高斯双边滤波功能、均值偏移滤波功能、图像二值化功能、Canny边缘检测功能、直线检测功能、圆形检测功能、轮廓发现功能和人脸检测功能。
1、灰度化功能
灰度化功能,效果如下所示:
实现代码如下所示:
# 灰度化def to_gray(self):src = self.cv_read_img(self.src_file)if src is None:returngray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# print("类型", type(gray))# get_image_info(gray)self.decode_and_show_dst(gray)
2、反转功能
反转功能,按位取反,白变黑,黑变白,效果如下所示:
实现代码如下所示:
# 反转def bitwise_not(self):src = self.cv_read_img(self.src_file)if src is None:returndst = cv.bitwise_not(src) self.decode_and_show_dst(dst)
3、通道分离功能
通道分离功能,效果如下所示:
实现代码如下所示:
# 通道分离def channels_split(self):src = self.cv_read_img(self.src_file)if src is None:returnb, g, r = cv.split(src)merge_image = cv.merge([b, g, r])"""创建三维数组,0维为B,1维为G,2维为R"""height, width, channels = src.shapeimg = np.zeros([height*2, width*2, channels], np.uint8)img[0:height, 0:width] = np.expand_dims(b, axis=2)img[0:height, width:width*2] = np.expand_dims(g, axis=2)img[height:height*2, 0:width] = np.expand_dims(r, axis=2)img[height:height*2, width:width*2] = merge_imageself.decode_and_show_dst(img)
4、噪音、滤波功能
图像处理中噪声:主要有三种:
- 椒盐噪声(Salt & Pepper):含有随机出现的黑白亮度值。
- 脉冲噪声:只含有随机的正脉冲和负脉冲噪声。
- 高斯噪声:含有亮度服从高斯或正态分布的噪声。高斯噪声是很多传感器噪声的模型,如摄像机的电子干扰噪声。
滤波器主要两类:线性和非线性
- 线性滤波器:使用连续窗函数内像素加权和来实现滤波,同一模式的权重因子可以作用在每一个窗口内,即线性滤波器是空间不变的。
如果图像的不同部分使用不同的滤波权重因子,线性滤波器是空间可变的。因此可以使用卷积模板来实现滤波。线性滤波器对去除高斯噪声有很好的效果。常用的线性滤波器有均值滤波器和高斯平滑滤波器。
(1) 均值滤波器:最简单均值滤波器是局部均值运算,即每一个像素只用其局部邻域内所有值的平均值来置换。
(2) 高斯平滑滤波器是一类根据高斯函数的形状来选择权值的线性滤波器。 高斯平滑滤波器对去除服从正态分布的噪声是很有效的。
- 非线性滤波器:
(1) 中值滤波器:均值滤波和高斯滤波运算主要问题是有可能模糊图像中尖锐不连续的部分。中值滤波器的基本思想使用像素点邻域灰度值的中值来代替该像素点的灰度值,它可以去除脉冲噪声、椒盐噪声同时保留图像边缘细节。中值滤波不依赖于邻域内与典型值差别很大的值,处理过程不进行加权运算。中值滤波在一定条件下可以克服线性滤波器所造成的图像细节模糊,而对滤除脉冲干扰很有效。
(2) 边缘保持滤波器:由于均值滤波:平滑图像外还可能导致图像边缘模糊和中值滤波:去除脉冲噪声的同时可能将图像中的线条细节滤除。边缘保持滤波器是在综合考虑了均值滤波器和中值滤波器的优缺点后发展起来的,它的特点是:滤波器在除噪声脉冲的同时,又不至于使图像边缘十分模糊。
过程:分别计算[i,j]的左上角子邻域、左下角子邻域、右上角子邻域、右下角子邻域的灰度分布均匀度V;然后取最小均匀度对应区域的均值作为该像素点的新灰度值。分布越均匀,均匀度V值越小。v=<(f(x, y) - f_(x, y))^2
噪音、滤波功能,效果如下所示:
实现代码如下所示:
def noise_and_blur(self):src = self.cv_read_img(self.src_file)if src is None:return# 加高斯噪声h, w, c = src.shapefor row in range(h):for col in range(w):s = np.random.normal(0, 20, 3) # normal(loc=0.0, scale=1.0, size=None),均值,标准差,大小b = src[row, col, 0]g = src[row, col, 1]r = src[row, col, 2]src[row, col, 0] = clamp(b + s[0])src[row, col, 1] = clamp(g + s[1])src[row, col, 2] = clamp(r + s[2])img = np.zeros([h * 2, w * 2, c], np.uint8)img[0:h, 0:w] = src# GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)# ksize表示卷积核大小,sigmaX,Y表示x,y方向上的标准差,这两者只需一个即可,并且ksize为大于0的奇数dst = cv.GaussianBlur(src, (5, 5), 0) # 高斯模糊,sigmaX与ksize一个为0img[0:h, w:w*2] = dstself.decode_and_show_dst(img)
5、高斯双边滤波功能
高斯双边滤波功能,同时考虑空间与信息和灰度相似性,达到保边去噪的目的。双边滤波的核函数是空间域核与像素范围域核的综合结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息。效果如下所示:
实现代码如下所示:
# 高斯双边滤波def bilateral_filter(self):src = self.cv_read_img(self.src_file)if src is None:returndst = cv.bilateralFilter(src, 0, 100, 15)self.decode_and_show_dst(dst)
6、均值偏移滤波功能
均值偏移滤波功能,效果如下所示:
实现代码如下所示:
# 均值偏移滤波def mean_shift_filter(self):src = self.cv_read_img(self.src_file)if src is None:returndst = cv.pyrMeanShiftFiltering(src, 10, 50) # 均值偏移滤波self.decode_and_show_dst(dst)
7、图像二值化功能
图像二值化功能,效果如下所示:
实现代码如下所示:
# 图像二值化def threshold(self):src = self.cv_read_img(self.src_file)if src is None:returngray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)# 这个函数的第一个参数就是原图像,原图像应该是灰度图。# 第二个参数就是用来对像素值进行分类的阈值。# 第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值# 第四个参数来决定阈值方法,见threshold_simple()# ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)ret, dst = cv.threshold(gray, 127, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)self.decode_and_show_dst(dst)
8、Canny边缘检测功能
Canny边缘检测功能,效果如下所示:
实现代码如下所示:
# Canny边缘检测def canny_edge(self):src = self.cv_read_img(self.src_file)if src is None:returnblurred = cv.GaussianBlur(src, (3, 3), 0)gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)dst = cv.Canny(grad_x, grad_y, 30, 150)# dst = cv.Canny(gray, 50, 150)self.decode_and_show_dst(dst)
9、直线检测功能
直线检测功能,效果如下所示:
实现代码如下所示:
# 直线检测def hough_line(self):src = self.cv_read_img(self.src_file)if src is None:returngray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)lines = cv.HoughLines(edges, 1, np.pi/180, 200)for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0+1000*(-b))y1 = int(y0+1000*(a))x2 = int(x0-1000*(-b))y2 = int(y0-1000*(a))cv.line(src, (x1, y1), (x2, y2), (0, 0, 255), 2)self.decode_and_show_dst(src)
10、圆形检测功能
圆形检测功能,效果如下所示:
实现代码如下所示:
# 圆检测def hough_circles(self):src = self.cv_read_img(self.src_file)if src is None:returndst = cv.pyrMeanShiftFiltering(src, 10, 100)cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circles))for i in circles[0, :]:cv.circle(src, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.circle(src, (i[0], i[1]), 2, (255, 0, 255), 2)self.decode_and_show_dst(src)
11、轮廓发现功能
轮廓发现功能,并进行覆盖,效果如下所示:
实现代码如下所示:
# 轮廓发现def find_contours(self):src = self.cv_read_img(self.src_file)if src is None:returndst = cv.GaussianBlur(src, (3, 3), 0)gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)contous, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for i,contou in enumerate(contous):cv.drawContours(src, contous, i, (0, 0, 255), 1)# 轮廓self.decode_and_show_dst(src)# 轮廓覆盖for i,contou in enumerate(contous):cv.drawContours(src, contous, i, (0, 0, 255), -1)self.decode_and_show_dst(src)
12、人脸检测功能
人脸检测功能,效果如下所示:
实现代码如下所示:
#人脸识别 正脸 需要下载xml模型 haarcascade_frontalface_alt.xmldef face_recognize(self):src = self.cv_read_img(self.src_file)if src is None:returngray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)face_cascade = cv.CascadeClassifier('haarcascade_frontalface_alt2.xml')faces = face_cascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=3,minSize=(5, 5))for (x, y, w, h) in faces:cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)self.decode_and_show_dst(src)
请关注微信公众号,回复关键字: 图像处理实验,获取项目文件~
Python+OpenCV图像处理实验相关推荐
- Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...
- Python+Opencv图像处理新手入门教程(三):阈值与二值化
一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...
- Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图
一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...
- python+opencv图像处理之七:直方图均衡化
python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...
- Python+OpenCV图像处理(一篇全)
参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...
- Python+OpenCV图像处理(五)——图像阈值和二值化
系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...
- Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧. Python OpenCV 基础知识铺垫 cv2.compareHist 函数 橡皮擦的小节 基础知识铺垫 上篇博客 Py ...
- python+opencv图像处理之边缘检测车道线识别
python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...
- Python OpenCV图像处理 理论 代码
python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...
最新文章
- 【学习笔记】超简单的多项式求逆(含全套证明)
- 资料收集--Subversion与CVS的优势
- 2022.2.18自制玉米凉粉
- Python 基础算法(1) - 算法简介
- pycharm专业版(window)安装
- Apache和Nginx的区别
- K8S Learning(4)——Namespace
- 制作win10安装u盘_最简单的Win10系统安装U盘制作方法
- 基于JAVA+SpringBoot+Mybatis+MYSQL的家庭财务管理系统
- 如何用iframe代码显示调用网页的指定部分
- c语言 屏幕亮度调节_4096级屏幕亮度调节:改善安卓机自动亮度调节顽疾
- JVM java虚拟机
- 标准商业计划书大纲模版
- rx550 黑苹果_黑苹果免驱显卡速查表
- PHP小白之路1--PHP之简易留言板设计
- 使用Arduino解码并发送433MHz RF无线射频信号
- CentOS7部署WeADMIN监控主机交换机和URL(无坑版)
- python广义矩估计_《利用Python进行数据分析》13章(中二)建模库介绍
- 宝宝巴士儿歌下载链接
- Dom——隔行变色、分时显示问候语
热门文章
- [JavaScript] JavaScript数组挖掘,不只是讲数组哟(2)
- Android自定义View —— TypedArray
- 一篇文章让你读懂Pivotal的GemFire家族产品
- MySQL 学习笔记(5)— 视图优缺点、创建视图、修改视图、删除视图
- sftp协议下如何上传和下载文件
- Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
- Ubuntu中的minicom
- Html中各种空格的显示
- Android ActionBarDrawerToggle、DrawerLayout、ActionBar 结合
- ROOT android 原理。 基于(zergRush)