这几天在进行印章提取、识别的代码开发,其中用到了几个opencv库的几个函数,脑袋中想到了要用到什么处理,但是却忘记了各个函数库比如二值化、膨胀/腐蚀等函数的参数,因此每个函数都查找了好久才想起来每个函数参数中的意思,因此在这篇blog中想总结一下opencv用过的函数,方便我自己以后查找、使用。
目录
1、读取图像
image = cv2.imread(filename, flags)
filename: 需要读取图像的绝对路径。
flags(一般省略,需要时填上): 需要的格式
(1)cv2.IMREAD_UNCHANGED :原图
(2)cv2.IMREAD_COLOR :彩色图像
(3)cv2.IMREAD_GRAYSCALE :灰度图像
示例:
import cv2
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口
2、图像形状
import cv2
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
height, width, channel = image.shape # 高、宽、通道数
print(height, width, channel)
cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口
3、图像缩放
image_resize = cv2.resize(image, (h, w), method)
image:输入图像
(h,w):缩放之后的图像大小
method:使用怎么样的方法缩放,一般是线性插值(cv2.INTER_LINEAR)和最近邻插值 (cv2.INTER_NEAREST)
import cv2
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image = cv2.resize(image, (256, 256), cv2.INTER_LINEAR)
print(image.shape)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
4、图像保存
cv2.imwrite(filename, image)
filename:保存图像的绝对路径
image:要保存的图像
示例:
import cv2
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
cv2.imwrite("C:/Users/Roger/Desktop/lena_imwrite.jpg", image)
cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口
5、图像格式转换
image_cvt = cv2.cvtColor(image, flags)
image:要转换的图像
flags:需要转换成的格式
(1)cv2.COLOR_BGR2RGB:BGR 格式转 RGB 格式
(2)cv2.COLOR_BGR2GRAY:BGR 格式转 灰度图 格式
(3)cv2.COLOR_BGR2HSV:BGR 格式转 HSV 颜色空间格式
(4)cv2.COLOR_BGR2HLS:BGR 格式转 HLS 颜色模式格式
由于 opencv 读取上来的格式为 BGR 格式,因此只介绍 BGR 转其他格式图像,RGB转其他图像也是类似,如 RGB 格式转 BGR 格式:cv2.COLOR_RGB2BGR。
示例:
import cv2
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
image_cvt = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("image", image) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.imshow("image_cvt", image_cvt) # 显示图像,第一参数为窗口的名字,第二参数为要显示的图像
cv2.waitKey(0) # 参数为等待多少毫秒秒后关闭,当参数为0时无限刷新窗口,按下任意按键则关闭窗口
cv2.destroyAllWindows() # 关闭所有窗口
6、图像二值化
retVal, dst= cv2.threshold(src, thresh, maxval, method)
参数:
src:灰度图像
thresh:起始阈值
maxval:最大阈值
method:方法参数
(1)cv2.THRESH_BINARY:当前像素的值大于最小阈值 thresh 时,则该像素值变为 maxval ,其他情况下像素值为 0。
(2)cv2.THRESH_BINARY_INV:当前像素的值大于最小阈值 thresh 时,则该像素值变为 0,其他情况下像素值为 maxval。
(3)cv2.THRESH_TRUNC:当前像素值大于最小阈值 thresh 时,则该像素值变为 thresh,其他情况下像素值不变。
(4)cv2.THRESH_TOZERO:当前像素值大于最小阈值 thresh 时,则该像素值不变,其他情况下像素值变为 0。
(5)cv2.THRESH_TOZERO_INV:当前像素值大于最小阈值 thresh 时,则该像素变成 0,其他情况下像素值不变。
以下是比较特殊的 3 种方法,可与以上 5 种方法配合使用:
(1)cv2.THRESH_OTSU:使用最小二乘法处理像素点。
(2)cv2.THRESH_TRIANGLE:使用三角算法处理像素点。
(3)cv2.THRESH_MASK:掩膜操作。
配合使用示例:
retVal, dst= cv2.threshold(src, thresh, maxval, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
函数返回值:
retVal:分割的阈值。
dst:分割的图像。
函数使用示例:
import cv2
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, dst = cv2.threshold(image_gray, 200, 255, cv2.THRESH_BINARY)
cv2.imshow("image", image)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
7、图像形态学操作
(1)图像膨胀
image_dilate = cv2.dilate(image, kernel, iterations)
image:要进行膨胀操作的图像
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_dilate = cv2.dilate(image_gray, kernel, iterations=1)
cv2.imshow("image", image)
cv2.imshow("image_dilate", image_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:填充图像中的小孔洞、连接图像中的断开的区域。
(2)图像腐蚀
image_erode = cv2.erode(image, kernel, iterations)
image:要进行腐蚀操作的图像
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_erode = cv2.erode(image_gray, kernel, iterations=1)
cv2.imshow("image", image)
cv2.imshow("image_erode", image_erode)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:去除比较小的噪声、分离紧密连接的区域、 去除边界。
(3)开运算(先腐蚀后膨胀)
image_open = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, iterations)
image:要进行开运算操作的图像
cv2.MORPH_OPEN:开运算方法
kernel:卷积核大小
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_open = cv2.morphologyEx(image_gray, cv2.MORPH_OPEN, kernel, iterations=1)
cv2.imshow("image_open", image_open)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:去掉孤立的小点,去除噪声,断开比较细小连接的点
(4)闭运算(先膨胀再腐蚀)
image_close = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel, iterations)
image:要进行闭运算操作的图像
cv2.MORPH_CLOSE:闭运算方法
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_close = cv2.morphologyEx(image_gray, cv2.MORPH_CLOSE, kernel, iterations=1)
cv2.imshow("image_close", image_close)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:填充区域间的空洞、弥合小缝隙。
(5)梯度运算(膨胀图像 - 腐蚀图像)
image_gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel, iterations)
image:要进行梯度运算的图像
cv2.MORPH_GRADIENT:梯度运算方法
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_gradient = cv2.morphologyEx(image_gray, cv2.MORPH_GRADIENT, kernel, iterations=1)
cv2.imshow("image_gradient", image_gradient)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:凸显出图像的边缘,保留图像边缘的轮廓,用于边缘检测。
(6)礼帽 / 顶帽(开运算图像 - 原图)
image_tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel, iterations)
image:要进行礼帽运算的图像
cv2.MORPH_TOPHAT:礼帽运算方法
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_tophat = cv2.morphologyEx(image_gray, cv2.MORPH_TOPHAT, kernel, iterations=1)
cv2.imshow("image_tophat", image_tophat)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:往往用来提取图像中比临近点亮度高的一些斑块,用于突出亮度变化。
(7)黑帽(闭运算图像 - 原图)
image_blackhat = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel, iterations)
image:要进行黑帽运算的图像
cv2.MORPH_BLACKHAT:黑帽运算方法
kernel:卷积核
iterations:迭代次数
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((3,3), np.uint8)
image_blackhat = cv2.morphologyEx(image_gray, cv2.MORPH_BLACKHAT, kernel, iterations=1)
cv2.imshow("image_blackhat", image_blackhat)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
作用:往往用来提取比其他邻近区域亮度低一些的区域,用于突出暗度变化。
8、图像边缘检测
(1)Canny算子
image_canny = cv2.Canny(image, threshold1, threshold2)
image:输入图像
threshold1:像素阈值1
threshold2:像素阈值2
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_canny = cv2.Canny(image_gray, 0, 255)
cv2.imshow("image", image)
cv2.imshow("image_canny", image_canny)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
(2)Sobel算子
sobel_x_ / sobel_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
src:输入图像
ddepth:图像深度,如cv2.CV_16S
dx / dy:x / y 方向上的求导的阶数,0 表示这个方向上没有求导,一般填0、1、2
ksize:Sobel算子卷积核大小,一般为奇数1、3、5、7
scale:缩放系数,一般默认即可
absX / absY = cv2.convertScaleAbs(sobel_x / sobel_y)
sobel_x / sobel_y:在 x / y 方向上的导数边缘
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/thresh.jpg"
image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
x = cv2.Sobel(image_gray, cv2.CV_16S, 0, 1)
y = cv2.Sobel(image_gray, cv2.CV_16S, 1, 0)
abs_x = cv2.convertScaleAbs(x)
abs_y = cv2.convertScaleAbs(y)
image_sobel = cv2.addWeighted(abs_x, 0.5, abs_y, 0.5, 0) # 图像融合
cv2.imshow("image", image)
cv2.imshow("image_sobel", image_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
9、图像融合
image_add= cv2.addWeighted(image1, alpha, image2, beta, gamma)
image1:输入图像1
alpha:图像1在融合图像中的权重
image2:输入图像2
beta:图像2在融合图像中的权重
gamma:图像增益
示例:
import cv2
import numpy as np
image_path1 = "C:/Users/Roger/Desktop/0.jpg"
image_path2 = "C:/Users/Roger/Desktop/lena.jpg"
image1 = cv2.imread(image_path1)
image2 = cv2.imread(image_path2)
image1 = cv2.resize(image1, (256, 256), cv2.INTER_LINEAR)
image2 = cv2.resize(image2, (256, 256), cv2.INTER_LINEAR)
image_add= cv2.addWeighted(image1, 0.5, image2, 0.5, 0)
cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
cv2.imshow("image_add", image_add)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
10、图像通道分割及合并
(1)通道分割
B, G, R = cv2.split(image)
image:输入图像
B:b 通道图像
G:g 通道图像
R:r 通道图像
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
b, g, r = cv2.split(image)
cv2.imshow("image", image)
cv2.imshow("r", r)
cv2.imshow("g", g)
cv2.imshow("b", b)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
(2)通道合并
image_merge = cv2.merge([B, G, R]) # 注意 b g r 通道的位置顺序决定合并成 BGR 格式图像还是 RGB 格式图像
B:b 通道上图像
G:g 通道上图像
R:r 通道上图像
image_merge:以 BGR 通道合并之后的 BGR 格式图像
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena.jpg"
image = cv2.imread(image_path)
b, g, r = cv2.split(image)
image_merge = cv2.merge([b, g, r])
cv2.imshow("image", image)
cv2.imshow("r", r)
cv2.imshow("g", g)
cv2.imshow("b", b)
cv2.imshow("image_merge", image_merge)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
11、图像轮廓检测及绘制
11.1 图像轮廓检测
contours, hierarchy = cv2.findContours(image, mode, method)
参数:
image:输入的二值化图像
mode:不同轮廓检索模式
(1)cv2.RETR_LIST:这是一种最简单的轮廓检索方式,它不建立轮廓间的子属关系,也就是说它的所有的轮廓属于同一层级。
(2)cv2.RETR_TREE:完整建立轮廓的层级从属关系。
(3)cv2.RETR_EXTERNAL:只寻找最高层级的轮廓
(4)cv2.RETR_CCOMP:把所有轮廓分为两个层级,不是里层就是外层。
method:轮廓的估计方法
(1)cv2.CHAIN_APPROX_NONE:存储所有边界点。
(2)cv2.CHAIN_APPROX_SIMPLE:去除所有冗余点并压缩轮廓,从而节省内存。
返回值:
contours:一个包含了图像中所有轮廓的 list 列表,其中每一个轮廓以边界点坐标 (x, y) 的形式存储在 numpy 数组中。
hierarchy:一个包含四个值的数组,为 [Next, Previous, First Children, Parent],一般不使用。
(1)Next:与当前轮廓处于同一层级的下一条轮廓。
(2)Previous:与当前轮廓处于同一层级的上一条轮廓。
(3)First Children:当前轮廓的第一条子轮廓。
(4)Parent:当前轮廓的父级轮廓。
11.2 轮廓绘制
cv2.drawContours(image, cnt, contourIdx, color, thickness)
image:需要绘制轮廓的图像
cnt:轮廓信息的数组
contourIdx:绘制哪个轮廓的索引,-1为绘制所有轮廓
color:绘制轮廓的颜色,是一个元组,如 (0, 0, 255)
thickness:绘制轮廓的线的大小
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)
cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
11.3 根据阈值筛选轮廓面积
area = cv2.contoursArea(contours[i])
参数:
contours[i]:findContours函数返回的 contours 数组中的一个轮廓
返回值:
area:循环到当前轮廓的面积
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
area = cv2.contourArea(contours[i])
if area < 200:
continue
cv2.drawContours(image_copy, contours[i], -1, (0, 0, 255), 2)
cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
11.4 绘制最小矩形框
rect = cv2.minAreaRect(contours[i])
参数:
contours[i]:findContours函数返回的 contours 数组中的一个轮廓
返回:
rect:返回 (center(x, y), (width, height), angle of rotation) 的 Box2D结构
# Box2D 结构转换成 4 个角点
points = cv2.boxPoints(rect)
参数:
rect:输入为 (center(x, y), (width, height), angle of rotation) 的 Box2D结构
返回:
points:返回的是最小矩形框的 4 个角点
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/0.jpg"
image = cv2.imread(image_path)
image_copy = image.copy()
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
retVal, image_thresh = cv2.threshold(image_gray, 180, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(image_thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# pattern
for i in range(len(contours)):
area = cv2.contourArea(contours[i])
if area < 200:
continue
# 找到包含轮廓的最小矩形框,返回的是(center(x, y), (width, height), angle of rotation)的 Box2D结构
rect = cv2.minAreaRect(contours[i])
# Box2D 结构转换成 4 个角点
points = cv2.boxPoints(rect)
# 角点类型转换成整型
points = np.int0(points)
# 绘制矩形
cv2.drawContours(image_copy, [points], -1, (0, 0, 255), 2)
cv2.imshow("image", image)
cv2.imshow("image_copy", image_copy)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
12、图像滤波
(1)均值滤波
image_blur = cv2.blur(image, ksize)
image:输入图像
ksize:卷积核大小,如 (3, 3)、(5, 5)
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)
image_blur = cv2.blur(image, (3, 3))
cv2.imshow("image", image)
cv2.imshow("image_blur", image_blur)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
(2)中值滤波
image_median = cv2.medianBlur(image, ksize)
image:输入图像
ksize:卷积核大小,是一个整数,如 ksize 为 3,则生成 (3, 3) 大小的卷积核
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)
image_median = cv2.medianBlur(image, 3)
cv2.imshow("image", image)
cv2.imshow("image_median", image_median)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
(3)双边滤波
image_bilateral = cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace, borderType)
image:输入图像
d:d是在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。如果滤波空间较大(d>5),则速度较慢。因此,在实时应用中,推荐d=5。对于较大噪声的离线滤波,可以选择d=9。
sigmaColor:sigmaColor是滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。与当前像素点的像素值差值小于 sigmaColor 的像素点,能够参与到当前的滤波中。该值越大,就说明周围有越多的像素点可以参与到运算中。该值为0时,滤波失去意义;该值为255时,指定直径内的所有点都能够参与运算。
sigmaSpace:sigmaSpace是坐标空间中的sigma值。它的值越大,说明有越多的点能够参与到滤波计算中来。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则,d与 sigmaSpace的值成比例。
borderType:borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)
image_bilateral = cv2.bilateralFilter(image, 9, 150, 150)
cv2.imshow("image", image)
cv2.imshow("image_bilateral", image_bilateral)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
(4)高斯滤波
image_gaussian = cv2.GaussianBlur(image, ksize, sigmaX, sigmaY, borderType)
image:输入图像
ksize:卷积核大小,如(3,3)、(5,5)
sigmaX:X 方向上的标准偏差
sigmaY:Y 方向上的标准偏差
borderType:边界样式,一般不用管,默认即可
示例:
import cv2
import numpy as np
image_path = "C:/Users/Roger/Desktop/lena_voice.jpg"
image = cv2.imread(image_path)
image_gaussian = cv2.GaussianBlur(image, (5, 5), 0, 0)
cv2.imshow("image", image)
cv2.imshow("image_gaussian", image_gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
13、几何图像绘制
(1)直线
cv2.line(image, p1, p2, color, thickness, lineType, shift)
image:要绘制的输入图像
p1:直线坐标1,如 (100, 100)
p2:直线坐标2,如 (400, 100)
color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
thickness:直线宽度
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
shift:坐标小数点位数,一般默认
示例:
import cv2
import numpy as np
image = np.zeros((500, 500, 3), dtype=np.uint8)
cv2.line(image, (100, 100), (400, 100), (255, 0, 0), 2, cv2.LINE_4)
cv2.line(image, (100, 200), (400, 200), (0, 255, 0), 2, cv2.LINE_8)
cv2.line(image, (100, 300), (400, 300), (0, 0, 255), 2, cv2.LINE_AA)
cv2.imshow("image", image)
cv2.waitKey(0)
(2)圆形
cv2.circle(image, center, radius, color, thickness, lineType, shift)
image:要绘制的输入图像
center:圆心坐标,如 (100, 100)
radius:半径大小, 如 50
color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
thickness:直线宽度,-1 表示内部填充
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
shift:坐标小数点位数,一般为默认
示例:
import cv2
import numpy as np
image = np.zeros((400, 500, 3), dtype=np.uint8)
cv2.circle(image, (100, 100), 70, (255, 0, 0), 2, cv2.LINE_4)
cv2.circle(image, (250, 200), 70, (0, 255, 0), 2, cv2.LINE_8)
cv2.circle(image, (400, 300), 70, (0, 0, 255), -1, cv2.LINE_AA)
cv2.imshow("image", image)
cv2.waitKey(0)
(3)矩形框
cv2.rectangle(image, pt1, pt2, color, thickness, lineType)
image:要绘制的输入图像
pt1:要绘制矩形的左上角坐标,如 (100, 100)
pt2:要绘制矩形的左上角坐标,如 (200, 200)
color:直线颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
thickness:直线宽度,-1 表示内部填充
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
示例:
import cv2
import numpy as np
image = np.zeros((400, 500, 3), dtype=np.uint8)
cv2.rectangle(image, (50, 150), (150, 250), (255, 0, 0), 2, cv2.LINE_4)
cv2.rectangle(image, (200, 150), (300, 250), (0, 255, 0), 2, cv2.LINE_8)
cv2.rectangle(image, (350, 150), (450, 250), (0, 0, 255), -1, cv2.LINE_AA)
cv2.imshow("image", image)
cv2.waitKey(0)
(4)多边形
cv2.polylines(image, pts, isClosed, color, thickness, lineType, shift)
image:要绘制的输入图像
pts:int32类型的坐标数组
color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
thickness:直线宽度,不能直接内部填充
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
shift:坐标小数点位数,一般为默认
示例:
import cv2
import numpy as np
import random
image = np.zeros((400, 500, 3), dtype=np.uint8)
points = []
for i in range(10):
pt1 = random.randint(50, 400)
pt2 = random.randint(50, 400)
points.append([pt1, pt2])
points = [np.array(points, dtype=np.int32)]
print(points)
cv2.polylines(image, points, isClosed=True, color=(0, 255, 0), thickness=2, lineType=cv2.LINE_4, shift=None)
cv2.imshow("image", image)
cv2.waitKey(0)
(5)填充多边形(fillConvexPoly)
cv2.fillConvexPoly(image, points, color, lineType, shift)
image:要绘制的输入图像
pts:int32类型的多边形顶点坐标
color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
shift:坐标小数点位数,一般为默认
示例:
import cv2
import numpy as np
import random
image = np.zeros((400, 500, 3), dtype=np.uint8)
points = []
for i in range(10):
pt1 = random.randint(50, 400)
pt2 = random.randint(50, 400)
points.append([pt1, pt2])
points = np.array(points, dtype=np.int32)
print(points)
cv2.fillConvexPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)
cv2.imshow("image", image)
cv2.waitKey(0)
(5)填充多边形(fillPoly)
cv2.fillConvexPoly(image, points, color, lineType, shift)
image:要绘制的输入图像
pts:int32类型的多边形顶点坐标,且可以是多个多边形图像顶点坐标
color:多边形颜色,是以BGR来设定的,如 (255, 0, 0) 则为蓝色
lineType:直线类型,一般为默认的 cv2.LINE_8,其他有:cv2.LINE_4、cv2.LINE_AA
shift:坐标小数点位数,一般为默认
示例:
import cv2
import numpy as np
import random
image = np.zeros((400, 500, 3), dtype=np.uint8)
points = []
for i in range(10):
pt1 = random.randint(150, 200)
pt2 = random.randint(150, 200)
points.append([pt1, pt2])
points2 = []
for i in range(10):
pt1 = random.randint(200, 300)
pt2 = random.randint(200, 300)
points2.append([pt1, pt2])
points = [np.array(points, dtype=np.int32), np.array(points2, dtype=np.int32)]
points2 = []
print(points)
cv2.fillPoly(image, points, color=(0, 255, 0), lineType=cv2.LINE_4, shift=None)
cv2.imshow("image", image)
cv2.waitKey(0)