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

使用OpenCV裁剪图像时如何去除绿色边框?(OpenCV & Python)

解决ANPR应用中裁剪图像的绿色边框问题及代码优化建议

问题概述

开发基础ANPR(自动车牌识别)应用时,轮廓检测与图像裁剪功能已正常运行,但裁剪后的图像始终带有绿色边框,同时希望得到代码优化建议。

当前使用的代码:

image = f'home/folder/car.jpg'
image = cv2.imread(image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #frame filtered again
canny = cv2.Canny(gray, 100, 200)

contours, _ = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

for contour in contours:
    approx = cv2.approxPolyDP(contour, 0.02 * cv2.arcLength(contour, True), True)
    
    if len(approx) == 4:
        x, y, w, h = cv2.boundingRect(approx)
        
        aspectratio = w / float(h) #aspect ratio
        area = w * h
        
        if 2 < aspectratio < 5 and area > 2000:
            cropped = image[y:y+h, x:x+w]
            cv2.imwrite('contour.png', cropped) 

相关图像:

  • 原始图像car.jpg:
    原始图像
  • 添加轮廓后的图像:
    添加轮廓后的图像
  • 轮廓检测并裁剪后的图像:
    裁剪后的图像

绿色边框问题原因

你在代码中先执行了cv2.drawContours(image, contours, -1, (0, 255, 0), 3),这一步直接把绿色轮廓绘制在了原始图像上,后续裁剪操作使用的是已经被修改过的原始图像,导致裁剪结果带有绿色边框。

解决方案

保留原始图像的副本用于裁剪,将绘制轮廓的操作放在另一个图像副本上:

修改后的核心代码:

import cv2

# 路径与图像读取
image_path = 'home/folder/car.jpg'
image = cv2.imread(image_path)
# 创建副本用于绘制轮廓,不修改原始图像
image_with_contours = image.copy()

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 100, 200)

contours, _ = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 在副本上绘制轮廓
cv2.drawContours(image_with_contours, contours, -1, (0, 255, 0), 3)
# 可选:显示带轮廓的图像
cv2.imshow('Contours', image_with_contours)
cv2.waitKey(0)

for contour in contours:
    approx = cv2.approxPolyDP(contour, 0.02 * cv2.arcLength(contour, True), True)
    
    if len(approx) == 4:
        x, y, w, h = cv2.boundingRect(approx)
        
        aspectratio = w / float(h)
        # 改用轮廓实际面积更准确
        contour_area = cv2.contourArea(contour)
        
        if 2 < aspectratio < 5 and contour_area > 2000:
            # 使用原始图像裁剪,避免绿色边框
            cropped = image[y:y+h, x:x+w]
            cv2.imwrite('cropped_plate.png', cropped)

代码优化建议

  1. 路径处理规范化:使用os.path模块处理文件路径,避免跨平台路径错误:
import os
image_path = os.path.join('home', 'folder', 'car.jpg')
  1. 减少噪声干扰:在Canny边缘检测前添加高斯模糊,提升轮廓检测准确性:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 添加高斯模糊
blur = cv2.GaussianBlur(gray, (5, 5), 0)
canny = cv2.Canny(blur, 100, 200)
  1. 变量命名更清晰:避免重复使用image变量,将路径和图像对象分开,提升代码可读性。

  2. 轮廓过滤更精准:使用cv2.contourArea()计算轮廓实际面积,替代 bounding rect 的面积,减少误判。

  3. 避免重复保存:如果存在多个符合条件的轮廓,可以添加判断只保存面积最大的那个(通常车牌是较大的矩形):

max_area = 0
best_crop = None
for contour in contours:
    # ... 省略前面的代码
    if 2 < aspectratio < 5 and contour_area > 2000 and contour_area > max_area:
        max_area = contour_area
        best_crop = image[y:y+h, x:x+w]
if best_crop is not None:
    cv2.imwrite('best_cropped_plate.png', best_crop)

内容的提问来源于stack exchange,提问作者Conor Cullen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:30:58