feat(posts): adopt consultant rulings on decoupled slug, decoding contracts, and pillow laplacian filter
This commit is contained in:
1 parent
0e31199510
commit
c49c4ff725
8 files changed
+249
-94
No files matched your search
@@ -149,8 +149,50 @@ def generate_cover(slug, topic_metaphor):
|
||||
|
||||
如果批处理流水线对生成结果不做验收,依然会有缺陷图片漏网。我在入库阶段加入了基于 Python Pillow 的**顶部留白区域净度审计**,并引入了 10% 的工程容差缓冲带:
|
||||
|
||||
1. **45% 留白目标与 35% 审计红线的容差缓冲**:虽然 Prompt 明确要求模型在顶部预留 45% 的负空间,但扩散模型在构图交界处往往存在渐变溢出。因此,自动化审计将核心红线设定在**顶部 35%** 的绝对标题选区内,给予模型 10% 的过渡缓冲带。脚本扫描该选区内的平均亮度和边缘方差,若检测到密集高频杂纹或亮度超标,立即判定“构图过满”,自动废弃并换用新随机种子重新生成。
|
||||
2. **规范化转码**:统一缩放至 Open Graph 标准的 `1200×630` 规格,输出为 85% 质量等级的现代 WebP 格式,严格确保单张体积控制在 100KB 以内。
|
||||
1. **45% 留白目标与 35% 审计红线的容差缓冲**:虽然 Prompt 明确要求模型在顶部预留 45% 的负空间,但扩散模型在构图交界处往往存在渐变溢出。因此,自动化审计将核心红线设定在**顶部 35%** 的绝对标题选区内,给予模型 10% 的过渡缓冲带。
|
||||
2. **平均亮度与拉普拉斯边缘方差双重门禁**:单纯检查平均亮度存在严重盲区——暗色背景上的高对比度青色线框或乱码文字同样具备极低的平均亮度,却会彻底摧毁大标题的可读性。为了避免引入 OpenCV 等重型依赖,审计脚本直接利用纯 Pillow 内置的 3×3 拉普拉斯卷积核(`ImageFilter.Kernel`)提取高频边缘图,并计算标准差(`stddev`)进行拦截。
|
||||
3. **规范化转码**:统一缩放至 Open Graph 标准的 `1200×630` 规格,输出为 85% 质量等级的现代 WebP 格式,严格确保单张体积控制在 100KB 以内。
|
||||
|
||||
<details>
|
||||
<summary>点击查看纯 Pillow 留白净度审计算法实现(Python 关键片段)</summary>
|
||||
|
||||
```python
|
||||
from PIL import Image, ImageFilter, ImageStat
|
||||
|
||||
# 提示词要求 45% 留白 -> 核心 35% 严格标题选区(预留 10% 扩散过渡缓冲)
|
||||
SAFE_ZONE_RATIO = 0.35
|
||||
MAX_MEAN_LUMINANCE = 28.0 # 强制收敛至 zinc-950 (#09090b) 暗色基底
|
||||
MAX_LAPLACIAN_STDDEV = 12.0 # 阻断高频线框与伪文字幻觉侵入标题区
|
||||
|
||||
# 3x3 拉普拉斯高通卷积核,用于隔离尖锐边缘与孤立噪点
|
||||
LAPLACIAN_KERNEL = ImageFilter.Kernel(
|
||||
size=(3, 3),
|
||||
kernel=[-1, -1, -1, -1, 8, -1, -1, -1, -1],
|
||||
scale=1,
|
||||
offset=0,
|
||||
)
|
||||
|
||||
def audit_top_negative_space(img_path: str) -> tuple[bool, str]:
|
||||
with Image.open(img_path) as img:
|
||||
w, h = img.size
|
||||
# 裁剪顶部 35% 标题安全区并转为灰度图 (L)
|
||||
top_zone = img.crop((0, 0, w, int(h * SAFE_ZONE_RATIO))).convert("L")
|
||||
|
||||
# 闸门 1: 平均亮度检测(拦截大面积泛光与色块侵蚀)
|
||||
mean_lum = ImageStat.Stat(top_zone).mean[0]
|
||||
if mean_lum > MAX_MEAN_LUMINANCE:
|
||||
return False, f"REJECT_LUMINANCE: 亮度超标 {mean_lum:.1f} > {MAX_MEAN_LUMINANCE}"
|
||||
|
||||
# 闸门 2: 拉普拉斯高频边缘方差检测(拦截暗色背景下的线框与文字幻觉)
|
||||
edge_map = top_zone.filter(LAPLACIAN_KERNEL)
|
||||
edge_std = ImageStat.Stat(edge_map).stddev[0]
|
||||
if edge_std > MAX_LAPLACIAN_STDDEV:
|
||||
return False, f"REJECT_HIGH_FREQ_CLUTTER: 边缘噪点超标 edge_std {edge_std:.1f} > {MAX_LAPLACIAN_STDDEV}"
|
||||
|
||||
return True, f"PASS (lum={mean_lum:.1f}, edge_std={edge_std:.1f})"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user