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