Python-OpenCV(一)

Python-OpenCV

记录自己最近一段时间学习OpenCV(python)的一些知识点,以及OpenCV中常用的一些函数的介绍。主要包括以下几个方面:文件的读取,颜色空间,图像逻辑运算,图像几何变换,滤波,形态学运算,边缘检测,模板匹配以及视频等相关函数。

1.图像的读取,保存

1.1、读取函数
cv2.imread(filename,[,flags])
filename:要读取的图像的完整文件名
flags:常用的有-1和0,-1表示原格式不变,0表示将图像调整为单通道图像。

1.2、窗口创建
cv2.namedWindow(winname)
winname:表示要创建的窗口的名称

1.3、图像的显示
cv2.imshow(winname,mat)
winname:是要显示的窗口的名称
mat:是要显示的图像

1.4、保存图像
cv2.imwrite(filename,img[,params])
filename:要保存的图像的完整路径,包含文件的扩展名
img:要保存的图像
params:是保存类型参数,一般情况不用。
cv2.waitKey([delay])
该函数是用来等待按键。
delay表示等待键盘触发的时间,单位是ms,当该值是负数或者零时,表示无限等待。如果没有按键,该函数的返回值为-1,如果有按键,则返回按键的ASCII码。

1.5、资源释放
cv.destroyWindow(winname)
该函数是用来释放(销毁)指定窗口,winname为窗口的名称

cv2.destroyAllWindows()
该函数是用来释放(销毁)所有窗口。
这两个函数通常是和cv2.waitKey()函数配合使用。

2.颜色空间

OpenCV中常用的颜色空间有BGR颜色空间,HSV/HLS颜色空间,Lab颜色空间。特别注意的是普通图像的颜色空间是RGB,所以在使用OpenCV进行图像处理时需要做一个空间的转换。

3.图像逻辑运算

3.1、+:两张图像相加,对应的像素点进行相加,如果两个图像对应的像素值相加之和小于或者等于255,则直接相加得到运算结果。如果大于255,则将运算对256取模。

3.2、cv2.add(A,B)
如果相加之和小于255,则直接取相加值。如果相加之和大于255,则该像素点直接取255。
当A和B均为图像时,两张图像的大小必须一致。

3.3、加权和
cv2.addWeighted(src1,alpha,src2,beta,gamma)
该函数实现的功能是:dst=src1alpha+src2beta+gamma,式子中的gamma可以是0,但是是必选参数,即不可忽略,可以将gamma值理解为亮度调节量。

3.4、位运算
按位与运算
dst=cv2.bitwise_and(src1,src2,[,mask])
与运算是,参与运算的两个逻辑值均为真时,结果才为真,对于两张图像来说,即对应的像素转换成二进制数值后进行与运算。
dst:表示与输入值具有同样大小的array输出值。
src1:表示第一个array或scalar类型的输入值
src2:表示第二个array或scalar类型的输入值
mask:表示可选操作掩码。

按位或运算
dst=cv2.bitwise_or(src1,src2,[,mask]
或运算:当参与运算的两个值中有一个为真的时候,结果为真。
函数中参数解释同上。

按位非运算
dst=cv2.bitwise_not(src,[,mask])
非运算:当运算数为真,结果为假,当运算数为假,结果为真。
dst:输出
src:输入

按位异或运算
dst=cv2.bitwise_xor(src1,src2,[,mask])
异或运算:表示参与运算的两个值中,如果均为假或均为真时,结果为假,其余均为真。

掩码
OpenCV中有很多函数都会制定一个掩码,当使用掩码参数时,操作只会在掩码值为非空的像素点上执行。并将其他像素点的值置为0.

4.图像几何变换

4.1、缩放
dst=cv2.resize(src,dsize[,fx[,fy[,interpolation]]])
src:输入图像
dsize:代表输出图像大小
fx:代表水平方向的缩放比例
fy:代表垂直方向的缩放比例
interpolation:插值方式。
4.2、翻转
dst=cv2.flip(src,flipCode)
src:输入图像
filCode:旋转类型

4.3、仿射
dst=cv2.warpAffine(src,M,dsize,[,flags[,bordermode[,bordervalue]]])
忽略其可选参数后的语法格式为:
dst=cv2.warpAffine(src,M,dsize)
src:要放射的图像
M:代表一个2x3的变换矩阵,使用不同的变换矩阵,可以实现不同的放射变换。
dsize:表示输出图像的尺寸大小。

在使用cv2.warpAffine()函数进行放射变换时,需要先计算变换矩阵,对于平移操作可直接计算得到平移变换矩阵,对于旋转,OpenCV中提供了cv2.getRotationMatrix2D(center,angle,scale)函数先求出旋转矩阵,该函数中的center为旋转中心,angle为旋转角度,scale为变换尺度(缩放大小)。

4.4、透视
仿射变换可以将矩形映射为平行四边形,透视变换则可以将矩形映射为任意四边形。
dst=cv2.warpPerspective(src,M,disze,[,flags[,borderMode[,borderValue]]])
src:输入图像
M:代表3x3的变换矩阵
dsize:代表输出图像的大小
flags:代表插值方法,默认为INTER_LINEAR。
borderMode:代表边类型,默认为BORDER_CONSTANT。
borderValue:代表边界值,默认是0

4.5、重映射
把一幅图像内的像素点放置到另外一幅图像内的指定位置,叫做重映射。
dst=cv2.remap(src,map1,map2,interpolation[,borderMode[,borderValue]])
src:代表原始图像
map1:参数有两种可能的值:
1)表示(x,y)点的一个映射
2)表示CV_16SC2,CV_32FC1,CV_32FC2类型(x,y)点的X值。
map2参数同样有两种可能的值
1)当map1表示(x,y)时,该值为空。
2)当map1表示(x,y)的x值时,该值是CV_16UC1,CV_32FC1类型(x,y)点的y值。
interpolation代表插值方式,
borderMode代表边界模式。
borderValue:代表边界值。

5.阈值处理

5.1、全局阈值处理
retval,dst=cv2.threshhold(src,thresh,maxval,type)
retval:代表返回的阈值,
dst:代表阈值分割结果图像
src:代表进行阈值分割的图像
thresh:代表要设定的阈值
maxval:设定的最大值
type:代表阈值分割的类型。

5.2、自适应阈值
dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
src:需要处理的图像,必须是8位单通道的图像
maxValue:代表最大值。
adaptiveMethod:代表自适应方法
thresholdType:代表阈值处理方式,必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV中的一个。
blockSize代表块的的大小。
C是常量。

6.图像平滑

6.1、2D卷积
dst=cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
src:需要处理的图像,即原始图像
kernel:卷积核,是单通道的数组
anchor:锚点。其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置
delta:修正值。可选项
borderType:边界样式,该值决定了以何种情况处理边界,通常使用默认值即可。

6.2、平均滤波
dst=cv2.blur(src,kernel,anchor,borderType)
src:是需要处理的图像,即原始图像。
kernel:是滤波核的大小
anchor:是锚点,其默认值是(-1,-1)表示当前计算均值的点位于核的中心点位置。
borderType:是边界样式,该值决定以何种方式处理边界。

6.3、高斯滤波
dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
src:需要处理的图像
ksize:是滤波核的大小。
sigmaX:是卷积核在水平方向上的标准差,其控制的是权重比例。
sigmaY:是卷积核在垂直方向上(Y)的标准差。
borderType:是边界样式,该值决定了以何种方式处理边界。

6.4、中值滤波
dst=cv2.medianBlur(src,ksize)
src:需要处理的图像,即源图像
ksize:滤波核的大小

6.5、双边滤波
dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
src:是需要处理的图像,即原始图像。
d:在滤波时选取的空间距离参数
sigmaColor:滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来
sigmaSpace:是坐标空间中的sigma值。
borderType:边界样式

7.形态学运算

7.1、腐蚀:把前景物体的边界腐蚀掉,卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素都为1,则保持原来的像素值,否则为1.
dst=cv2.erode(src,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
src:需要进行腐蚀的原始图像,图像的通道数可以是任意的。
kernel:代表腐蚀操作时所采用的结构类型。它可以自定义生成。也可以通过函数cv2.getStructuringElement()生成。
anchor:代表element结构中锚点的位置
iterations:腐蚀操作迭代的次数
borderType:边界样式,一般采用其默认值BORDER_CONSTANT。

7.2、膨胀
dst=cv2.dilate(src,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
src:代表需要进行膨胀操作的原始图像,图像的通道数可以是任意的,但是要求图像的深度必须是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F中的一种。
element:膨胀所采用的结构类型。
其他的参数和腐蚀中的参数是一致的。
7.3、开运算:先腐蚀后膨胀,有消除噪声的效果
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

7.4、闭运算:先膨胀后腐蚀,常用来填充前景物体的小洞或前景物体上的小黑点。
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

7.5、图像梯度:图像膨胀与腐蚀的差别,可以得到前景的轮廓
gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)

7.6、礼帽:原始图像与进行开运算之后得到的图像的差
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)

7.7、黑帽:原始图像与进行闭运算之后得到的图像的差
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

8.图像梯度

8.1、sobel算子
dst=cv2.Sobel(src,ddepth,dx,dy[,ksize[scale[,delta[,borderType]]]])
src为原始图像
ddepth代表输出图像的深度
dx代表x方向上的求导阶数
dy代表y方向上的求导阶数
ksize代表sobel核的大小
scale代表计算导数值时所采用的缩放因子,默认是1
delte代表加在目标图像dst的值,
borederType代表边界样式。
8.2、scharr算子
在离散的空间上使用sobel算子计算结果并不精确,采用cv2.Schar()函数和sobel算子具有同样的速度,但是具有更高的精度。
dst=cv2.Scharr(src,ddepth,dx,dy[,ksize[scale[,delta[,borderType]]]])
参数解释同上,
8.3、laplacian算子
dst=cv2.Laplacian(src,ddepth,dx,dy[,ksize[scale[,delta[,borderType]]]])
该算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化的要求。

9.边缘检测

边缘检测的主要步骤:
(1)噪声去除
(2)计算图像梯度:对平滑后的图像使用sobel算子计算水平方向和竖直方向的一阶导数。
(3)非极大值抑制:在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界的点。
(4)滞后阈值:设置minVal,maxVal,图像中的灰度梯度>maxVal,则为真的边界,<minVal的边界被抛弃,介于两者之间的就看这个点是否与某个被确定为真正的边界点相连,如果是就认为是边界点,如果不是就抛弃。
dst=cv2.Canny(img,minVal,maxVal,kernel,Lzgradiant)
kernel默认为3,Lzgradiant默认为False.

10.图形金字塔

10.1 dst=cv2.pyrDown(src[,dstsize[,borderType]])
从一个高分辨率大尺寸的图像向上构建一个金字塔(尺寸变小,分辨率降低)
src:原始图像
dstsize为目标图像的大小
borderType为边界类型,默认值为BORDER_DEFAULT

10.2 dst=cv2.pyrUp(src[,dstsize[,borderType]])
从一个低分辨率小尺寸的图像向下构建一个金字塔(尺寸变大,但分辨率不会增加)
src:原始图像
dstsize为目标图像的大小
borderType为边界类型,默认值为BORDER_DEFAULT
拉普拉斯金字塔
Li=Gi-pyrUp(Gi+1)
图像金字塔主要应用于图像融合

11.图像轮廓

11.1、图像轮廓:认为将连续的点(连着边界)连在一起的曲线,具有相同的颜色或灰度。
image,contour,hierarchy=cv2.findContours(img,轮廓检索模式,轮廓近似方法)
该函数有三个返回值,处理后的图像,轮廓以及层次结构
注意:在使用图像轮廓函数时。
(1)为了更加准确,使用二值化图像
(2)查找轮廓的函数会修改原始图像
(3)查找轮廓就是想 在黑色背景中白色物体。
11.2、画轮廓
cv2.drawContours(img,contours,轮廓索引,颜色,厚度)

11.3、矩形
dst=cv2.moments(array[,binaryImage])
array:可以是点集,也可以是灰度图像或者二值图像。
binaryImage:该参数为true时,array内所有的非零值都被处理为1.
11.4轮廓面积
dst=cv2.contourArea(contour[,oriented])
contour是轮廓
oriented是布尔型值,当它为true时,返回的值包含正/负号,用来表示轮廓是顺时针还是逆时针,该参数额默认值是false,表示返回的retal是一个绝对值.
11.5轮廓周长
dst=cv2.arcLength(curve,closed)
curve是轮廓。
closed是布尔型值,用来表示轮廓是否是封闭的。该值为true时,表示轮廓是封闭的。

11.6、边界矩形
直边界矩形:retval=cv2.boundingRect(array)
retval返回值表示返回的矩形边界的左上角顶点的坐标值及矩形边界的宽度和高度。
参数array是灰度图像或轮廓。
旋转边界矩形:retval=cv2.minAreaRect(points)
返回值retval表示返回的矩形特征信息,该值的结构是(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)
参数points是轮廓
获取矩形4个点的坐标:points=cv2.boxPoints(box)
返回值points是能够用于函数cv2.drawContours()参数的轮廓点
参数box是函数cv2.minAreaRect()返回值的类型的值。
最小外接圆:center,radius=cv2.minEnclosingCircle(points)
center是最小包围圆形的中心。
返回值radius是最小包围圆形的半径
参数points是轮廓
椭圆拟合:retval=cv2.fitEllipse(points)
retval返回值,返回的是拟合椭圆的外接矩形。包含外接矩形的质心、宽、高、旋转角度等参数信息,这些信息正好与椭圆的中心点、轴长度、旋转角度等信息吻合。

12.直方图处理

hist=cv2.calcHist(img,channels,mask,histSize,range[,hist[,accumulate]])
img:原图像,用[]括起来
channels:通道数,同样需要用括号括起来,如果输入图像是灰度图,则为[0],如果为彩色图像则为[0],[1],[2]对应通道的BGR
mask:掩模图像
histSize:Bin的数目
ranges:像素值范围

Numpy中的histogram()函数和cv2.calcHist()函数功能一样

hist,bin=np.histogram(img.ravel(),256,[0,256])

绘制直方图
将图像的灰度信息整理后需要将其可视化,这样方便我们查看图像的灰度分布。
matplotlib.pyplot.hist()该函数能直接统计并绘制直方图
若采用上述两个函数先统计再绘制的话,如下
hist=cv2.calcHist()/hist,bin=np.histogram()
plt.plot(hist)
plt.show()

13.傅里叶变换

opencv中提供了cv2.dft()和cv2.idft()函数来实现傅里叶变换和逆傅里叶变换。
13.1、傅里叶变换
cv2.dft(原始图像,转换标识)
原始图像:要先使用np.float32()函数将图像转换成np.float32格式
转换标识:通常为cv2.DFT_COMPLEX_OUTPUT,用来输出一个复数阵列。
opencv中傅里叶变换的步骤:
(1)使用cv.dft()函数变换后得到原始图像的频谱图像,但是由于零频率分量并不在中心位置,所以需要将零频率分量移至中心位置,方便后续处理。
(2)numpy.fft.fftshift()实现将零频率分量移至中心位置。经过该函数处理后,得到一个由实部和虚部构成的值。
(3)为了将第二步中得到的值显示出来,需要通过cv2.magnitude()函数来计算频谱信息的幅度,
该函数的语法格式:dst=cv2.magnitude(参数1,参数2)参数1:实部,参数2:虚部。
(4)通过第三步得到频谱信息的幅度后,需要将幅度值映射到灰度图像的灰度空间[0,255]内,使其以灰度图像形式显示出来。result=20*np.log(cv2.magnitude(参数1,参数2))

13.2、傅里叶逆变换
dst=cv2.idft(原始数据)
对图像进行傅里叶变换后,通常将零频率分量移至频谱图像的中心位置。如果使用函数numpy.fft.fftshift()移动了零频率分量,那么在进行傅里叶变换前,要使用函数将零频率分量恢复到原来的位置。

14.模板匹配

模板匹配是指在当前图像A内寻找与图像B最相似的部分,一般将图像A成为输入图像,将图像B称为模板图像。
模板匹配函数
result=cv2.matchTemplate(image,temp1,method[,mask])
image为原始图像,必须是8位或者32位的浮点型图像。
temp1为模板图像。它的尺寸必须小鱼或者等于原始图像,并且与原始图像具有相同的类型。
method为匹配方法。
mask:为模板图像掩模。必须和模板图像temp1具有相同的类型和大小。

15.霍夫变换

霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。
15.1、霍夫直线变换
lines=cv2.HoughLines(image,rho,theta,threshold)
image:输入图像,必须为8位的单通道二值图像
rho:以像素为单位的距离r的精度。一般情况下的精度是1.
theta:为角度theta的精度,一般情况下,使用的精度为π/180.
threshold:阈值。该值越小判定出的直线就越多。
返回值lines中的每个元素都是一对浮点数。

15.2、概率霍夫变化
lines=cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
前三个参数和霍夫直线变换函数的前三个是一样的。
minLineLength:用来控制“接受直线的最小长度”的值,默认值为0。
maxLineGap:用来控制接受共线线段之间的最小间隔,即在一条直线中两点的最大间隔。
返回值:每个元素均是浮点数,表示检测到的直线的参数(r,theta).

15.3、霍夫圆变换
circles=cv2.HoughCircles(images,method,dp,minDist,param1,param2,minRadius,maxRadius)

images:输入图像,类型为8位的单通道灰度图像。
method:检测方法,HOUGH_GRADIENT是唯一可用的参数值。
dp:累计器分辨率,是一个分割比率,用来指定图像分辨率与圆心累加器分辨率的比例。
minDist:圆心间最小间距。
param1:该参数是缺省的,在缺省时默认值为100.对应的是Canny边缘检测器的高阈值。
param2:圆心位置必须收到的投票数。
minRadius:圆半径的最小值,小于该值的园不会被检测出来。
maxRadius:圆半径的最大值,大于该值的园不会被检测出来。
circles:返回值,由圆心坐标和半径构成的numpy.ndarray.

16.图像分割与提取

16.1、分水岭算法:任何一幅灰度图像都可以被看作是地理学上的地形表面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。
使用分水岭算法分割图像的步骤:
1)通过形态学开运算对原始图像O去噪。
2)通过腐蚀操作获取“确定背景B”。
3)利用距离变换函数cv2.distanceTransform()对原始图像进行计算,并对其进行阈值处理。得到“确定前景F”。
4)计算未知区域UN(UN=O-B-F)
5)利用函数cv2.connectedComponents()对原始图像O进行标注。
6)对函数cv2.connectedComponents()的标注结果进行修正。
7)使用分水岭函数完成对图像的分割。
16.2、分水岭函数
markers=cv2.watershed(image,markers)
image:输入图像,必须是8位三通道图像。
markers:是32位到通道的标注结果,它应该和image具有相等大小。

16.3、标注函数
retval,labels=cv2.connectedComponents(image)
image:为8位的单通道的待标注图像。
retval:为返回的标注的数量
labels为标注的结果图像。

16.4、距离变换函数
dst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])
src:8位单通道的二值图像。
distanceType:为距离类型参数。
maskSize为掩模的尺寸。
dstType为目标图像的类型,默认值为CV——32F。
dst为计算得到的目标图像,可以是8位或32位浮点数,尺寸和src相同。

17.视频处理

17.1、VideoCapture类

cv2.VideoCapture类常用函数包括初始化、打开、帧捕获、释放、属性设置等。
1)初始化
捕获对象=cv2.VideoCapture('摄像头ID’or ‘视频文件名’)
2)打开
初始化后判断摄像头是否打开,retval=cv2.VideoCapture.isOpened()判断摄像头是否打开,若没有打开即初始化失败,则使用retval=VideoCapture.open(index/filename)函数打开摄像头或打开视频。
3)捕获帧
retval,image=cv2.VideoCapture.read()
imagel是返回的捕获到的帧,如果没有帧被捕获,则该值为空。
retval表示捕获是否成功,如果成功则该值为true,否则为false。
4)释放
None=cv2.VideoCapture.release()
5)属性设置
retval=cv2.VideoCapture.get(propId)

17.2、VideoWriter类
cv2.VideoWriter类常用的成员函数包括:构造函数、write函数等
构造函数
=cv2.VideoWriter(filename,fource,fps,frameSize[,isColor])
filename:输出目标视频的存放路径和文件名。
fource:表示视频编/解码类型(格式)
fps:为帧速率
frameSize:为每一帧的长和宽。
isColor:表示是否为彩色图像。
17.3write函数
cv2.VideoWrite()用于写入下一帧视频。
None=cv2.VideoWrite(Image)
释放
在不需要cv2.VideoWriter类对象时,需要将其释放。释放该类对象时所使用的是函数cv2.VideoWriter.release()
None=cv2.VideoWriter.release()

后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪的骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值