随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV图像处理基本操作的基础内容。
Python 3解释器下载地址:https://www.python.org.downloads/
Pypi提供的OpenCV安装包下载地址:https://pypi.org/project/opencv-python/
import cv2
注:下述的代码运行之前,首先需要导入 cv2 模块,为了方便理解,我们在这里函数的前缀都使用 “cv2.” 表示
retavl = cv2.imread( filename[, flags] )
·retavl返回值,其值是读取到的图像
·filename读取到的图像完整名
·flags读取标记(读取类型)
None = cv2.nameWindow( winname ) #创建指定名称窗口
None = cv2.imshow( winname, mat ) #显示图像
retavl = cv2.WaitKey( [ delay] )#等待按键
None = cv2.destroyWindow( winname ) #销毁指定窗口
None = cv2.destroyAllWindow( ) #销毁所有窗口
retavl = cv2.imwrite( [ filename, img[, params]] )
for i in range():
img.item()
img.itemset()
roi = img[ : , : ]
b = img[ : , : , 0]
g = img[ : , : , 1]
r = img[ : , : , 2]
·split拆分图像的通道为B,G,R(三原色:蓝绿红)
b,g,r = cv2.split(img)
拆分逆过程
将三个通道的灰度图像构成一幅彩图
bgr = cv2.merge([b,g,r])
rgb = cv2.merge([r,g,b])
·shape 彩图返回:行/列/通道数;二值图/灰度图返回:行/列数
行/列/通道数 = img.shape
·size 返回像素数目:行/列/通道数
行/列/通道数 = img.size
·dtype 返回图像的数据类型
图像的数据类型 = img.dtype
计算结果 = cv2.add(像素值a,像素值b[,掩模])
·用"+"时将和大于255的值取模处理,取模后大于255的值变小,像素点变暗,图像不自然。
·用cv2.add()时将和大于255的值处理为饱和值255,像素值增大,图像整体变量。
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
上式理解:结果图像=图像1x系数1+图像2x系数2+亮度调节(gamma可以是零,不能省略)
·dst表示与输出值具有相同大小的array输出值
·src表示array或scalar类型的输出值
·mask表示可选操作掩码,8位单通道array值
dst = cv2.bitwise_and( src1, src2[, mask]])#与运算
dst = cv2.bitwise_or( src1, src2[, mask]])#与运算
dst = cv2.bitwise_xor( src1, src2[, mask]])#与运算
dst = cv2.bitwise_not( src1, src2[, mask]])#与运算
参与运算的两个算子(参数)既可以是两幅图像,也可以是一幅图像与一个数值
img = np.ones((4,4),dtype=np.uint8)*3#生成4x4的数值为3的矩阵
mask = np.zeros((weight,hight),dtype=np.uint8)#生成weight x hight的数值为0的矩阵
mask[:,:]=255
对原始图像与密钥图像进行按位异或
对加密后的图像与密钥图像再次进行按位异或
dst = cv2.vctColor( src, code [, dstCn] )
·dst输出图像
·src原始输入图像
·code色彩空间转换码
·dstCn目标图像的通道数
·色调H 取值范围[0,360]
·饱和度S 取值范围[0,1]
·亮度V 取值范围[0,255]
dst = cv2.resize( src, dsize[, fx[, fy[, interpolation]]] )
·dst输出的目标头像
·src需要缩放的原始图像
·dsize输出图像大小
·fx水平方向的缩放比例
·fy垂直方向的缩放比例
·interpolation插值方式
常用插值方式:
1. 缩小图形时:区域插值方式(INTER_AREA);
2. 放大图像时:三次样条插值(INTER_CUBIC)和 双线性插值(INTER_LINEAR)
dst = cv2.flip( src, flipCode )
·dst目标图像
·src原始图像
·flipCode旋转类型
flipCode参数:0,正数,负数
0绕着x轴翻转
正数绕着x轴翻转
负数绕着x轴,y轴同时翻转
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
·dst目标图像
·src原始图像
·M变换矩阵
·dsize输出图像的尺寸大小
·flags插值方式
·borderMode边类型
·borderValue边界值,默认是0
height,width = image.shape[:2]
x = 100
y = 200
M = np.float32(image,M,(width,height))
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
M = cv2.getRotationMatrix2D(center, angle, scale)
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
M = cv2.getAffineTransform(src, dst)
dst = cv2.warpAffine( src, M, dsize[, flags[, borderMode[, borderValue]]] )
dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] )
·dst目标图像
·src原始图像
·M变换矩阵
·dsize输出图像的尺寸大小
·flags插值方式
·borderMode边类型
·borderValue边界值,默认是0
dst = cv2.remap( src, map1, map2, interpolation[, borderMode[, borderValue]] )
·dst目标图像
·src原始图像
·map1 1.(x,y)点的一个映射 2.CV_16SC2,CV_32FC2类型(x,y)点的x值
·map2 1.为空 2.CV_16SC2,CV_32FC2类型(x,y)点的y值
·Interpolation插值方式(不支持INTER_AREA)
·borderMode边界模式
·borderValue边界值,默认是0
retval, dst = cv2.threshold( src, thresh, maxval ,type )
·retval返回的阈值
·dst阈值分割结果图像
·src进行阈值分割的图像
·thresh要设定的阈值
·maxval当type参数为THRESH_BINARY或者THRESH_BINARY—_INV类型时,需要设定的最大值
·type阈值分割的类型
retval, dst = cv2.threshold( src, thresh, maxval ,THRESH_BINARY )
retval, dst = cv2.threshold( src, thresh, maxval ,THRESH_BINARY_INV )
retval, dst = cv2.threshold( src, thresh, maxval ,THRESH_TRUNC )
retval, dst = cv2.threshold( src, thresh, maxval ,THRESH_TOZERO_INV )
retval, dst = cv2.threshold( src, thresh, maxval ,THRESH_TOZERO )
dst = cv.addtiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )
·dst阈值分割结果图像
·src进行阈值分割的图像
·maxValue最大值
·adaptiveMethod自适应方法
·thresholdType阈值处理方式,该值必须是THRESH_BINARY或者THRESH_BINARY—_INV
·blockSize块大小,通常为3,5,7
·C常量
自适应方法:
**1.**cv2.ADAPTIVE_THRESH_MEAN_C
**2.**cv2.ADAPTIVE_THRESH_GAUSSIAN_C
cv2.THRESH_OTSU
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
dst = cv2.blur( src, ksize, anchor, borderType )
常用形式:dst = cv2.blur( src, ksize)
·dst返回值
·src进行处理的图像
·ksize滤波核的大小
·anchor锚点,默认值(-1,-1)
·borderType边界样式
dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )
常用形式:dst = cv2.boxFilter( src, ddepth, ksize)
·dst返回值
·src进行处理的图像
·ddepth处理结果图像的深度,一般-1
·ksize滤波核的大小
·anchor锚点,默认值(-1,-1)
·normalize归一化处理(1)/不需归一化处理(0)
·borderType边界样式
边缘模糊虚化
dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )
常用形式:dst = cv2.GaussianBlur( src, ksize, 0, 0)
·dst返回值
·src进行处理的图像
·ksize滤波核的大小
·sigmaX卷积核在水平方向上的标准差
·sigmaY卷积核在垂直方向上的标准差
·borderType边界样式
dst = cv2.medianBlur( src, ksize )
·dst返回值
·src进行处理的图像
·ksize滤波核的大小
边缘得到保留
dst = cv2.bilateralFilter( src, d, sigmaColor, sigmaSpace, borderType )
·dst返回值
·src进行处理的图像
·d在滤波时选取的空间距离参数
·sigmaColor在滤波时选取的颜色差值范围
·sigmaSpace坐标空间中的sigma值
·borderType边界样式
dst = cv2.filter2D( src, ddepth, kernel, anchor, delta, borderType )
常用形式:dst = cv2.filter2D( src, ddepth, kernel)
·dst返回值
·src进行处理的图像
·ddepth处理结果图像的深度,一般-1
·kernel卷积核
·anchor锚点,默认值(-1,-1)
·delta修正值
·borderType边界样式
将图像的边界点消除,向内收缩;去除噪声、元素分割
dst = cv2.erode( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
·dst返回值
·src进行处理的图像
·kernel卷积核
·anchor锚点,默认值(-1,-1)
·iterations腐蚀操作迭代的次数
·borderType边界样式
·borderValue边界值
对图像的边界进行扩张
dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
dst = cv2.morphologyEx( src, op, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
dst = cv2.getStructuringElement( shape, ksize[, anchor])
·shape形状类型
·ksize结构元素的大小
·anchor锚点,默认值(-1,-1)
dst = cv2.Sobel( src, ddepth, dx, dy[, scale[, delta[, borderType]]]] )
·dst目标图像
·src原始图像
·ddepth处理结果图像的深度,一般-1
·dxx方向上的求导阶数
·dyy方向上的求导阶数
·ksizeSobel核的大小
·scale计算导数值
·delta加在目标图像dst上的值,默认0
·borderType边界样式
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]]] )
dst = cv2.Laplacian( src, ddepth, ksize[, scale[, delta[, borderType]]]] )
edges = cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
·edges计算得到的边缘图像
·image8位输入图像
·threshold处理过程中的阈值
·apertureSizeSobel算子的孔径大小
·L2gradient计算图像梯度幅度的标识
dst = cv2.pyrDown( src[, dstsize[, borderType]] )
·dst目标图像
·src原始图像
·dstsize目标图像大小
·borderType边界类型
dst = cv2.pyrUp( src[, dstsize[, borderType]] )
·dst目标图像
·src原始图像
·dstsize目标图像大小
·borderType边界类型
1. 通过pyrDown函数生成高斯金字塔
2. 通过pyrUp函数生成拉普拉斯金字塔
3. 通过pyrUp函数复原为原始图像
image, contours, hierarchy = cv2.findContours(image, mode, method)
·image原始图像
·contours返回的轮廓
·hierarchy返回的拓扑信息(轮廓层次)
mode: 轮廓检索模式
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓
cv2.RETR_TREE建立一个等级树结构的轮廓
**method:**轮廓的近似方法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
image = cv2.drawContours(image, contours, contourIdx, color[, thivkness[, lineType[, hierarchy[, maxLevel[, offset]]]]] )
以上就是今天要讲的内容,本文仅仅简单介绍了OpenCV图像处理基本操作,而OpenCV里提供了大量能使我们快速便捷地处理数据的函数和方法。