如何用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
相关产品推荐
相关产品推荐

