图像处理与分析——大实验-扑克牌分割
实验目标:
本实验旨在设计一个算法,自动识别图像中的扑克牌区域,并生成mask将扑克牌抠取出来。通过实验,可以深入理解图像处理的基本原理和技术,掌握分割和形态处理的方法。
实验要求:
- 利用所学知识,分析扑克牌内容及其边界的特性。
- 基于分割和形态处理等知识,设计算法自动分割或识别图像中的扑克牌区域,生成mask后将扑克牌抠取出来。
- 阐述原理,分析得到的结果与真实值之间的差异原因,总结整理报告。
实验方案:
图像读取与预处理:
- 图像读取:首先,使用
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
6image = 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)- 图像读取:首先,使用
形态学操作:
- 形态学闭操作:为了消除小的黑色区域和填补白色区域的孔洞,使用形态学闭操作。通过
cv2.morphologyEx
函数和cv2.MORPH_CLOSE
操作实现,卷积核大小设定为kernel = np.ones((3, 3), np.uint8)
。闭操作可以连接分离的白色区域,增强目标区域的连贯性。 - 形态学开操作:在闭操作之后,为了去除噪声并平滑边缘,使用形态学开操作。通过
cv2.morphologyEx
函数和cv2.MORPH_OPEN
操作实现。开操作可以去除图像中的小噪声点,使掩膜更加干净。
1
2
3kernel = np.ones((3, 3), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)- 形态学闭操作:为了消除小的黑色区域和填补白色区域的孔洞,使用形态学闭操作。通过
轮廓检测与筛选:
- 轮廓检测:使用
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
13contours, _ = 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)- 轮廓检测:使用
结果保存与显示:
- 结果保存:使用
cv2.imwrite
函数将标注了轮廓的图像保存到指定路径。这样可以将处理后的结果保存下来,以便后续查看和分析。 - 扑克牌图像保存:将抠取的扑克牌图像保存为单独的文件。文件名格式为
result_path.replace('.jpg', f'_card_{idx+1}.jpg')
,以确保每张扑克牌图像都被单独保存。
1
2
3
4cv2.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)- 结果保存:使用
实验结果:
结果图像展示了处理前后的效果。处理后的图像中,扑克牌区域被成功识别并标注,生成的掩膜准确地抠取了扑克牌。
实验总结:
本实验通过图像处理和形态学操作,实现了自动识别和分割图像中的扑克牌区域。实验中,我使用了颜色空间转换、阈值分割、形态学操作、轮廓检测和多边形逼近等多种图像处理技术,取得了良好的分割效果。以下是对实验结果和方法的详细总结:
实验结果分析:
- 识别准确性:实验中,扑克牌区域在大多数图像中都被准确识别并标注。尤其是在光照均匀和背景简单的情况下,算法表现出色,生成的掩膜能够准确地抠取扑克牌。
- 处理后的图像:处理后的图像显示了识别的扑克牌区域,这些区域被绿色轮廓标注,并生成了相应的掩膜。通过掩膜,成功地抠取了扑克牌图像,验证了算法的有效性。
形态学操作的效果:
- 闭操作:闭操作通过先膨胀后腐蚀,消除了图像中的小孔洞,连接了相邻的白色区域,增强了目标区域的连贯性。这在处理具有细小孔洞或断裂的扑克牌边缘时尤为有效。
- 开操作:开操作通过先腐蚀后膨胀,去除了图像中的小噪声点,平滑了目标区域的边缘。这样可以有效地去除图像中的孤立噪声点,使识别更加准确。
算法优势与局限性:
优势:
- 高效性:算法能够快速处理多张图像,识别扑克牌区域并生成相应的掩膜,适用于批量图像处理。
- 鲁棒性:在光照条件较好、背景简单的情况下,算法表现稳定,识别准确。
- 简洁性:算法步骤清晰明确,易于实现和理解,便于在实际应用中推广。
局限性:
- 光照变化:在光照不均匀或光照条件变化较大的情况下,HSV阈值分割可能不够稳定,影响识别效果。需要结合自适应阈值分割或其他颜色空间转换方法进行改进。
- 背景干扰:在复杂背景下,可能会引入干扰,导致误识别或漏识别。可以考虑引入背景建模或背景抑制技术来提高识别准确性。
- 扑克牌的旋转与变形:对于旋转或变形较大的扑克牌,轮廓逼近和多边形筛选可能无法准确识别,需要结合形状匹配或模板匹配等方法进行优化。
改进与优化方向:
- 自适应阈值分割:结合自适应阈值分割方法,提高在光照变化下的鲁棒性。
- 多尺度形态学操作:引入多尺度形态学操作,提高对不同大小噪声的抑制效果。
- 形状匹配与模板匹配:结合形状匹配和模板匹配技术,提高对旋转和变形扑克牌的识别能力。
- 机器学习与深度学习:利用机器学习和深度学习技术,训练分类器或分割网络,实现更加精确和智能的扑克牌识别。
通过本实验,我掌握了图像分割和形态学处理的基本方法,能够将这些技术应用于实际问题,解决图像处理中的难题。未来的研究和应用中,可以进一步优化和扩展这些技术,提升图像处理的效果和效率。
- 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