Opencv知识A

图形读入

图像读取

创建car.py与图片car.jpg同一文件夹
(在读取图片时就不用考虑路径问题了)
代码如下

import cv2 #导入CV2模块
img=cv2.imread('car.jpg',IMREAD_GRAYSCALE)
#调用cv2.imread(图片名字,决定是彩色还是灰色)
print(img)
print(img.size)
print(img.shape)
print(type(img))
cv2.imshow('car',img)#展示图片CV2.imshow(窗口名字,图像)
cv2.waitKey(0)#单位毫秒图片展示时间,0则一直
cv2.destroyAllWindows()#关闭所有窗口

cv2.IMREAD_COLOR彩色图像
cv2.IMREAD_GRAYSCALE灰色图像

可以把显图部分写成函数

def cv_show(name,img)
	cv2.imshow(name,img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()

视频读取

视频由图像组成包含很多帧
每一帧都是静止的
把帧连起来就是视频了。

import cv2
video=cv2.VideoCapture('video.mp4')
if video.isOpened():#能否打开
    open,frame=video.read()#返回两个参数
else: 
    open=False
while open:#循环遍历每一帧图像
    ret,frame=video.read()#ret是布尔类型,frame是每一帧图像
    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
video.release()
cv2.destroyAllWindows()

cv2.VideoCapture()函数
1用于打开摄像头并完成摄像头的初始化信息。
video(捕获对象) = cv2.VideoCapture(“摄像头ID号”)
2用于初始化视频文件,读取视频。
video(捕获对象) = cv2.VideoCapture(“视频名”)
cv2.cvtColor(a,b)函数
颜色空间转换函数,
a是需要转换的图片,b是转换成何种格式

简单处理

图像截取

cat=img[a:b,c:d]#img类型为numpy.ndarray代表n维数组numpy是python的一个扩展程序库a:b,c:d长宽截取范围
cv2.imshow('cat'cat)

颜色通道提取

b,g,r=cv2.split(img)
cv2.imshow('b',b)#无论是b,g,r的哪一个都是灰度图只是把通道(b,g,r)换成(b,b,b))
img=cv2.merge((b,g,r))

split()函数
分离出B,G,R颜色通道
merge()函数
合并颜色通道
zeros = np.zeros(img.shape[:2],dtype=“uint8”);
s=cv2.merge((zeros,g,r))
3个通道索引0,1,2指向B,G,R
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,1]=0
cv2.imshow(‘R’,cur_img)

边界填充

对图片进行扩展包括上下左右
(top_size,bottom_size,left_size,right_size)
扩展时填充的内容根据类型填充
replicate()复制最边缘像素aaa|abcd|ddd。
reflect()对感兴趣的图像的像素在两边进行复制fedcba|abcdefg|gfedc。
reflect101()反射,以最边缘像素为轴对称fedcb|abcdefg|fedc。
wrap()外包装以图像的左边界与右边界相连,上下边界相连。
constant()常量法,常数值填充。

数值计算 图像融合

图像为矩阵类型,计算即期加减数值,超过255值进行取值处理
cv2.addWeighted(图像1,a,图像2,b,c)两图像相加权重分配,
a,b两图像各自权重,c为对图像相加后亮度的增减。

cv2.resize(图像,(0,0),fx=a,fy=b)#通过倍数来改变图像大小fx,fy代表水平垂直的比例>1放大,<1缩小
cv2.resize(图像,(c,d) )#直接改变图像大小,c,d即行和宽

图像阈值

ret,output=cv2.threshold(input,thresh,maxval,type)
返回参数:ret为输入的thresh,output为处理后输出的图像
传入参数:input,要处理的图像,thresh为设定的阈值
maxval像素超过阈值所要赋予的值,type为超过阈值了所进行的处理方式

type
cv.THRESH_BINARY		# 小于阈值的像素点置0,大于阈值的像素点置maxval; 
cv.THRESH_BINARY_INV	# 小于阈值的像素点置maxval,大于阈值的像素点置0;
cv.THRESH_TRUNC			# 小于阈值的像素点保持原数值,大于阈值的像素点置阈值; 
cv.THRESH_TOZERO		# 小于阈值的像素点置0,大于阈值的像素点保持原数值; 
cv.THRESH_TOZERO_INV	# 小于阈值的像素点保持原数值,大于阈值的像素点置0。 

平滑处理

平滑(模糊)是一项简单且使用频率很高的图像处理方法需要用到一个 滤波器 ,最常用的滤波器是 线性 滤波器。
均值滤波卷积核
k e n r a l = 1 9 [ 1 1 1 1 1 1 1 1 1 ] kenral=\frac{1}{9} \left[ \begin{matrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{matrix} \right] kenral=91111111111
方框滤波卷积核
k e n r a l = a [ 1 1 1 1 1 1 1 1 1 ] kenral=a \left[ \begin{matrix} 1&1&1\\ 1&1&1\\ 1&1&1\\ \end{matrix} \right] kenral=a111111111

cv2.blur(input,(3,3))#input即读入的图像(3,3)即滤波器核与图像做内积。
cv2.boxFilter(input,-1,(3,3),normalize=)#-1即通道数与原图相同,normalize参数为Ture即为均值滤波(a=1/9若为False则a=1
cv2.GaussianBlur(input,(5,5),1)#高斯滤波(高斯分布配置中间附近权重更重视中间)
cv2,medianBlur(input,5)#用中值代替

形态学处理

针对二值图像(比如黑白图)

膨胀操作

处理缺陷问题

kernel = np.ones((3, 3), np.uint8)#卷积核大小,分多大块处理
output = cv2.dilate(input, kernel, 2)#2代表膨胀几次

腐蚀操作

处理毛刺问题

kernel = np.ones((3, 3),np.uint8)
output = cv2.erode(input, kernel, 1)

开闭运算

kernel = np.ones((3, 3),np.uint8)
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)#先腐蚀再膨胀(去除毛刺再膨胀回原来不带毛刺的图像
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, 1)#先膨胀再腐蚀(填补缺陷再腐蚀回原来不缺陷的图像

梯度运算

 cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)#膨胀后的图像-腐蚀后的图像(膨胀大一圈,腐蚀小一圈)

高帽黑帽

 cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)#原始图像-开运算结果即得毛刺
 cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)#原始图像-闭运算结果即得缺陷

图像梯度

Sobel算子

边缘:像素灰度图变化最快的地方(黑到白或白到黑)
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] ( 内 积 时 即 水 平 方 向 右 边 减 左 边 ) Gx= \left[ \begin{matrix} -1&0&1\\ -2&0&2\\ -1&0&1\\ \end{matrix} \right] (内积时即水平方向右边减左边) Gx=121000121
G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] ( 内 积 时 即 竖 直 方 向 下 边 减 上 边 ) Gy= \left[ \begin{matrix} -1&-2&-1\\ 0&0&0\\ 1&2&1\\ \end{matrix} \right] (内积时即竖直方向下边减上边) Gy=101202101(

sobel=cv2.Sobe;(input,cv2.CV_64F,dx,dy,ksize)#cv2.CV_64F保证有负数时取负数,dx,dy表示水平竖直方向变化,ksize表示算子核大小
sobel=cv2.convertScaleAbs(sobel)#对负值取绝对值
cv2.addWeighted(x,a,y,b)#分别sobel水平和竖直再相加a,b为权重

还有Scharr和laplacian两种算子(核大小不一样,边界明显不同)

内容和代码通过观看B站视频而记录。视频链接

*记录自己的学习从戒掉游戏开始

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值