文章目录
前言
因为想要去张亮老师的实验室摸摸鱼,于是开始学OpenCV,这是一些学OpenCV的笔记。
一、图片的导入
import cv2#导入OpenCV
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img = cv2.imread('1.jpg')#从当前目录下读取图片
cv2.imshow('img_show',img)#创建窗口img_show展示img
cv2.waitKey(0)
cv2.destroyAllWindows()#销毁窗口
cv2.waitKey(1)#直接关窗口会卡住查询后添加这一行就没问题了
运行结果如图(原图)后面处理都用这张图
二、其他常用操作
img.shape#输出图片的尺寸
img=cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)#转换成灰度图
cv2.imwrite('ans.jpg',img)#保存图片命名为'ans.jpg'
b,g,r=cv2.split(img)#分出来三个通道的图像(都是灰度图)
img_b=img.copy()
img_b[:,:,2]=0#rgb对应210
img_b[:,:,1]=0#2和1通道为0则得到只有blue的图像
gam=cv2.resize(game,(680,454))#重新设置图片尺寸
三、视频的读取和输出
视频就是由一帧一帧的图片组成的,所以读入视频后,可以循环输出每一帧的图片,达到播放视频的效果。
vc = cv2.VideoCapture('girl.mp4')#读入视频
if vc.isOpened():#检测是否读取成功
open,frame=vc.read()
else:
open=False
while open:#循环输出每一帧图片
ret,frame=vc.read()
if frame is None:
break
if ret==True:
cv2.imshow("result",frame)
if cv2.waitKey(20)&0xFF == 27:#waitKey里面数字越大播放速度越慢
break
vc.release()
cv2.destroyAllWindows()
cv2.waitKey(1)
四、ROI(感兴趣区域)
就是截取图片的一部分,直接用中括号[ : ; : ; ]
cat=img[0:300,400:800]
五、图像阈值
cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下:
ret,dst=cv2.threshold(src,thresh,maxval,type)
src::灰度图
thresh:阈值,返回值ret等于thresh
maxval:最大值
type:阈值类型
对于最后一个参数,常见的阈值类型有:
THRESH_BINARY(大于阈值的取maxval,其余取0)
THRESH_BINARY_INV(和上面相反)
THRESH_TRUNC(截断,大于阈值的都等于阈值,其余不变)
THRESH_TOZERO(大于部分不变,其他取0)
THRESH_TOZERO_INV(和上相反)
ret,t1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#示例
转换成灰度图后再阈值操作
六、图像平滑处理
平滑的目的
1. 模糊:在提取大目标之前,去除太小的细节将目标内的小间断点连接。
2.消除噪声:改善图像质量,降低干扰。
1.均值滤波
简单的平均卷积操作
blur=cv2.blur(img,(3,3))
2. 高斯滤波
高斯滤波的卷积核里的数值符合高斯分布,相当于更重视中间的数值
aussian=cv2.GaussianBlur(img,(5,5),1)
3.中值滤波
用中值代替
median=cv2.medianBlur(img,5)
七、形态学处理
常用的形态学处理方法包括:腐蚀、膨胀、开运算、闭运算、顶帽运算、底帽运算,其中膨胀与腐蚀是图像处理中最常用的形态学操作手段,其他方法是两者相互组合而产生的。
黑白图像上,腐蚀就是把结构元能够覆盖到黑色区域的点全部数值设为0(变黑)
膨胀则刚好相反,把在黑色区域的能够覆盖到白色区域的点变白(目前的粗浅理解)
kernel = np.ones((3,3),np.uint8) #一个核(结构元?)
erosion = cv2.erode(img,kernel,iterations = 1)#腐蚀操作,第三个参数是迭代次数
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)#膨胀操作
开运算:先腐蚀再膨胀
闭运算:先膨胀再腐蚀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
梯度=膨胀-腐蚀
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
八、计算梯度
通过卷积操作计算出图像的梯度
- Sobel算子
- Scharr算子
- laplacian算子
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
- ddepth:图像的深度
- dx和dy分别表示水平和竖直方向
- ksize是Sobel算子的大小
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#表示只算水平方向
sobelx = cv2.convertScaleAbs(sobelx)#取绝对值不然有一边是负数会自动取0
cv_show(sobelx,'sobelx')
三种算子的区别
#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy,scharrxy,laplacian))
cv2.imshow('gradient', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
九、Canny边缘检测
-
使用高斯滤波器,以平滑图像,滤除噪声。
-
计算图像中每个像素点的梯度强度和方向。
-
应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
-
应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
-
通过抑制孤立的弱边缘最终完成边缘检测。
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv2.imshow('gradient', res)
cv2.waitKey(0)
cv2.destroyAllWindows()