购物团截图自动马赛克地址,手机号码
订单截图隐私信息自动脱敏工具一、工具概述本工具是基于 Python OCR 技术开发的电商订单截图隐私自动脱敏工具针对淘宝、京东、拼多多等主流电商平台订单截图自动识别并对收货地址、手机号码等敏感信息进行马赛克打码实现隐私保护。工具支持单张截图、横向多图拼接、竖向长截图等多种格式自动分区识别、精准定位打码区域全程无需人工干预。二、核心功能1. 图片加载与识别支持从网络 URL 批量加载订单截图自动识别图片尺寸与截图比例对横向拼接截图自动分区避免左右区域文字混淆2. OCR 文字识别与排版还原使用 Tesseract OCR 识别中文、数字、字母按文字坐标自动分行、分列还原截图排版结构根据字符间距智能判断是否添加空格提升文本可读性3. 隐私信息智能识别1手机号码识别识别 11 位国内手机号兼容含*/x等脱敏格式号码自动过滤订单号、快递单号、金额等干扰数字2收货地址识别识别包含省、市、区、街道、路、小区、楼栋、单元、门牌号的完整地址支持单行地址、多行连续地址自动清洗特殊符号、乱码、空格等干扰内容采用关键词匹配 地理库解析双重校验降低误判率3干扰信息自动过滤自动过滤订单关键词订单、实付、运费、物流、合计、时间、商家等自动过滤店铺名称旗舰店、专营店、工厂店、商城等避免误打码4. 自动马赛克打码对识别出的手机号区域自动打码对识别出的收货地址区域自动打码打码区域自动外扩留白确保隐私完全覆盖横向多图分区精准打码不跨区、不错位5. 批量处理与结果输出支持批量 URL 列表自动处理处理结果自动保存至output目录控制台实时输出识别日志与打码区域处理完成后自动预览结果图片三、适用场景电商订单截图隐私脱敏订单截图分享前隐私保护订单截图批量归档与数据安全处理横向/竖向拼接订单截图自动脱敏淘宝、京东、拼多多、抖音电商等多平台订单统一处理四、处理流程加载网络图片图片尺寸与分区判断OCR 文字识别与坐标提取文本分行、间距处理手机号码识别收货地址识别与过滤对应区域自动马赛克打码结果图片保存与预览五、运行环境Python 3.8 及以上依赖库opencv-python、numpy、pytesseract、pillow、requests、jionlp需安装 Tesseract-OCR 并配置中文语言包六、工具特点全自动处理无需框选、无需配置一键批量运行高识别准确率双重地址识别规则降低误判、漏判多格式兼容支持单张、横向 2~4 张拼接、竖向长截图精准打码基于文字坐标区域打码不跨区、不漏覆盖本地安全所有识别与打码在本地完成不上传任何数据易部署使用代码结构清晰可直接集成到业务系统#!/usr/bin/env python#-*- coding: utf-8 -*-# vim:fencutf-8# author tlwlmy# version 2026-04-07importcv2importnumpy as npimportpytesseractimportreimportrequests from ioimportBytesIO from PILimportImage from collectionsimportdefaultdictimportosimportjionlp as jio# 配置 OCR_LANGchi_simPHONE_REGEXre.compile(r(?!\d)(?:1[3-9]\d{8,9}|.*?[*x]{4,}.*?)(?!\d))NAME_REGEXre.compile(r^\s*[\u4e00-\u9fa5]{2,4}\s*$)EXCLUDE_NAMES{收货人,收件人,姓名,收货,地址,订单,买家,卖家}# 安全马赛克 def mosaic_region(img, y, line_h, x1, x2): h, wimg.shape[:2]padding8y1max(0, y - padding)y2min(h, y line_h padding)roiimg[y1:y2, x1:x2]ifroi.size0:returnimg block16smallcv2.resize(roi,(block, block),interpolationcv2.INTER_NEAREST)mosaiccv2.resize(small,(x2-x1, y2-y1),interpolationcv2.INTER_NEAREST)img[y1:y2, x1:x2]mosaicreturnimg def is_valid_address(address: str)-bool: addraddress.strip()ORDER_KEYWORDS{订单,买家,卖家,商家,实付,运费,快递,物流,发货,售后,合计,小计,支付宝,交易,时间}forkwinORDER_KEYWORDS:ifkwinaddress:returnFalse# 过滤掉店面SHOP_PATTERNre.compile(r.*(?:旗舰店|专营店|专卖店|直营店|官方店|生活馆|精品店|百货店|好物店|优品店|严选|商城|超市|铺|小店|工厂店|源头厂|厂家直供|多多|包邮特卖|土特产|批发店|秒杀店|女装店|男装店|美妆店|母婴店|零食店|数码店|家纺店|车品店|文具店|家电店|宠物用品店).*$, re.IGNORECASE)ifbool(SHOP_PATTERN.fullmatch(address.strip())):returnFalse# 终极正则# 1. 正向预查必须包含至少一个地址特征关键字过滤普通文本# 2. 开头必须是2个以上中文地址都是中文地名开头# 3. 后续允许中文、数字、字母、空格、横杠、括号等常见地址符号# 按空格分割每一段单独匹配partsaddr.split()patternr^.*[\u4e00-\u9fa5\dA-Za-z](省|市|区|县|镇|乡|街道|路|街|巷|弄|里|大道|号楼|单元|室|层|苑|花园|小区|公寓|栋|座|坊|邨|村|社区|组).*$forpartinparts: partre.sub(r[^\u4e00-\u9fa5a-zA-Z0-9],, part)iflen(part)6:continueifre.fullmatch(pattern, part, re.IGNORECASE):returnTruereturnFalse# 地址匹配 def is_address_line(line_text): textline_text.strip().replace( ,).replace((,).replace(),)textre.sub(r\d,, text)iflen(text)4:returnFalse ORDER_KEYWORDS{订单,买家,卖家,商家,实付,运费,快递,物流,发货,售后,合计,小计,支付宝,交易,时间}forkwinORDER_KEYWORDS:ifkwintext:returnFalse try: resjio.parse_location(line_text)has_provinceres.get(province)is not None has_cityres.get(city)is not None has_countyres.get(county)is not None has_townres.get(town)is not None has_villageres.get(village)is not Nonereturnany([has_province, has_city, has_county, has_town, has_village])except:returnFalse# OCR行合并返回 文本 y h 子图x1x2 def group_ocr_by_line(data, full_w, full_h,line_height_threshold20): aspectfull_w / full_h sub_regions[]# 计算横向截图的每个子图区域ifaspect0.9:ifaspect0.9: n1elifaspect1.4: n2elifaspect1.95: n3else: n4pwfull_w // nforiinrange(n): x1i * pw x2x1 pw sub_regions.append((x1,x2))else: sub_regions[(0, full_w)]groupdefaultdict(lambda: defaultdict(list))line_posdict()fori, wordinenumerate(data[text]): wordword.strip()ifnot word:continuexdata[left][i]ydata[top][i]hdata[height][i]wdata[width][i]# 行分组lyNoneforcyinline_pos:ifabs(y - cy)line_height_threshold: lycybreakifly is None: lyy line_pos[ly](y, h)# 子图分组sub_idx0foridx,(sx1, sx2)inenumerate(sub_regions):ifsx1xsx2: sub_idxidxbreakgroup[ly][sub_idx].append((x,w,word))# group[ly][sub_idx].append(word)# 返回文本, y, h, x1, x2# res []# for y in sorted(group):# y_pos, h_pos line_pos[y]# sub_dict group[y]# for idx in sorted(sub_dict):# line_text .join(sub_dict[idx])# x1, x2 sub_regions[idx]# res.append((line_text, y_pos, h_pos, x1, x2))# 返回文本, y, h, x1, x2res[]foryinsorted(group): y_pos, h_posline_pos[y]sub_dictgroup[y]sorted_indicessorted(sub_dict)# 按x坐标排序foridxinsorted_indices: wordssorted(sub_dict[idx],keylambda v: v[0])line_textprev_x2None# 上一个字符的右坐标forx, w, wordinwords: current_x1, current_x2sub_regions[idx]ifprev_x2 is not None: gapx - prev_x2# 两个字符之间的空白# 间隔 ≥ 3个字符宽度 → 加1个空格line_text *(gap * len(word)//(w *2))line_textword prev_x2x w x1, x2sub_regions[idx]res.append((line_text,y_pos,h_pos,x1,x2))returnres# 处理单张图片 def process_one(img_url, save_path): resprequests.get(img_url,timeout20)imgcv2.imdecode(np.frombuffer(resp.content, np.uint8), cv2.IMREAD_COLOR)resultimg.copy()H, Wimg.shape[:2]print(f尺寸{W}x{H})pilcv2.cvtColor(img, cv2.COLOR_BGR2RGB)datapytesseract.image_to_data(pil,langOCR_LANG,output_typepytesseract.Output.DICT)# 直接返回带 x1 x2 的结果linesgroup_ocr_by_line(data, W, H)foridx,(text, y, h, x1_region, x2_region)inenumerate(lines): ttext.strip()# print(f区域[{x1_region}-{x2_region}] {t})ifPHONE_REGEX.search(t): mosaic_region(result, y -10, h 20, x1_region, x2_region)ifidx0: py, phlines[idx-1][1], lines[idx-1][2]px1, px2lines[idx-1][3], lines[idx-1][4]mosaic_region(result, py, ph, px1, px2)print(f区域[{x1_region}-{x2_region}] {t})print(f 手机号 → 打码)elifis_address_line(t)or is_valid_address(t): mosaic_region(result, y -10, h 20, x1_region, x2_region)print(f区域[{x1_region}-{x2_region}] {t})print(f 地址 → 打码)cv2.imwrite(save_path, result)returnresult# 批量处理 if__name____main__:IMAGE_URLS[# 单张xxx,# 横向2张xxx,# 竖向2张xxx]os.makedirs(output,exist_okTrue)fori, urlinenumerate(IMAGE_URLS): print(f\n 处理第 {i1} 张 )savefoutput/result_{i1:02d}.pngout_imgprocess_one(url, save)cv2.imshow(f结果 {i1}, out_img)cv2.waitKey(1)cv2.destroyAllWindows()print(\n✅ 全部处理完成已保存到 output 文件夹)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2500113.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!