python+opencv入门和实战
常用三个库cv2,numpy,plt
1.灰度图只有一个通道表示亮度或灰度,对应一个矩阵;
彩色图有三个通道R,G,B对应三个矩阵,或三维矩阵。数字从0到255
2.图像读取
img=cv2.imread(""),img对应的是矩阵(读取的是bgr)
3.图像展示
cv2.imshow("",img)
cv2.waitKey(0) ## 等待时间,0时代表按键盘消失
4.展示图片信息
img.shape
用shape属性得到的是图片的宽高和通道数
img.dtype,像素数字类型
img.size总像素数
5.把彩色图像转化为灰度图
一般研究时先把彩色图像转化为灰度图
cv2.imread()
默认读取彩色图像,如果要读取灰色图像就用属性限定一下
cv2.imread("",cv2.IMREAD_GRAYSCALE)
6.把处理后的图像进行保存
cv2.imwrite("",)
7.读取视频
视频也是由图像组成,把视频分成多少帧
cv=cv2.VideoCapture(""),提取视频文件,也可以寻找到计算机里面的摄像头
VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”)
7.1判断视频能否打开
vc.isOpened()
if vc.isOpened():
open,frame=vc.read() ##一帧一帧的读取,返回两个值,第一个是true或false,第二个是数组矩阵
else :
open =False
7.2读取视频
while open:
ret,frame=vc.read()
if frame is None:
break
if ret ==true:
gray=cv2.cvtColor(frame ,cv2.COLOR_BGR2GRAY)##cv2内置的彩色图转换为灰度图
cv2.imshow("reault",gray)
if cv2.waitKey(10) & OxFF==27:##( OxFF==27,退出键)每一帧的播放间隔是需要研究的,与设定值和计算机执行速度有关
break
vc.release()## 把视频对象释放掉
cv2.destroyAllWindows()
8.截取部分图像数据
cat=img[0:200,0:200] ##指定切片
9.颜色通道提取
b,g,r=cv2.split(img)##把三维矩阵变为三个二维矩阵
b.shape
或img[ :,:,0] ,b
img[:,:,1],g
img[:.:.2],r
10.彩色通道合并
cv2.merge((b,g,r))
11.图片复制
img.copy()
解决python中变量的赋值是赋索引的情况
12.边界填充(使图像达到特定的尺寸)
##更改图像尺寸
cv2.resize(img,(50,40))
##比例扩大图像尺寸
cv2.resize(img,(0,0),fx=3,fy=3)##扩大三倍
把图形扩大一圈
top_size,bottom_size,left_size,right_size=(50,50,50,50)
cv2.copyMakeBorder(img, top_size,bottom_size,left_size,right_size,参数)
##参数对应的是填充方法
cv2.BIORDER_REFLECT...
13.数值计算
img+10
图像的加法
numpy中
img1+img2(注意图像尺寸)
注意0到255范围
cv2中用cv2.add()
14.图像融合
##把两个图像按比例进行融合
cv2.addWeighted(img,0.1,img2,0.2 ,0)
##也可以动态的用循环进行融合,得到图形的渐变,算法的研究
15.图像阈值
大于阈值怎么处理,小于阈值怎么处理
ret,thresh=cv2.threshould(src, thresh,maxval,type)##返回值是两个
src:输入图,只能是单通道的
dst:输出图
thresh:阈值
maxval:当像素值超过了阈值(或者小于 阈值,根据type来决定),所赋的值,一般为255
type是参数,5种,二值化(大于时取一个值,小于时取另一个值)
cv2.THRESH_BINARY(超过阈值取maxval,小于取0)
cv2.THRESH_BINARY_INV ##亮的变暗,暗的变亮
cv2.THRESH_TOZERO(大于阈值部分不变,其余为零)##暗的最暗
cv2.THRESH_TOZERO_INV,亮的最亮
cv2.THRESH_TRUNC##设定最亮的,其余不变
##函数的使用
16.图像的平滑处理
对像素点进行处理
有白点
即滤波
有噪声时会使得像素变化较大,故平滑处理即滤波
用的是滤波器,即模板,即卷积矩阵
把矩阵和图像进行分块运算
16.1均值滤波
一般是奇数行列矩阵
3x3卷积矩阵,元素值为一,进行卷积运算,即对应元素相乘最后取平均
blur=cv2.blur(img,(3,3))##均值滤波函数
16.2方波滤波
类似于设置一个阈值
16.3高斯滤波
离得越近重要度越大,即矩阵里面的数表示的是权重
16.4中值滤波
把数排列起来选择中间的数,即用区域表示点的思想
(美颜,滤镜)
16.5图像的拼接
用numpy对矩阵进行操作
numpy.hstack(img1,img2,img3)
##本质都是对矩阵的行列处理,但可以使用集成化的函数
17.图像形态学处理
17.1腐蚀操作(ps仿制印章)
kernel=np.ones((3,3),np.unit8)##生成三乘三的元素为一的矩阵,矩阵越大腐蚀力度越大
cv2.erode(img,kernel,iterations=1)##iterations代表的是迭代次数
去毛刺
如何提取图片中的某个元素(抠图)
17.2膨胀操作
cv2.dilate(img,kernel,iterations=1)
可以先腐蚀把线变细,再膨胀把线变粗
对二值图像的操作
17.3开运算与闭运算
开运算:先进行腐蚀再进行膨胀
cv2..morphologyEx(img,cv2.MORPH_OPEN,kernel)
闭运算:先膨胀后腐蚀
cv2..morphologyEx(img,cv2.MORPH_CLOSE,kernel)
17.4梯度运算
膨胀减去腐蚀,得到轮廓
cv2..morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
17.5礼帽与黑帽
礼帽=原图-开运算
cv2..morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
黑帽=闭运算-原图像
cv2..morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
18.图像梯度处理
边缘位置会有明显的梯度
边缘检测
水平梯度(像素差值)
上下梯度
总梯度
算子即模板矩阵,与图像进行卷积运算
算子sobel
dst=cv2.Sobel(src,ddepth,dx,dy,ksize)
ddepth:图像的深度cv2.CV_64F
dx,dy水平和竖直方向,0不计算,1计算
ksize:算子的大小,3为3乘3矩阵
白减去黑为正值,黑减去白为负数会被显示函数截断为零,故要取一下绝对值
cv2.convertScaleAbs(dst)
算出水平的,竖直的后用图片的权重叠加算总的,不建议直接计算总的
彩色图像一般需要先转化为灰度图,进行梯度运算后会得到轮廓
scharr算子(会得到更丰富信息)
laplacian算子(对噪音点敏感)
19.边缘检测算法
canny边缘检测
使用高斯滤波器,去噪声
计算图像中每一个像素点的梯度和方向
应用非极大值抑制,(保留大的梯度)
使用双阈值(找真实的边缘)
20.直方图与傅里叶变换
单通道才有直方图,指的是各个像素出现的次数
cv2.calcHist(images,channels,mask,histSIze,ranges)##用来画直方图
mask:确定统计区域
histSIze:区间的个数
ranges:像素数
hist=cv2.calcHist([img],[0],None,[256],[0,256])