OpenCV
杂项
课程来源
黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程
https://www.bilibili.com/video/BV1Fo4y1d7JL?p=2
【2021B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记)
课程地址:https://www.bilibili.com/video/BV1PV411774y?p=3&spm_id_from=pageDriver
配置Python环境
下载Anaconda: https://www.anaconda.com/products/individual
用conda安装库:conda install name
查看安装包路径:https://blog.csdn.net/jgw2008/article/details/97112009
部分链接
Python疑难库下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/
图像插值算法原理参考:https://blog.51cto.com/u_14411234/3089890
图像旋转原理参考1:https://blog.csdn.net/lkj345/article/details/50555870
图像旋转原理参考2:http://m.elecfans.com/article/593609.html
OpenCV的模块
一、图像背景知识
1.图像
图:物体反射或透射光的分布
像:视觉系统接受的在系统内生成的认识
模拟图像:连续的图像,由物理量(如光强,电)的强弱变化来记录图像信息,容易受干扰
数字图像:离散的图像,分级存储 0/1来记录
位数:常为八位图 8bit 0~255灰度信息 人眼通常能感受16位-32位
2.图像的分类
1.二值图像
0/1 用于文字 线条图扫描识别(OCR)
2.灰度图
常为8位 0~255 由黑到白
3.彩色图
RGB 红 绿 蓝 三色彩通道 0~255
二、图像的基本操作
1.读取
img=cv2.imread(‘名字’,图像类型)
彩色图:cv2.IMREAD_COLOR
灰度图:cv2.IMREAD_GRAYSCALE
带透明度的Alpha通道图: cv2.IMREAD_UNCHANGED
可用1/0/-1指代
2.显示
OpenCV的显示方法
cv2.imshow(‘窗口名’,变量名)
cv2.waitKey(0)
cv2.destroyAllWindows()
waitKey中0为按下任意键继续 其他数为等待ms
matplotlib的显示方法
plt默认以RGB绘制,而OpenCV以BGR格式存储,故绘制时要翻转切换到BGR模式
3.获取
获取像素点数据(BGR值和数据类型)
img[100,100]获取整体尺寸行列数及通道数
(x,y,通道数)
行数和列数
分别代表y和x
因此在输出(x,y)时应是(cols,rows)
获取图像大小
图像大小=像素点个数x通道数
获取图像数据类型
当类型为uint8时显示 dtype(‘uint8’),即无符号整数8位
4.修改
修改像素点BGR数据
img[100,100]=(0,0,255) #修改像素点BGR数据 #将颜色改为BGR中的纯红色分解图像通道
分解为3个通道b,g,r
blue通道的灰度显示(其余通道类比)
plt.imshow(b,cmap=plt.cm.gray) #blue通道的灰度显示合并图像通道
img=cv.merge((b,g,r)) #通道合并色彩空间转换
cv.cvtColor(img,flag)
flag为转换的类型AtoB
5.保存
cv2.imwrite(‘名字’,变量名)
写出图像
6.在图像中绘制
生成基本图片数组
img=np.zeros((512,512,3),np.uint8) #512x512x三通道,数据类型为无符号八位整数绘制线
cv.line(图像,起始点坐标,终点坐标,BGR颜色,线宽)
绘制圆
cv.circle(图像,圆心,半径,BGR颜色,线宽)
线宽-1时为实心圆
绘制矩形
cv.rectangle(图像,起始点坐标,终点坐标,BGR颜色,线宽)
绘制文字
cv.putText(图像,字符串内容,字符框左下角点坐标,字体,字体大小,颜色,线宽,可忽略的LINE_AA)
7.算术运算
图像的加法
OpenCV的加法是饱和算法,>=255即为255 一般来说效果更好
numpy的加法是取模运算 267%256=11 一般效果更差
img2=rain+car
图像的加权混合
img=cv.addWeighted(img1,weight1,img2,weight2,gama)
最后的伽马γ为加权运算后加的一个常数,可以为0
三、图像的处理
1.缩放与拉伸
cv.resize(img,可为None的绝对尺寸,可绝对/相对只写其一省略的相对尺寸fx=?,相对尺寸fy=?,可省略的interpolation=插值算法)
绝对尺寸法
相对于画布来说给予指定的像素值
相对尺寸法
res2=cv.resize(car,None,fx=0.5,fy=0.3)#相对尺寸 相对于原图的行或列的比例放大/缩小图像插值算法原理参考:https://blog.51cto.com/u_14411234/3089890
2.移动
M=np.float32([[1,0,100],[0,1,50]])
result=cv.warpAffine(img,M,dsize)
生成numpy的float32型矩阵,作为warpAffine的参数M,此处用中括号框起代表整体
1,0,100代表行方向平移100单位像素 0,1,50代表列方向上平移50单位像素
3.旋转
#M=cv.getRotationMatrix2D(center,angle,scale) 生成旋转矩阵 #center为旋转锚点,angle为角度,scale为旋转后的相对比例 M2=cv.getRotationMatrix2D((0,rows),45,2) rotat=cv.warpAffine(car,M2,(cols,rows))图像旋转原理参考1:https://blog.csdn.net/lkj345/article/details/50555870
图像旋转原理参考2:http://m.elecfans.com/article/593609.html