OpenCV学习笔记


前言

因为想要去张亮老师的实验室摸摸鱼,于是开始学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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值