You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于OpenCV边缘与轮廓检测优化白底车牌识别(适配低分辨率图)

白底车牌低分辨率图像检测优化方案

针对低分辨率、模糊图像里的白底车牌检测,原方案依赖清晰边缘和完美4边形轮廓,容易失效,以下是几个更鲁棒的改进方法:

一、利用白底颜色特征做针对性预处理

白底车牌的灰度值远高于周围区域,先通过阈值分割提取高亮区域,比单纯边缘检测更稳定:

# 替换原灰度后的预处理步骤
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 全局阈值提取高亮区域(白底车牌灰度值高,可根据数据集调整阈值)
_, thresh = cv2.threshold(gray_image, 200, 255, cv2.THRESH_BINARY)
# 也可用自适应阈值,适配局部光照变化
# thresh = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow("白底区域提取", thresh)
cv2.waitKey(0)

二、优化形态学操作,适配车牌形状

原代码的膨胀腐蚀用默认核,改成适配车牌长条形的核,增强横向连接,消除小噪声:

# 用长条形核做闭运算(先膨胀后腐蚀),连接断裂的白底区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 3))
processed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 用小核开运算去掉小噪点
kernel_small = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
processed = cv2.morphologyEx(processed, cv2.MORPH_OPEN, kernel_small)
cv2.imshow("形态学处理后", processed)
cv2.waitKey(0)

三、放宽轮廓筛选条件,结合车牌特征过滤

低分辨率下轮廓近似不会是完美4边形,通过宽高比、实心度筛选,比只看顶点数更可靠:

contours, _ = cv2.findContours(processed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:20]

for contour in contours:
    area = cv2.contourArea(contour)
    if area < 500:  # 过滤太小的无效轮廓
        continue
    # 计算外接矩形
    x, y, w, h = cv2.boundingRect(contour)
    # 车牌宽高比(比如尼泊尔车牌大概3.5-5:1,可根据实际调整)
    aspect_ratio = w / float(h)
    if 3 < aspect_ratio < 6:
        # 计算实心度:轮廓面积/外接矩形面积,白底车牌实心度较高
        rect_area = w * h
        solidity = area / float(rect_area)
        if solidity > 0.7:
            # 绘制检测框
            cv2.rectangle(image, (x, y), (x+w, y+h), (0,255,0), 3)
            license_plate = gray_image[y:y+h, x:x+w]
            break  # 找到第一个符合条件的即可退出,也可保留多个候选

image = cv2.resize(image, (600,600))
cv2.imshow("检测结果", image)
cv2.waitKey(0)

四、混合边缘与颜色检测(可选)

如果颜色阈值不够稳定,可以结合边缘检测,先在颜色提取的区域内找边缘:

# 先做颜色阈值得到mask
_, thresh = cv2.threshold(gray_image, 200, 255, cv2.THRESH_BINARY)
# 在mask范围内做Canny边缘检测,减少无关边缘干扰
edges = cv2.Canny(gray_image, 100, 200)
edges = cv2.bitwise_and(edges, edges, mask=thresh)
# 再执行后续形态学和轮廓筛选步骤

这些方法核心是优先利用白底的颜色特征缩小检测范围,再结合车牌的形状特征筛选,比单纯依赖边缘和4边形轮廓更适合低分辨率模糊图像。

内容的提问来源于stack exchange,提问作者Prajwal Panta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:40:39