教你如何建设一个模板网站,wordpress 3.9.2漏洞,毕节城乡建设局网站,成都网络推广优化文章目录 1、OpenCV1.1 窗口操作函数1.2 图像处理1.3 图像捕获与人脸检测 2、PIL2.1 主要函数2.2 表情图像合成2.3 手写数字转换2.4 滤波查找图像边缘 1、OpenCV
OpenCV Python是一个用于解决计算机视觉问题的Python库#xff0c;是用基于C实现的OpenCV构成的Python包。OpenC… 文章目录 1、OpenCV1.1 窗口操作函数1.2 图像处理1.3 图像捕获与人脸检测 2、PIL2.1 主要函数2.2 表情图像合成2.3 手写数字转换2.4 滤波查找图像边缘 1、OpenCV
OpenCV Python是一个用于解决计算机视觉问题的Python库是用基于C实现的OpenCV构成的Python包。OpenCV Python和Numpy兼容数据都被转换成Numpy数据结构这使得OpenCV更容易与其它库如SciPy和Matplotlib集成。
1.1 窗口操作函数
使用OpenCV可以利用里面的函数在窗口进行图像的显示涉及到的主要函数有三种 1imshow()函数 imshow()函数是在指定的窗口中显示图像窗口自动调整为图像大小。语法格式为imshow(string winName, Array InputData)其中参数winName 是窗口名称参数 InputData 为输入的图像。如果创建多个窗口则各窗口需要具有不同的窗口名称。 2destroyAllWindows()与DestroyWindow (string winName) 这两个函数都可以卸载窗口区别在于函数destroyAllWindows()卸载全部窗口而函数 DestroyWindow()卸载由参数winName 指定的窗口。 3waitkey(int delay 0) 函数 waitKey()等待用户按键其参数delay是延迟的时间单位为ms。在等待时间内如果检测到键盘动作则返回按键的ASCII码如果没有按下任何键则返回-1。参数 delay 默认为0即一直等待键盘输人。
1.2 图像处理
在使用OpenCV时有cv和cv2两个版本这两个版本都提供了对图片进行读、写和显示的功能。cv对应的函数是LoadImage()、ShowImage()和SaveImage()函数cv2对应的函数是imread()、imwrite()和imshow()函数下面以cv2版本为例介绍其中包含的常见函数。 1图像的基本读写操作 基本图像处理的函数包括imread()、imwrite()、split()、merge()等。图像读取函数imread()能加载图像文件并返回图像矩阵如果无法读取图像将返回一个空矩阵imread()函数支持bitmap位图、JEPG文件、png图形等各种常见的图形图像格式。 imread()函数的基本格式如下
imread(const String filename, int flags)其中filename表示文件名flgs为图像色彩模式默认为IMREAD_COLOR值为1BGR图像其他常见取值如下表所示
Mode值说明IMREAD_UNCHANGED值为-1按原样返回读取的图像带有alpha通道R,G,B,A 四个通道IMREAD_GRAYSCALE值为0将图像转换成单通道灰度图IMREAD_COLOR值为1将图像转换为3通道BGR彩色图像不带alpha通道IMREAD_REDUCED_GRAYSCALE_2值为16将图像转换成单通道灰度图像并且图像尺寸减小1/2IMREAD_REDUCED_COLOR_2值为17将图像转换成3通道BGR彩色图像并且图像尺寸减小1/2IMREAD_LOAD_GDAL值为8使用gdal驱动程序加载图像
图像读取与保存实例 使用cv2读取图像将图像转换为灰度图显示并保存。
import cv2
img cv2.imread(img.jpg,0) #转变为灰度图
cv2.imshow(image,img)
k cv2.waitKey(0)
if k 27: #按Esc键直接退出cv2.destroyAllWindows()
elif k ord(s): # 按s键先保存灰度图再退出cv2.imwrite(result.png,img)cv2.destroyAllWindows()2图像的通道拆分操作 图像通常由多个通道组成使用cv2的merge()和split()函数可以对图像的通道进行拆分与组合例如将图像拆分为三个通道然后将每个通道单独合成新的图像并保存。 拆分实例
import numpy as np
import cv2
img cv2.imread(img.jpg) #BGR图像模式
cv2.imshow(image,img)
k cv2.waitKey(0)
if k 13: #按Enter键退出cv2.destroyAllWindows()
elif k ord(s): #按s键保存并退出b,g,r cv2.split(img) #图像拆分成三个通道zeros np.zeros(img.shape[:2], dtype uint8) #值为0的单通道数组 imgrcv2.merge([zeros, zeros,r]) #合并图像imggcv2.merge([zeros, g,zeros])imgbcv2.merge([b,zeros, zeros])#将新图像写入文件cv2.imwrite(r.png,imgr) cv2.imwrite(g.png,imgg)cv2.imwrite(b.png,imgb) cv2.destroyAllWindows() 1.3 图像捕获与人脸检测
在进行图像处理前还可以使用OpenCV中的cv2.VideoCapture()函数进行摄像头图像的捕获其构造函数如下
VideoCapture()
VideoCapture(cam)
VideoCapture(const string filename)其中第一个是默认无参构造函数第二个指定要打开的摄像头设备取值为0时表示从摄像头直接获取第三个参数为指定路径的视频文件名称。 此外还有read()方法和release()方法。read()方法用于读取视频的帧返回值有两个retframe其中ret为布尔值如果读取到正确的帧则返回True读取到文件结尾就返回Falseframe为读取到的每帧的图像是三维矩阵。release()方法用于释放并关闭摄像头。 捕获摄像头图像实例
import cv2
cap cv2.VideoCapture(0)
while(True):ret, frame cap.read() cv2.imshow(uCapture, frame)key cv2.waitKey(1)if key 0xff ord(q) or key 27:print(frame.shape,ret)break
cap.release()
cv2.destroyAllWindows()在摄像头捕获到图像时若需要判断是否为人脸可使用Haar特征分类器该分类器为一个XML文件文件中包含了描述人体各个部位的Haar特征值包括人脸、眼睛、嘴唇等文件存放在OpenCV安装目录中的\data\haarcascades目录下一般包括多个分类器可以根据分类器的名称判断该分类器的用途例如haarcascade_frontalface_alt.xml和haarcascade_fronttalface_alt2.xml可以作为人脸识别的Haar特征分类器。
结合分类器文件可以使用OpenCV中的detectMultiScale()函数进行多个人脸检测检测出图片中包含的所有人脸同时使用vector保存各个人脸的坐标、大小用矩形表示。detectMultiScale()函数格式如下
objects cv2.CascadeClassifier.detectMultiScale(const Mat image,CV_OUT vectorRect objects,double scaleFactor 1.1, int minNeighbors 3, int flags 0, Size minSize Size(), Size maxSize Size())其中image表示待检测图片一般为灰度图像objects为待检测物体的矩形框向量组scaleFactor为前后两次相继的扫描中搜索窗口的比例系数默认为1.1即每次搜索窗口依次扩大10%minNeighbors表示构成检测目标的相邻矩形的最小个数默认为3个flags默认值为0该参数通常被省略在使用低版本 OpenCV时它可能会被设置为 CV_HAAR_DO_CANNY_PRUNING表示使用 Canny 边缘检测器来排除边缘过多或过少的区域。 minSize和maxSize用于限制目标区域的范围。 摄像头范围的人脸检测
import cv2
cascPathrhaarcascade_frontalface_alt2.xml
faceCascade cv2.CascadeClassifier(cascPath)
cap cv2.VideoCapture(0)
while(True):ret, img cap.read() faces faceCascade.detectMultiScale(img, 1.2, 2, cv2.CASCADE_SCALE_IMAGE,(20, 20)) for (x, y, w, h) in faces: img cv2.rectangle(img, (x, y), (xw, yh), (0, 255, 0), 2) cv2.imshow(uDetect faces, img)key cv2.waitKey(1)if key 0xFFord(q) or key 27: break
cv2.destroyAllWindows()
cap.release()2、PIL
在进行图像识别时图像的质量对识别的结果具有非常重要的影响因此一般在识别之前会对图像进行预处理。PIL模块是Python中最常用的图像处理库它能够完成图像处理、图像批处理归档、图像展示等任务。
2.1 主要函数
PIL可以处理多种文件格式的图像具有强大而便捷的图像处理和图形处理能力其中对图像进行的基础操作基本上都包含在PIL的Image模块当中该模块包含的函数可以使用图像的打开、保存、转换、合成、滤波等操作。Image模块的常用函数如下
函数名功能open()打开图像save()保存图像convert()图像格式转换show()显示图像split()从图像中拆分出各个通道merge()将多个通道合成一个图像crop()裁剪指定区域resize()缩放图像blend()将两幅图混合成一幅filter()设置滤波器对图像进行处理fromarray()从NumPy的ndarray数组生成图像
2.2 表情图像合成
心理学定义了人类6种基本表情分别为快乐、悲伤、愤怒、惊讶、厌恶和恐惧。有的研究者尝试将不同的表情进行比对、合成发现表情之间存在的内在联系。表情的合成可以使用图像合成实现PIL 的 Image 模块提供了合成函数 blend()功能是对参教给定的两个图像及透明度alpha插值生成一个新图像。 函数格式如下
PIL.image.blend(im1,im2,alpha)即输出满足如下公式 out im1*(1-alpha)im2*alpha 若alpha取值为0则合成图像与im1完全一致若alpha取值为1则合成图像与im2完全一致。此外在合成过程中两张图像的尺寸和模式需要一致。 表情图像合成实例
from PIL import Image
img1 Image.open( 1.jpg )
img1 img1.convert(RGBA)img2 Image.open( 2.jpg )
img2 img2.convert(RGBA)img Image.blend(img1, img2, 0.4)
img.show()
img.save( 3.png) 2.3 手写数字转换
数字图像在计算机内的存储方式是点阵式的,每个点存储了该像素的颜色值。图像处理的很多操作是针对图像的像素进行的如滤波。使PIL对图像进行底层像素处理也很方便。在数字图像坐标系中图像的起始点在左上角为(0,0) ,整体向右下方延伸假设纵轴以x轴表示横轴以y轴表示则一个像素可以使用(x,y)坐标来获取。 例如在进行手写数字识别时需要先将数字图像预处理为文本即使用PIL模块读取二值图并将图像保存到文本文件中实现过程如下
from PIL import Image
import numpy as np
import matplotlib.pyplot as pltimgImage.open(8.jpg).convert(L)
imgnp.array(img)
rows,colsimg.shape
txtfor i in range(rows):for j in range(cols):if (img[i,j]128):txt1else:txt0txt\n with open(8.txt,w) as f1: f1.write(txt)原数字图 识别后的文本
2.4 滤波查找图像边缘
图像识别可以基于颜色、轮廓、数值等模式。在预处理时对于边缘不够鲜明的图像可以进行图像锐化。锐化能够突出图像的边缘信息加强图像的轮廓特征便于人眼的观察和机器的识别。提取边缘的锐化也称为边缘检测边缘检测和很多图像处理方法一样一般使用卷积和滤波方法。 PIL库的ImageFilter模块提供了对图像进行平滑、锐化、边界增强等处理的滤波器这些滤波器主要用于Image磊的filter()方法使用时利用该函数来调用ImageFilter模块预定义的滤波器从而对图像进行滤波处理常用滤波器如下所示
滤波器作用BLUR模糊CONTOUR提取轮廓DETAIL细节增强EDGE_ENCHANCE边缘增强EDGE_ENCHANCE_MORE深度边缘增强EMBOSS浮雕效果FIND_EDGES查找边缘SMOOTH平滑SMOOTH_MORE深度平滑SHARPEN锐化
滤波器查找图像边缘实例
from PIL import Image,ImageFilter
im Image.open(people.jpg)
#轮廓
im.filter(ImageFilter.CONTOUR).save(rFindCt.jpg)
#找到边缘
im.filter(ImageFilter.FIND_EDGES).save(rFindEg.jpg)原图 轮廓图 边缘图