You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.9 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
模块作者:
图像预处理:潘浩宇
轮廓寻找与切分:戴晓齐
代码优化/整合/打包:王昱博
模块用途:
对车牌图片进行预处理和切分,找出包含车牌号的部分
"""
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)
# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
# 使用形状为3010的矩形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