|
|
|
@ -0,0 +1,66 @@
|
|
|
|
|
"""
|
|
|
|
|
模块作者:
|
|
|
|
|
图像预处理:潘浩宇
|
|
|
|
|
轮廓寻找与切分:戴晓齐
|
|
|
|
|
代码优化/整合/打包:王昱博
|
|
|
|
|
模块用途:
|
|
|
|
|
对车牌图片进行预处理和切分,找出包含车牌号的部分
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
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
|