""" 模块作者: 图像预处理:潘浩宇 轮廓寻找与切分:戴晓齐 代码优化/整合/打包:王昱博 模块用途: 对车牌图片进行预处理和切分,找出包含车牌号的部分 """ import cv2 class ImageCutter: @staticmethod # 图像去噪灰度处理,消除噪点 def gray_guss(image): image = cv2.GaussianBlur(image, (3, 3), 0) gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) return gray_image @classmethod def ImagePreProcess(cls, image_path: str) -> tuple: # 复制一张图片,在复制图上进行图像操作,保留原图 origin_image = cv2.imread(image_path) # 图像去噪灰度处理 image = origin_image.copy() # x方向上的边缘检测(增强边缘信息) gray_image = cls.gray_guss(image) Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0) absX = cv2.convertScaleAbs(Sobel_x) image = absX # 图像阈值化操作——获得二值化图,将像素置为0或者255。将灰度转成黑白 ret, image = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU) # 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作 # 使用形状为(30,10)的矩形kernelX对图像进行偏X方向的闭运算,将图像进行X方向融合找出车牌区域。 kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10)) image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX, iterations=1) return origin_image, image @classmethod def CutPlateRect(cls, origin_image: cv2.Mat, image: cv2.Mat) -> cv2.Mat: # 去除细小的边缘 # 腐蚀(erode)和膨胀(dilate) kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1)) kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20)) # x方向进行闭操作(抑制暗细节) image = cv2.dilate(image, kernelX) image = cv2.erode(image, kernelX) # y方向的开操作 image = cv2.erode(image, kernelY) image = cv2.dilate(image, kernelY) # 中值滤波(去噪)将边缘平滑 image = cv2.medianBlur(image, 21) # 获得轮廓 RETR_EXTERNAL矩形的外边缘 contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选 for item in contours: rect = cv2.boundingRect(item) x = rect[0] y = rect[1] weight = rect[2] height = rect[3] # 根据轮廓的形状特点,确定车牌的轮廓位置并截取图像 if (weight > (height * 3.5)) and (weight < (height * 4)): # 对长宽比例进行确定 _image = origin_image[y:y + height, x:x + weight] # 对图片进行裁剪 return cv2.Mat(_image) return origin_image