图像预处理常用函数

图像预处理常用函数简介

简介

​ 使用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)则通过fxfy指定缩放比例。
  • 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_OPENcv2.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) # 绘制坐标点位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值