概述
由于这是我便看视频边学习记下来的笔记,有什么不足之处还请各位指正。
本篇教程不涉及原理分析,仅为操作方面的内容。
ps:所有打开文件操作均可加绝对路径或相对路径
opencv基本操作:
读取:img=cv2.imread("图像名.拓展名",模式名)
#读取图像模式:cv2.IMREAD_COLOR//彩色图像
cv2.IMREAD_GRAYSCALE//灰度图
该函数将读取内容传入前方img参数中
图像展示:cv2.imshow("窗口名",传入数据所在形参)
ps:形参实参区分见笔记,该函数将展示数据对应的图像
cv2.waitKey(a)//等待a秒,a=0时为等待到任意键被按下时
cv2.destoryAllWindows()//关闭所有窗口
///img.shape//展示img形参中数据矩阵类型(长,宽,几个)ps:存疑
shape函数解析:https://blog.csdn.net/likeyou1314918273/article/details/89510234
保存:cv2.imwrite("保存名.拓展名",img)//img为传入数据,该函数将创建一个新文件由于保存图像数据
查看图像尺寸:img.size//查看img中所存储的图像数据的尺寸ps:像素点多少
视频读取:vc=cv2.VideoCapture("文件名.拓展名")//该函数将视频文件打开并链接到形参上
vc.isOPened()//检查vc指向的文件是否被正常打开返回ture或false
open,frame=vc.read()//按帧读取视频文件内容ps:open传入布尔值检测是否被正确读取,frame传入读取数据,,都为形参随意指定
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)//将读取的的BGR图像转换成灰度图
示例代码:
‘’‘
vc = cv2.VideoCapture('test.mp4')
# 检查是否打开正确
if vc.isOpened():
oepn, frame = vc.read()
else:
open = False
while open:
ret, frame = vc.read()
if frame is None:
break
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('result', gray)
if cv2.waitKey(100) & 0xFF == 27:
break
vc.release()
cv2.destroyAllWindows()
’‘’
截取部分图像数据:img=cv2.imread('cat.jpg')
cat=img[0:50,0:200] #通过切片方法实现对图像局部数据的切割处理
同理,处理出单通道图像数据操作为:
B:cat_B=img.copy()#复制原图像
cat_B[:,:,1]=0
cat_B[:,:,2]=0
# 只保留G
cur_G= img.copy()
cur_G[:,:,0] = 0
cur_G[:,:,2] = 0
# 只保留R
cur_R = img.copy()
cur_R[:,:,0] = 0
cur_R[:,:,1] = 0
可以看出[a,b,c]中c控制嵌套列表中的第几个列表,opencv数据读取为BGR排序
边界填充:img_1= cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, 扩展模式名)
扩展模式:
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefg
BORDER_CONSTANT:常量法,常数值填充。//常量法要在后边在寄一个参数value=a,来确定填充颜色
图像处理
图像阈值操作:ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type:二值化操作的类型,包含以下5种类型:
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
图像平滑处理
均值滤波:blur=cv2.blur(img,(3,3))//在3*3的方形矩阵像素点中取均值滤波
方框滤波:box = cv2.boxFilter(img,-1,(3,3), normalize=True) //基本和均值一样,可以选择归一化
归一化简介:https://blog.csdn.net/caihuanqia/article/details/107088094?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164359478716780265470889%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164359478716780265470889&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_ulrmf~default-2-107088094.pc_search_insert_ulrmf&utm_term=%E5%BD%92%E4%B8%80%E5%8C%96&spm=1018.2226.3001.4187
高斯滤波:aussian = cv2.GaussianBlur(img, (5, 5), 1) //高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的,中间像素点占用权重大
中值滤波:median = cv2.medianBlur(img, 5)//相当于用中值代替
腐蚀操作:erosion = cv2.erode(传入图像数据,传入和,iterations = 1#迭代次数)
传入和操作:kernel = np.ones((30,30),np.uint8) //kernel为形参,表示uint8类型图像单个矩阵操作范围为30*30像素越大腐蚀/膨胀影响区域越大。
膨胀操作:dilate = cv2.dilate(传入图像数据,传入和,iterations = 1#迭代次数)
开/闭运算操作:
ps:以下参数kernel为传入和
开:先腐蚀,再膨胀kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
闭:先膨胀,再腐蚀kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
梯度运算:梯度=膨胀-腐蚀
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
res = np.hstack((dilate,erosion))
礼帽与黑帽:
礼帽 = 原始输入-开运算结果
黑帽 = 闭运算-原始输入
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
Soble算子:一种对图像数据的处理方法,主要用于边缘检测。
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
ddepth:图像的深度
dx和dy分别表示水平和竖直方向
ksize是Sobel算子的大小
eg:sobelx = cv2.Sobel(img,cv2.CV_64F//准换成可以表示负数的形式,1,0,ksize=3)
表示在x方向上的Soble算子,通过设定阈值来检测边缘(Soble算子通过检测X/Y方向上像素点的差异程度进行对像素点是否为边缘的判断)
使用soble算子会使图像边缘变成白色其他为黑色
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)//x方向
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)//y方向
sobelx = cv2.convertScaleAbs(sobelx) //该函数较简单,便是将原图像的像素值均转化成类型为np.uint8
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
laplacian算子:laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
Scharr算子: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)
Canny边缘检测:
1) 使用高斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和方向。
3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤立的弱边缘最终完成边缘检测。
边缘检测操作:v1=cv2.Canny(img,a,b)//a,b为双阈值检测,a为最小阈值,b为最大阈值。
图像金字塔:
向上采样:up=cv2.pyrUp(img)
向下采样:down=cv2.pyrDown(img)
拉普拉斯金字塔:原始数据减去原始数据下采样后上采样的数据得到的数据是一次拉普拉斯金字塔操作
down=cv2.pyrDown(img)
down_up=cv2.pyrUp(down)
l_1=img-down_up
cv_show(l_1,'l_1')//一次操作
图像轮廓操作:
cv2.findContours(img,mode,method)
mode:轮廓检索模式
RETR_EXTERNAL :只检索最外面的轮廓;
RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
method:轮廓逼近方法
CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。
为了更高的准确率一般使用二值图像。
最后
以上就是俏皮月亮为你收集整理的opencv基本操作的全部内容,希望文章能够帮你解决opencv基本操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复