Files
SignatureSystem/image_test/__pycache__/process.cpython-39.pyc

106 lines
9.9 KiB
Plaintext
Raw Normal View History

2026-07-20 13:16:17 +08:00
a
<00>9Xjm4<00>@s<>dZddlZddlZddlZddlmZddlmZmZdddddddd d
d d d dd<0E> Z ee
<EFBFBD><01> <0B>j Z e dZe dZhd<11>Zd)dd<13>Zd*dd<15>Zdd<17>Zd+dd<19>Zdd<1B>Zdd<1D>Zd,dd<1F>Zd-d d!<21>Zd"d#<23>Zd$d%<25>Zd&d'<27>Zed(kr<>e<1B>dS).uO签名图片处理诊断脚本(独立调试用)。
工作流:
把待测试的图片 (.png / .jpg / .jpeg) 丢到 image_test/input/ 下,
直接双击 run.bat 或 `python image_test/process.py` 即可。
脚本会自动遍历 input/ 下所有图片,每张图都跑完整流水线并把
每一步中间结果存到 image_test/output/<图片名>/ 子目录。
参数调整: 直接改下方 CONFIG 段,不用命令行。
输出结构 (每张图一个子目录):
image_test/output/<stem>/
00_original.png 原图
01_binarized.png 二值化后(仅 is_signature=true 时)
02_white_removed.png 白底转透明后
03_border_cropped.png 透明边框裁剪后
04_scaled.png 按高度等比缩放后
05_noised.png 边缘噪声后
06_rotated.png 旋转后
07_final_cropped.png 紧致裁剪后(最终输出)
final.png 最终输出(等价于插入 Word 的那张)
diagnostics.txt 每步尺寸 / 内容像素占比 / bbox
<EFBFBD>N)<01>Path)<02>Image<67>
ImageChopsTg@<40>`<00><00><><00><><00><><00>all<6C>*) <0A> is_signature<72> height_cm<63> noise_level<65>
rotate_min<EFBFBD>
rotate_max<EFBFBD>dpi<70>alpha_threshold<6C>brightness_threshold<6C>binarize_threshold<6C>white_threshold<6C>stop_at<61>seed<65> clear_output<75>input<75>output>z.jpeg<65>.pngz.jpgcs4|jdkr|<00>d<01>}|<00><02>fdd<03><08>}|<00>d<04>}|S)uG手写签字黑白二值化:>threshold -> 255(白),否则 0(黑)。<>Lcs|<00>kr dSdS<00>N<><4E>r<00><00><01>p<><01> thresholdr<00>image_test/process.py<70><lambda>I<00>zbinarize.<locals>.<lambda><3E>RGBA)<03>mode<64>convert<72>point)<02>imgr#rr"r$<00>binarizeEs



r,c Csz|jdkr|<00>d<01>}|<00><02>}g}|D]F}|\}}}}||krX||krX||krX|<03>d<02>q$|<03>||||f<04>q$|<00>|<03>|S)u'接近白色的像素转为全透明。r')rrrr)r(r)Zgetdata<74>appendZputdata) r+rZdatasZnew_data<74>item<65>r<>g<>b<>arrr$<00>remove_white_backgroundNs

  
r3cCs.|jdkr|<00>d<01>}|<00><02>}|r*|<00>|<01>}|S)u:按 alpha 通道 getbbox 裁掉四周完全透明区域。r')r(r)<00>getbbox<6F>crop)r+<00>bboxrrr$<00>crop_transparent_border^s 


r7c Cs<>zddlm}|j}Wnty.tj}Yn0t||d<00>}|dkrL|S|j\}}|dkrb|S||}tdt||<00><01>} |}
|<00>| |
f|<04>S)u*按目标高度厘米等比缩放。r<00><01>
ResamplinggR<EFBFBD><1E><>Q@<40>) <09> PIL.Imager9ZLANCZOS<4F> ImportErrorr<00>int<6E>size<7A>maxZresize) r+r rr9<00>resampleZtarget_h<5F>w<>hZratioZnew_wZnew_hrrr$<00>scale_by_heighths 
  
rCc Cs|jdkr|<00>d<01>}|j\}}|<00><03>}|d}t|<02>D<00>]<5D>}t|<03>D<00>]<5D>}|||f\}} }
} | dkrhqDd} tdd<06>D]z} tdd<06>D]b}|| ||}}d|kr<>|kr<>nq<>d|kr<>|kr<>nq<>|||fddkr<>d} q<>q<EFBFBD>| rvq<>qv| rDt<05><05>|dkrDt<05>| |<05>}t<05>| |<05>}||}||}d|k<01>rH|krDnqDd|k<01>rb|krDnqDtd td|t<05>d
d <0B><00><02>}td td| t<05>d
d <0B><00><02>}td td|
t<05>d
d <0B><00><02>}td td| t<05>d d <0A><00><02>}|||fddkrD||||f|||f<qDq6|S)u<在笔画边缘添加随机噪点模拟印章不均匀。r'<00>rF<><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tg$@ri<><69><EFBFBD><EFBFBD><EFBFBD>i<><69><EFBFBD><EFBFBD><EFBFBD>
) r(r)r><00>load<61>range<67>random<6F>randint<6E>minr?)r+rrArBZpixelsZ intensity<74>x<>yr/r0r1r2Zis_edgeZdxZdyZnxZnyZoffset_xZoffset_yZnrZngZnbZnarrr$<00>add_edge_noise{sB


04rPcCs`zddlm}|j}Wnty.tj}Yn0||krB||}}t<05>||<02>}|j||ddd<05>S)uH随机角度旋转expand=True 扩展画布以容纳旋转后内容。rr8T)rrrr)r@<00>expandZ fillcolor)r;r9ZBICUBICr<rrKrL<00>rotate)r+rrr9r@Zanglerrr$<00> rotate_image<67>s 
  
 
<02>rSc s<>|jdkr|<00>d<01>}|<00><02>\}}}}t<03>d|||f<03><02>d<03>}|<06><05>fdd<05><08>}|<07><05>fdd<05><08>} t<06>|| <09>}
|
<EFBFBD><08>} | r<>| dd|j d|j dfkr<>|<00>
| <0B>}|| fS) u6末尾紧致裁剪:(alpha > th) AND (亮度 < th)。r'<00>RGBrcs|<00>kr dSdSrrr <00>rrr$r%<00>r&z!crop_to_content.<locals>.<lambda>cs|<00>kr dSdSrrr <00>rrr$r%<00>r&rr:) r(r)<00>splitr<00>merger*r<00>darkerr4r>r5) r+rrr/r0r1r2<00>luma<6D>
alpha_mask<EFBFBD> luma_mask<73>combinedr6r<00>rrr$<00>crop_to_content<6E>s

  
r_cs<>|jdkr|<00>d<01>}|<00><02>\}}}}t<03>d|||f<03><02>d<03>}|<06><05>fdd<05><08>}|<07><05>fdd<05><08>} t<06>|| <09>}
|jd|jdp<>d} |<08> <09>| <09> <09>|
<EFBFBD> <09>} } }|jd t
| dd<00><00>| d t
| dd<00><00>| d t
|dd<00><00>| |
<EFBFBD> <0B>d
<EFBFBD>S) Nr'rTrcs|<00>kr dSdSrrr rUrr$r%<00>r&zcontent_stats.<locals>.<lambda>cs|<00>kr dSdSrrr rVrr$r%<00>r&rr:gY@)r><00> alpha_pct<63>dark_pct<63> content_pctr6) r(r)rWrrXr*rrYr>Z histogram<61>sumr4)r+rrr/r0r1r2rZr[r\r]<00>totalZhaZhlZhcrr^r$<00> content_stats<74>s

 <06>rec
Cs<>|dur(|<04>d|d<02>d|d<04>d<05><05>dS||d<02>d|<02>d<07>}|<03>|<07>t|||<06>}d|d<02>d|d<04>dt|d <00>d
<EFBFBD>d |d d <0A>d|dd <0A>d|dd <0A>d|d<00><00>} |<04>| <09>dS)N<>[Z02dz] Z18sz SKIPPED<45>_rz size=r>Z14sz alpha=r`z5.1fz% dark=raz % content=rbz% bbox=r6)r-<00>savere<00>str)
<EFBFBD>out_dir<69>idx<64>namer+Z
diag_linesZalpha_thZ bright_th<74>path<74>s<>linerrr$<00> save_step<65>s 
 "<08><08><08><06>rpc Cs<>t|<01>}|jddd<02>g}t<02>|<00>}|<03>d|j<05><00><02>|<03>d|j<06>d|j<07><00><04>|<03>d|d<00>d|d <00>d
|d <00>d |d <00>d|d<00>d|d<00><00> <0C>|<03>d|d<00>d|d<00>d|d<00>d|d<00><00><08>|<03>d<1A>t|dd|||d|d<00>|ddkr<>|S|d<00>rt ||dd<1E>}t|dd |d<00>r.|nd||d|d<00>|dd!k<02>rT|St
||dd"<22>}t|d#d$|||d|d<00>|dd%k<02>r<>|St |<04>}t|d&d'|||d|d<00>|dd(k<02>r<>|S|d }|du<01>r<>|dk<04>r<>t |||dd)<29>}t|d*d+|du<01>r|dk<04>r|nd||d|d<00>|dd,k<02>r<|S|d dk<04>rXt ||d <00>}t|d-d.|d dk<04>rr|nd||d|d<00>|dd/k<02>r<>|S|d dk<03>s<>|ddk<03>r<>t||d |d<00>}t|d0d1|d dk<03>s<>|ddk<03>r<>|nd||d|d<00>|dd2k<02>r|St||d|dd3<64>\}}t|d4d5|||d|d<00>t<10><11>}|j|d6d7<64>t|d8d9<64><02>}|<08>|<07><14><00>Wd<00>n1<00>s<>0Y|<03>d<1A>|<03>d:|j<07><00><02>|S);NT<4E><02>parents<74>exist_oku输入: u模式: u
尺寸: u参数: is_sig=r z height_cm=r z noise=rz rotate=[r<00>,rz] dpi=ru阈值: alpha>ru 亮度<ru 二值化>ru 白底>rzP--------------------------------------------------------------------------------rZoriginalrr"r:Z binarizedr,)rrDZ white_removedZ remove_whiterFZborder_croppedZ crop_border)r<00>ZscaledZscale<6C>ZnoisedZnoise<73>ZrotatedrRr^<00>Z final_croppedZPNG)<01>formatz final.png<6E>wbu最终输出: final.png size=)r<00>mkdirr<00>openr-rlr(r>rpr,r3r7rCrPrSr_<00>io<69>BytesIOrh<00>write<74>getvalue) Z
input_pathrjZcfg<66>diagr+rBrgZ final_buf<75>frrr$<00> process_one<6E>s<>
<06><06><06><06><06><06>
  <0C> 
 <0C>  <0C>  <0C>"<0E><0E>"<0E><06>
  <0C>.
r<>c Cs<>t<00><01>stjddd<02>t<03>d<03>dur2t<05>td<00>tdd<05>t<00><08>D<00><01>}|s`t dt<00>d<07><03>dSt<03>d<08>r|t
<EFBFBD><01>r|t <0B> t
<EFBFBD>t
jddd<02>t d t |<00><01>d
d d<05>|D<00><01><00><04>t d t
<EFBFBD>d <0A><03>|D]<5D>}t
|j}t d|j<0F>d<0F><03>zvt||t<03>}|D] }t |<04>q<>t|dddd<13><03> }|<05>d <0A>|<03><01>Wd<00>n1<00>s:0Yt d|<02>d <0A><03>Wq<>t<14>y<>}zt d|<06>d <0A><03>WYd}~q<>d}~00q<>dS)NTrqrcSs&g|]}|j<00><01>tvr|<01><03>r|<01>qSr)<04>suffix<69>lower<65>
IMAGE_EXTS<EFBFBD>is_file<6C><02>.0r!rrr$<00>
<listcomp>=s<16>zmain.<locals>.<listcomp>u未在 u: 下找到 png/jpg 图片请先把测试图片放进去ru找到 u 张图: cSsg|]
}|j<00>qSr)rlr<>rrr$r<>Hr&u输出目录: <20>
u === 处理: z ===zdiagnostics.txtrAzutf-8)<01>encodingu -> 输出: u处理失败: )<15> INPUT_DIR<49>existsr{<00>CONFIG<49>getrKr<00>sorted<65>iterdir<69>print<6E>
OUTPUT_DIR<EFBFBD>shutilZrmtree<65>lenZstemrlr<>r|r<00>join<69> Exception)ZimagesZimg_pathZout_subr<62>ror<><00>errr$<00>main6s2
"
 
0r<><00>__main__)r)r )r)rr)rr)<1D>__doc__r}rKr<><00>pathlibr<00>PILrrr<><00>__file__Zresolve<76>parentZBASE_DIRr<52>r<>r<>r,r3r7rCrPrSr_rerpr<>r<><00>__name__rrrr$<00><module>sH <02>

%

Q#