import cv2
import numpy as np
def preprocess_image(image_path, blur_ksize=(5, 5), canny_threshold1=50, canny_threshold2=150):
"""
图像预处理:灰度化 → 高斯模糊 → 边缘检测(Canny)
:param image_path: 图像路径
:param blur_ksize: 高斯模糊核大小
:param canny_threshold1: Canny边缘检测阈值1
:param canny_threshold2: Canny边缘检测阈值2
:return: 预处理后的边缘图像、原始彩色图像
"""
# 读取图像
img = cv2.imread(image_path)
if img is None:
raise ValueError(f"无法读取图像:{image_path}")
# 灰度化(减少计算量,边缘检测只需要单通道)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊(降噪,避免干扰边缘检测)
blurred = cv2.GaussianBlur(gray, blur_ksize, 0)
# Canny边缘检测(提取图形轮廓)
edges = cv2.Canny(blurred, canny_threshold1, canny_threshold2)
return edges, img
def extract_contours(edge_img, min_area=100):
"""
提取图像中的轮廓(筛选有效轮廓,排除小噪点)
:param edge_img: 边缘检测后的图像
:para***in_area: 最小轮廓面积(过滤小噪点)
:return: 筛选后的轮廓列表
"""
# 查找轮廓(RETR_EXTERNAL只提取最外层轮廓,减少复杂度)
contours, _ = cv2.findContours(edge_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- 送礼有好礼~~