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

如何用Python基于DBR返回的4元组定位点高亮图片条形码

问题

使用DBR解码图片中的条形码时,会返回一个包含4个二元组的定位点列表(示例:[(108, 136), (200, 136), (204, 154), (107, 154)])。现有基于PIL的highlight_area函数可实现区域高亮,但该函数要求传入(left, upper, right, lower)格式的4数值区域参数,而非DBR返回的元组列表。需要实现自动将DBR定位点转换为符合要求的参数,替代手动硬编码。

解决方案

DBR返回的4个点是条形码矩形的四个顶点,只需提取所有点的极值坐标即可生成目标参数:

  • 所有点X坐标的最小值 → left
  • 所有点Y坐标的最小值 → upper
  • 所有点X坐标的最大值 → right
  • 所有点Y坐标的最大值 → lower

可以通过zip(*points)快速分离X、Y坐标集合,再用min()和max()计算极值。

完整代码实现
from PIL import Image, ImageColor, ImageDraw, ImageEnhance

def highlight_area(img, region, factor, outline_color=None, outline_width=1):
    """ 高亮图片指定矩形区域,可添加自定义边框,返回处理后的图片副本 """
    img = img.copy()  # 避免修改原始图片
    img_crop = img.crop(region)

    # 增强裁剪区域亮度实现高亮
    brightner = ImageEnhance.Brightness(img_crop)
    img_crop = brightner.enhance(factor)

    img.paste(img_crop, region)

    # 绘制区域边框(可选)
    if outline_color:
        draw = ImageDraw.Draw(img)
        left, upper, right, lower = region
        # 定义边框坐标点(闭合矩形)
        coords = [(left, upper), (right, upper), (right, lower), (left, lower), (left, upper)]
        draw.line(coords, fill=outline_color, width=outline_width)

    return img

# 模拟DBR返回的条形码定位点(实际使用时替换为DBR的真实返回值)
dbr_barcode_points = [(108, 136), (200, 136), (204, 154), (107, 154)]

# 将定位点转换为highlight_area所需的区域参数
xs, ys = zip(*dbr_barcode_points)
barcode_region = (min(xs), min(ys), max(xs), max(ys))

# 加载图片并执行高亮
img = Image.open('C:/Users/username/test/product1.jpg')
red_border = ImageColor.getrgb('red')
highlighted_img = highlight_area(img, barcode_region, 2.5, outline_color=red_border, outline_width=2)

highlighted_img.show()
# 可选保存处理后的图片
# highlighted_img.save('barcode_highlighted.jpg')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:01:00