图像预处理常用函数简介
简介
使用opencv库函数进行图像处理提取轮廓等使用频率高的函数简要介绍,详细使用请见opencv官方文档https://woshicver.com/。
函数介绍
图像读取与显示
cv2.imread(filename, flags)
: 读取图像
filename
: 图像路径。flags
(可选): 指定图像读取模式(如彩色、灰度)。- 返回值:读取的图像。
cv2.imshow(winname, mat)
: 显示图像在窗口中
-
winname
: 窗口名称。 -
mat
: 要显示的图像。
cv2.waitKey(delay)
: 等待键盘事件
delay
: 等待时间(毫秒),0表示无限等待。
cv2.destroyAllWindows()
: 关闭所有创建的窗口
示例:
# 读取图片
src = cv2.imread(image_path)
# 显示图像
cv2.imshow('img', src)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像处理
cv2.resize(src, dsize, fx, fy, interpolation)
: 缩放图像
src
: 输入图像。dsize
: 输出图像大小,若为(0,0)则通过fx
和fy
指定缩放比例。fx
,fy
: 水平方向和垂直方向的缩放比例。interpolation
: 插值方法,控制图像缩放时的质量和速度。常用插值方法有:cv2.INTER_NEAREST
: 最邻近插值,速度快但质量差。cv2.INTER_LINEAR
: 双线性插值(默认值),适合缩小图像。cv2.INTER_CUBIC
: 三次插值,适合放大图像,质量较好但速度较慢。cv2.INTER_LANCZOS4
: Lanczos 插值,适合高质量缩放。
示例:
resize_img = cv2.resize(src, (0, 0), fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)
cv2.cvtColor(src, code)
: 转换图像颜色空间
src
: 输入图像。code
: 转换代码,如cv2.COLOR_BGR2GRAY
转换为灰度图。
示例:
hsv_image = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
cv2.inRange(src, lowerb, upperb)
: 根据阈值范围创建掩膜图像
src
: 输入图像。lowerb
,upperb
: 阈值范围(如HSV颜色范围)。
示例:
mask = cv2.inRange(hsv_image, lower_color, upper_color)
cv2.GaussianBlur(src, ksize, sigmaX)
: 应用高斯模糊
src
: 输入图像。ksize
: 高斯核大小(奇数)。sigmaX
: X方向的标准差。
示例:
dst = cv2.GaussianBlur(src, 5, 0)
cv2.medianBlur(src, ksize)
: 应用中值滤波
src
: 输入图像。ksize
: 核大小(通常为奇数)。
示例:
dst = cv2.medianBlur(src, 3)
cv2.fastNlMeansDenoising(src, dst, h, templateWindowSize, searchWindowSize)
: 非局部均值去噪
src
: 输入图像。h
: 过滤强度。templateWindowSize
: 模板窗口大小。searchWindowSize
: 搜索窗口大小。
示例:
dst = cv2.fastNlMeansDenoising(src, None, 25, 12, 21)
cv2.equalizeHist(src)
: 应用直方图均衡化以增强对比度。
src
: 输入灰度图像。
示例:
dst = cv2.equalizeHist(src)
cv2.filter2D(src, ddepth, kernel)
: 对图像进行卷积操作。
src
: 输入图像。ddepth
: 输出图像的深度,(-1表示输出图像的深度与输入图像相同)。kernel
: 卷积核。
示例(利用卷积核锐化图像):
# 定义一个自定义的锐化卷积核
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
# 对图像进行卷积操作
sharp_image = cv2.filter2D(image, -1, kernel)
cv2.Laplacian(src, ddepth)
: 计算图像的拉普拉斯变换。
src
: 输入图像。ddepth
: 输出图像的深度(图像中每个像素的位深度)。
示例(利用拉普拉斯变换锐化图像):
# 使用拉普拉斯算子计算图像的二阶导数
laplacian = cv2.Laplacian(image, cv2.CV_64F)
# 将拉普拉斯算子的结果转化为与原图像相同的数据类型
laplacian = np.uint8(np.absolute(laplacian))
# 锐化图像:原图像 - 拉普拉斯算子结果
sharpened = cv2.subtract(image, laplacian)
cv2.threshold(src, thresh, maxval, type)
: 应用二值化阈值处理。
-
src
: 输入图像。 -
thresh
: 阈值。 -
maxval
: 超过阈值时的最大值。 -
type
: 阈值类型。
示例:
# 应用THRESH_BINARY固定参数阈值处理,小于127的像素点设置为0,大于127的像素点设置为255
ret, binary = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)
# 参数:输入图像、阈值、最大值、阈值类型:使用三角法进行二值化,适用于灰度直方图为单峰的图像
ret, binary = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)
# 使用Otsu法自动确定阈值,此时阈值参数会被忽略,超过阈值像素会被设置为255,否则设置为0
ret, binary = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
边缘检测
cv2.Canny(image, threshold1, threshold2)
: 使用Canny算法进行边缘检测。
-
image
: 输入图像。 -
threshold1
: 低阈值。 -
threshold2
: 高阈值。
示例:
edges = cv2.Canny(src, 100, 200)
形态学操作
- 应用形态学操作。
cv2.morphologyEx(src, op, kernel, iterations)
src
: 输入图像。op
: 操作类型,如cv2.MORPH_OPEN
或cv2.MORPH_CLOSE
。kernel
: 结构元素。iterations
: 迭代次数。
示例:
kernel = np.ones((5, 5), np.uint8) # 创建卷积核
opening = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel, iterations=1) # 开运算
closing = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel, iterations=1) # 闭运算
轮廓检测与绘制
cv2.findContours(image, mode, method)
: 检测图像中的轮廓。
-
image
: 输入二值图像。 -
mode
: 轮廓检索模式,如下:- cv2.RETR_EXTERNAL:仅检索外部轮廓。
- cv2.RETR_LIST:检索所有轮廓,并将它们放入一个列表中,不建立任何层级关系。
- cv2.RETR_TREE:检索所有轮廓,并重建轮廓之间的层级关系。
- cv2.RETR_CCOMP:检索所有轮廓,并将它们组织成两个层级(外部和内部)。
-
method
: 轮廓近似方法,如cv2.CHAIN_APPROX_SIMPLE
。- cv2.CHAIN_APPROX_NONE:不进行压缩,保留轮廓上的所有点。
- cv2.CHAIN_APPROX_SIMPLE:只保留轮廓的关键点,压缩水平或垂直的线段部分,并移除冗余点。
- cv2.CHAIN_APPROX_TC89_L1:使用Teh-Chin链逼近算法进行更复杂的轮廓压缩。
- cv2.CHAIN_APPROX_TC89_KCOS:与
CHAIN_APPROX_TC89_L1
类似,也使用 Teh-Chin 链逼近算法,但基于 k-cosine 距离。
示例:
# 返回值为轮廓列表,每个轮廓都是一个numpy数组,表示轮廓点集合
contours, _ = cv2.findContours(src, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, contourIdx, color, thickness)
: 绘制轮廓。image
: 输入图像。contours
: 轮廓列表。contourIdx
: 要绘制的轮廓索引,-1表示绘制所有轮廓。color
: 绘制颜色。thickness
: 线条宽度。
示例:
cv2.drawContours(src, contours, -1, (0, 255, 0), 3)
cv2.contourArea(contour)
: 计算轮廓的面积。contour
: 轮廓。
示例:
area = cv2.contourArea(contour)
cv2.arcLength(curve, closed)
: 计算轮廓的周长。curve
: 输入轮廓。closed
: 是否闭合。
示例:
epsilon = 0.02 * cv2.arcLength(contour, True) # 轮廓的近似程度设为轮廓周长的2%
cv2.approxPolyDP(curve, epsilon, closed)
: 近似轮廓到多边形。curve
: 输入轮廓。epsilon
: 近似精度。closed
: 是否闭合。
示例:
approx = cv2.approxPolyDP(contour, epsilon, True)
cv2.isContourConvex(contour)
: 判断轮廓是否为凸形。contour
: 输入轮廓。
示例:
is_convex = cv2.isContourConvex(approx) # 检查轮廓是否为凸形
形状拟合
cv2.minAreaRect(points)
: 计算点集的最小外接矩形。points
: 输入点集。- 返回值:包含中心点、尺寸、旋转角度的矩形。
示例:
rect = cv2.minAreaRect(contour)
cv2.boxPoints(rect)
: 计算矩形的四个顶点。rect
: 由cv2.minAreaRect
返回的矩形。
示例:
box = cv2.boxPoints(rect)
cv2.convexHull(points)
: 计算点集的凸包。points
: 输入点集。
示例:
hull = cv2.convexHull(merged_contour) # 计算凸包,凸包是包含轮廓所有点的最小凸多边形
cv2.moments(array)
: 计算图像或轮廓的几何矩,几何矩可以用于计算图像的质量中心、面积等特征。array
: 输入二值图像或轮廓点集。- 返回值: 该函数返回一个字典,其中包含以下常用的矩:
m00
: 零阶矩,表示面积。m10
,m01
: 一阶矩,用于计算质心。m20
,m11
,m02
: 二阶矩,用于计算方向、惯性等特征。
示例:
# 计算轮廓中心坐标
M = cv2.moments(contour) # 计算第一条轮廓的各阶矩,字典形式
center_x = int(M['m10'] / M['m00'])
center_y = int(M['m01'] / M['m00'])
cv2.circle(img, center, radius, color, thickness)
: 在图像上绘制圆。img
: 输入图像。center
: 圆心坐标。radius
: 半径。color
: 颜色,灰度值(0~255)或者彩色值(B, G, R)。thickness
: 线条厚度,-1表示填充整个圆。
示例:
cv2.circle(src, (center_x, center_y), 7, 128, -1) # 绘制中心点
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType)
: 在图像上绘制文本。img
: 输入图像。text
: 要绘制的文本。org
: 文本左下角的坐标。fontFace
: 字体类型。cv2.FONT_HERSHEY_SIMPLEX
:正常大小的无衬线字体cv2.FONT_HERSHEY_PLAIN
:小尺寸无衬线字体cv2.FONT_HERSHEY_DUPLEX
:正常大小的双线无衬线字体cv2.FONT_HERSHEY_COMPLEX
:正常大小的衬线字体cv2.FONT_HERSHEY_TRIPLEX
:正常大小的三线衬线字体cv2.FONT_HERSHEY_COMPLEX_SMALL
:小尺寸的复杂字体cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
:简单的手写字体cv2.FONT_HERSHEY_SCRIPT_COMPLEX
:复杂的手写字体
fontScale
: 字体缩放系数。color
: 文本颜色。thickness
: 线条厚度。lineType
: 线条类型:cv2.LINE_8
:8 像素的连接线cv2.LINE_AA
:抗锯齿线,线条更平滑
示例:
cv2.putText(src, str, (center_x - 50, center_y + 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2, cv2.LINE_AA) # 绘制坐标点位