2020-10-17

python+opencv入门和实战

常用三个库cv2,numpy,plt

1.灰度图只有一个通道表示亮度或灰度,对应一个矩阵;

彩色图有三个通道R,G,B对应三个矩阵,或三维矩阵。数字从0到255

2.图像读取

img=cv2.imread(""),img对应的是矩阵(读取的是bgr)

3.图像展示

cv2.imshow("",img)

cv2.waitKey(0) ## 等待时间,0时代表按键盘消失

4.展示图片信息

img.shape

用shape属性得到的是图片的宽高和通道数

img.dtype,像素数字类型

img.size总像素数

5.把彩色图像转化为灰度图

一般研究时先把彩色图像转化为灰度图

cv2.imread()

默认读取彩色图像,如果要读取灰色图像就用属性限定一下

cv2.imread("",cv2.IMREAD_GRAYSCALE)

6.把处理后的图像进行保存

cv2.imwrite("",)

7.读取视频

视频也是由图像组成,把视频分成多少帧

cv=cv2.VideoCapture(""),提取视频文件,也可以寻找到计算机里面的摄像头

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture(“../test.avi”)

7.1判断视频能否打开

vc.isOpened()

if  vc.isOpened():

    open,frame=vc.read() ##一帧一帧的读取,返回两个值,第一个是true或false,第二个是数组矩阵

else :

    open =False

7.2读取视频

while open:

    ret,frame=vc.read()

    if frame is None:

        break

    if ret ==true:

        gray=cv2.cvtColor(frame ,cv2.COLOR_BGR2GRAY)##cv2内置的彩色图转换为灰度图

        cv2.imshow("reault",gray)

        if cv2.waitKey(10) & OxFF==27:##( OxFF==27,退出键)每一帧的播放间隔是需要研究的,与设定值和计算机执行速度有关

            break

vc.release()## 把视频对象释放掉

cv2.destroyAllWindows()

8.截取部分图像数据

cat=img[0:200,0:200] ##指定切片

9.颜色通道提取

b,g,r=cv2.split(img)##把三维矩阵变为三个二维矩阵

b.shape

或img[ :,:,0] ,b

img[:,:,1],g

img[:.:.2],r

10.彩色通道合并

cv2.merge((b,g,r))

11.图片复制

img.copy()

解决python中变量的赋值是赋索引的情况

12.边界填充(使图像达到特定的尺寸)

##更改图像尺寸

cv2.resize(img,(50,40))

##比例扩大图像尺寸

cv2.resize(img,(0,0),fx=3,fy=3)##扩大三倍

把图形扩大一圈

top_size,bottom_size,left_size,right_size=(50,50,50,50)

cv2.copyMakeBorder(img, top_size,bottom_size,left_size,right_size,参数)

##参数对应的是填充方法

cv2.BIORDER_REFLECT...

13.数值计算

img+10

图像的加法

numpy中

img1+img2(注意图像尺寸)

注意0到255范围

cv2中用cv2.add()

14.图像融合

##把两个图像按比例进行融合

cv2.addWeighted(img,0.1,img2,0.2 ,0)

##也可以动态的用循环进行融合,得到图形的渐变,算法的研究

15.图像阈值

大于阈值怎么处理,小于阈值怎么处理

ret,thresh=cv2.threshould(src, thresh,maxval,type)##返回值是两个

src:输入图,只能是单通道的

dst:输出图

thresh:阈值

maxval:当像素值超过了阈值(或者小于 阈值,根据type来决定),所赋的值,一般为255

type是参数,5种,二值化(大于时取一个值,小于时取另一个值)

cv2.THRESH_BINARY(超过阈值取maxval,小于取0)

cv2.THRESH_BINARY_INV ##亮的变暗,暗的变亮

cv2.THRESH_TOZERO(大于阈值部分不变,其余为零)##暗的最暗

cv2.THRESH_TOZERO_INV,亮的最亮

cv2.THRESH_TRUNC##设定最亮的,其余不变

##函数的使用

16.图像的平滑处理

对像素点进行处理

有白点

即滤波

有噪声时会使得像素变化较大,故平滑处理即滤波

用的是滤波器,即模板,即卷积矩阵

把矩阵和图像进行分块运算

16.1均值滤波

一般是奇数行列矩阵

3x3卷积矩阵,元素值为一,进行卷积运算,即对应元素相乘最后取平均

blur=cv2.blur(img,(3,3))##均值滤波函数

16.2方波滤波

类似于设置一个阈值

16.3高斯滤波

离得越近重要度越大,即矩阵里面的数表示的是权重

16.4中值滤波

把数排列起来选择中间的数,即用区域表示点的思想

(美颜,滤镜)

16.5图像的拼接

用numpy对矩阵进行操作

numpy.hstack(img1,img2,img3)

##本质都是对矩阵的行列处理,但可以使用集成化的函数

17.图像形态学处理

17.1腐蚀操作(ps仿制印章)

kernel=np.ones((3,3),np.unit8)##生成三乘三的元素为一的矩阵,矩阵越大腐蚀力度越大

cv2.erode(img,kernel,iterations=1)##iterations代表的是迭代次数

去毛刺

如何提取图片中的某个元素(抠图)

17.2膨胀操作

cv2.dilate(img,kernel,iterations=1)

可以先腐蚀把线变细,再膨胀把线变粗

对二值图像的操作

17.3开运算与闭运算

开运算:先进行腐蚀再进行膨胀

cv2..morphologyEx(img,cv2.MORPH_OPEN,kernel)

闭运算:先膨胀后腐蚀

cv2..morphologyEx(img,cv2.MORPH_CLOSE,kernel)

17.4梯度运算

膨胀减去腐蚀,得到轮廓

cv2..morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

17.5礼帽与黑帽

礼帽=原图-开运算

cv2..morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

黑帽=闭运算-原图像

cv2..morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

18.图像梯度处理

边缘位置会有明显的梯度

边缘检测

水平梯度(像素差值)

上下梯度

总梯度

算子即模板矩阵,与图像进行卷积运算

算子sobel

dst=cv2.Sobel(src,ddepth,dx,dy,ksize)

ddepth:图像的深度cv2.CV_64F

dx,dy水平和竖直方向,0不计算,1计算

ksize:算子的大小,3为3乘3矩阵

白减去黑为正值,黑减去白为负数会被显示函数截断为零,故要取一下绝对值

cv2.convertScaleAbs(dst)

算出水平的,竖直的后用图片的权重叠加算总的,不建议直接计算总的

彩色图像一般需要先转化为灰度图,进行梯度运算后会得到轮廓


scharr算子(会得到更丰富信息)

laplacian算子(对噪音点敏感)

19.边缘检测算法

canny边缘检测

使用高斯滤波器,去噪声

计算图像中每一个像素点的梯度和方向

应用非极大值抑制,(保留大的梯度)

使用双阈值(找真实的边缘)

20.直方图与傅里叶变换

单通道才有直方图,指的是各个像素出现的次数

cv2.calcHist(images,channels,mask,histSIze,ranges)##用来画直方图

mask:确定统计区域

histSIze:区间的个数

ranges:像素数

hist=cv2.calcHist([img],[0],None,[256],[0,256])

你可能感兴趣的:(2020-10-17)