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

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