图像处理与分析——大实验-扑克牌分割

ELecmark VIP

实验目标:

本实验旨在设计一个算法,自动识别图像中的扑克牌区域,并生成mask将扑克牌抠取出来。通过实验,可以深入理解图像处理的基本原理和技术,掌握分割和形态处理的方法。

实验要求:

  1. 利用所学知识,分析扑克牌内容及其边界的特性。
  2. 基于分割和形态处理等知识,设计算法自动分割或识别图像中的扑克牌区域,生成mask后将扑克牌抠取出来。
  3. 阐述原理,分析得到的结果与真实值之间的差异原因,总结整理报告。

实验方案:

  1. 图像读取与预处理

    • 图像读取:首先,使用 cv2.imread 函数从指定路径读取图像文件,并将图像数据存储在变量 image 中。这一步骤将图像加载到内存中以便后续处理。
    • 颜色空间转换:将读取的图像从BGR颜色空间转换为HSV颜色空间,使用 cv2.cvtColor 函数实现。HSV颜色空间将颜色信息和亮度信息分开,有利于后续的颜色分割。
    • 阈值设置:根据HSV颜色空间的特点,设置白色的HSV阈值范围。白色的HSV范围设定为 lower_white = np.array([0, 0, 180])upper_white = np.array([180, 200, 255]),用于识别图像中的白色区域。
    • 掩膜生成:利用 cv2.inRange 函数生成二值掩膜。掩膜中的白色部分对应图像中的白色区域,黑色部分对应其他颜色区域。
    1
    2
    3
    4
    5
    6
    image = cv2.imread(image_path)
    original_image = image.copy()
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    lower_white = np.array([0, 0, 180])
    upper_white = np.array([180, 200, 255])
    mask = cv2.inRange(hsv, lower_white, upper_white)
  2. 形态学操作

    • 形态学闭操作:为了消除小的黑色区域和填补白色区域的孔洞,使用形态学闭操作。通过 cv2.morphologyEx 函数和 cv2.MORPH_CLOSE 操作实现,卷积核大小设定为 kernel = np.ones((3, 3), np.uint8)。闭操作可以连接分离的白色区域,增强目标区域的连贯性。
    • 形态学开操作:在闭操作之后,为了去除噪声并平滑边缘,使用形态学开操作。通过 cv2.morphologyEx 函数和 cv2.MORPH_OPEN 操作实现。开操作可以去除图像中的小噪声点,使掩膜更加干净。
    1
    2
    3
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
  3. 轮廓检测与筛选

    • 轮廓检测:使用 cv2.findContours 函数在掩膜中查找轮廓。轮廓检测方法设定为 cv2.RETR_EXTERNAL,仅检测外部轮廓;轮廓逼近方法设定为 cv2.CHAIN_APPROX_SIMPLE,将轮廓点压缩到最少。
    • 轮廓筛选:遍历所有检测到的轮廓,筛选出符合条件的轮廓。筛选条件为轮廓的多边形逼近结果为四边形,且面积大于1000。通过 cv2.approxPolyDP 函数进行多边形逼近,并使用面积条件筛选轮廓。
    • 轮廓绘制:对符合条件的轮廓进行绘制,使用 cv2.drawContours 函数将轮廓绘制在原图上,并生成相应的掩膜以便抠取扑克牌图像。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    output_image = original_image.copy()
    card_images = []

    for contour in contours:
    epsilon = 0.1 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    if len(approx) == 4 and cv2.contourArea(approx) > 1000:
    cv2.drawContours(output_image, [approx], -1, (0, 255, 0), 2)
    mask = np.zeros_like(image)
    cv2.drawContours(mask, [approx], -1, (255, 255, 255), -1)
    card_image = cv2.bitwise_and(original_image, mask)
    card_images.append(card_image)
  4. 结果保存与显示

    • 结果保存:使用 cv2.imwrite 函数将标注了轮廓的图像保存到指定路径。这样可以将处理后的结果保存下来,以便后续查看和分析。
    • 扑克牌图像保存:将抠取的扑克牌图像保存为单独的文件。文件名格式为 result_path.replace('.jpg', f'_card_{idx+1}.jpg'),以确保每张扑克牌图像都被单独保存。
    1
    2
    3
    4
    cv2.imwrite(result_path, output_image)
    for idx, card_image in enumerate(card_images):
    card_path = result_path.replace('.jpg', f'_card_{idx+1}.jpg')
    cv2.imwrite(card_path, card_image)

实验结果:

结果图像展示了处理前后的效果。处理后的图像中,扑克牌区域被成功识别并标注,生成的掩膜准确地抠取了扑克牌。

result_1

result_1_card_1

result_2

result_2_card_1

result_3

result_3_card_1

result_4

result_4_card_1

result_5

result_5_card_1

result_5_card_2

result_5_card_3

result_5_card_4

实验总结:

本实验通过图像处理和形态学操作,实现了自动识别和分割图像中的扑克牌区域。实验中,我使用了颜色空间转换、阈值分割、形态学操作、轮廓检测和多边形逼近等多种图像处理技术,取得了良好的分割效果。以下是对实验结果和方法的详细总结:

  1. 实验结果分析

    • 识别准确性:实验中,扑克牌区域在大多数图像中都被准确识别并标注。尤其是在光照均匀和背景简单的情况下,算法表现出色,生成的掩膜能够准确地抠取扑克牌。
    • 处理后的图像:处理后的图像显示了识别的扑克牌区域,这些区域被绿色轮廓标注,并生成了相应的掩膜。通过掩膜,成功地抠取了扑克牌图像,验证了算法的有效性。
  2. 形态学操作的效果

    • 闭操作:闭操作通过先膨胀后腐蚀,消除了图像中的小孔洞,连接了相邻的白色区域,增强了目标区域的连贯性。这在处理具有细小孔洞或断裂的扑克牌边缘时尤为有效。
    • 开操作:开操作通过先腐蚀后膨胀,去除了图像中的小噪声点,平滑了目标区域的边缘。这样可以有效地去除图像中的孤立噪声点,使识别更加准确。
  3. 算法优势与局限性

    • 优势

      • 高效性:算法能够快速处理多张图像,识别扑克牌区域并生成相应的掩膜,适用于批量图像处理。
      • 鲁棒性:在光照条件较好、背景简单的情况下,算法表现稳定,识别准确。
      • 简洁性:算法步骤清晰明确,易于实现和理解,便于在实际应用中推广。
    • 局限性

      • 光照变化:在光照不均匀或光照条件变化较大的情况下,HSV阈值分割可能不够稳定,影响识别效果。需要结合自适应阈值分割或其他颜色空间转换方法进行改进。
      • 背景干扰:在复杂背景下,可能会引入干扰,导致误识别或漏识别。可以考虑引入背景建模或背景抑制技术来提高识别准确性。
      • 扑克牌的旋转与变形:对于旋转或变形较大的扑克牌,轮廓逼近和多边形筛选可能无法准确识别,需要结合形状匹配或模板匹配等方法进行优化。
  4. 改进与优化方向

    • 自适应阈值分割:结合自适应阈值分割方法,提高在光照变化下的鲁棒性。
    • 多尺度形态学操作:引入多尺度形态学操作,提高对不同大小噪声的抑制效果。
    • 形状匹配与模板匹配:结合形状匹配和模板匹配技术,提高对旋转和变形扑克牌的识别能力。
    • 机器学习与深度学习:利用机器学习和深度学习技术,训练分类器或分割网络,实现更加精确和智能的扑克牌识别。

通过本实验,我掌握了图像分割和形态学处理的基本方法,能够将这些技术应用于实际问题,解决图像处理中的难题。未来的研究和应用中,可以进一步优化和扩展这些技术,提升图像处理的效果和效率。

  • Title: 图像处理与分析——大实验-扑克牌分割
  • Author: ELecmark
  • Created at : 2024-06-08 10:45:28
  • Updated at : 2024-06-13 11:58:44
  • Link: https://elecmark.github.io/2024/06/08/图像处理与分析——大实验-扑克牌分割/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
图像处理与分析——大实验-扑克牌分割