图形读入
图像读取
创建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=91⎣⎡111111111⎦⎤
方框滤波卷积核
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=a⎣⎡111111111⎦⎤
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=⎣⎡−1−2−1000121⎦⎤(内积时即水平方向右边减左边)
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=⎣⎡−101−202−101⎦⎤(内积时即竖直方向下边减上边)
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站视频而记录。视频链接
*记录自己的学习从戒掉游戏开始