前言


随着人工智能的不断发展,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


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



版权声明:本文为weixin_52182640原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_52182640/article/details/116449265