python-OpenCV-图像处理基本操作

20 篇文章 4 订阅


前言

随着人工智能的不断发展,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读取标记(读取类型)
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

·dxx方向上的求导阶数

·dyy方向上的求导阶数

·ksizeSobel核的大小

·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计算得到的边缘图像

·image8位输入图像

·threshold处理过程中的阈值

·apertureSizeSobel算子的孔径大小

·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里提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TensorTinker

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

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

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

打赏作者

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

抵扣说明:

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

余额充值