如何利用掩码去除硬币磨砂区域以识别光亮部分划痕?
硬币光亮区域划痕检测实现方案
核心思路
基于你已有的磨砂区域轮廓图,通过掩码技术屏蔽磨砂区域,仅保留光亮区域后,再通过边缘检测+霍夫直线变换统计划痕数量,流程如下:
- 从磨砂轮廓图生成完整的磨砂区域掩码
- 用掩码过滤原灰度图,提取光亮区域
- 对光亮区域做划痕检测与统计
代码实现(Python + OpenCV)
先确保安装依赖:
pip install opencv-python numpy
完整代码:
import cv2 import numpy as np # 1. 加载图像(替换为你的实际文件路径) gray_coin = cv2.imread('无划痕硬币灰度图.jpg', cv2.IMREAD_GRAYSCALE) contour_map = cv2.imread('磨砂区域轮廓图.png', cv2.IMREAD_GRAYSCALE) # 2. 生成磨砂区域掩码 # 二值化轮廓图,提取磨砂边缘 _, binary_contour = cv2.threshold(contour_map, 127, 255, cv2.THRESH_BINARY) # 查找轮廓(只取最外层轮廓) contours, _ = cv2.findContours(binary_contour, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 创建与原图像尺寸一致的空白掩码 mask = np.zeros_like(gray_coin) # 填充轮廓,得到完整的磨砂区域掩码(白色区域为磨砂区) cv2.drawContours(mask, contours, -1, 255, thickness=cv2.FILLED) # 3. 提取光亮区域 # 反转掩码:白色为光亮区,黑色为磨砂区 inverted_mask = cv2.bitwise_not(mask) # 掩码与原灰度图做与运算,仅保留光亮区域 bright_area = cv2.bitwise_and(gray_coin, gray_coin, mask=inverted_mask) # 4. 检测并统计光亮区域内的划痕 # Canny边缘检测提取划痕边缘 scratch_edges = cv2.Canny(bright_area, 50, 150) # 霍夫直线变换检测划痕线条(参数可根据实际划痕调整) lines = cv2.HoughLinesP( scratch_edges, rho=1, theta=np.pi/180, threshold=20, minLineLength=10, maxLineGap=5 ) # 统计划痕数量 scratch_num = len(lines) if lines is not None else 0 print(f"光亮区域划痕数量:{scratch_num}") # 可选:可视化结果 cv2.imshow('仅保留光亮区域', bright_area) cv2.imshow('划痕检测结果', scratch_edges) cv2.waitKey(0) cv2.destroyAllWindows()
参数调整建议
- 如果磨砂区域掩码不够准确:调整
cv2.threshold的阈值(127),或更换轮廓查找模式 - 如果划痕检测不准:修改Canny的阈值(50/150),或霍夫变换的
threshold/minLineLength/maxLineGap参数,适配你的划痕粗细、长度
内容的提问来源于stack exchange,提问作者Ioanna Deroukaki
相关产品推荐
相关产品推荐

