老照片修复中划痕检测与纹理合成的配合
先用顶帽、黑帽变换找出细长划痕
老照片修复不应直接把疑似划痕涂掉,而要先生成范围可控的掩膜,再由修复算法重建缺失内容。下面这套流程以 OpenCV 为例:用形态学操作检测亮、暗划痕,用连通域筛选误检,最后按区域选择修复方法。
顶帽变换是原图减去开运算结果,适合增强比周围更亮的细线;黑帽变换是闭运算结果减去原图,适合增强比周围更暗的细线。两者都依赖结构元素的尺寸:结构元素太小,划痕响应弱;太大,则可能把人物轮廓或背景明暗变化一起增强。
- 方向明确的水平、垂直划痕:先试 5×1、1×5 结构元素。
- 方向变化较多的划痕:先试 9×3 椭圆或矩形结构元素,再根据误检情况调整。
- 颗粒噪声明显的扫描图:在检测前使用 3×3 或 5×5 高斯滤波,但不要反复模糊,否则细划痕和文字边缘都会变弱。
可按以下顺序建立第一版候选掩膜:
- 用
cv2.cvtColor将彩色图转换为灰度图,再进行一次 3×3 或 5×5 高斯滤波。 - 用
cv2.morphologyEx分别计算顶帽和黑帽结果,得到亮划痕、暗划痕两张响应图。 - 背景均匀时先测试固定阈值;背景有渐变或局部阴影时,改用自适应阈值。
- 用开运算去除孤立亮点,用闭运算连接被噪声打断的细线。
- 调用
cv2.connectedComponentsWithStats,按面积、宽度、长宽比和主方向筛选候选区域。
连通域可以从“面积大于 10 像素、长宽比大于 5”开始测试,但这只是初始筛选,不是通用标准。600 dpi 与 1200 dpi 扫描会让同一条实体划痕对应不同的像素宽度;更稳妥的做法是先在 100% 比例查看 3~5 条真实划痕,再按它们的像素尺寸调整阈值。人物轮廓、文字笔画和照片边框若呈现连续直线,应结合局部对比度与方向一致性排除,而不能只看长宽比。
把检测结果分成三版,控制掩膜膨胀范围
阈值分割得到的白色区域只是候选结果,不等于最终要交给修复算法的区域。掩膜太窄会留下划痕边缘,太宽则会吞掉人物轮廓、文字和背景纹理。
- 原始掩膜:保存阈值分割和连通域筛选后的结果,用于回溯误检。
- 修复掩膜:对原始掩膜做适度闭运算和膨胀,覆盖划痕边缘。
- 人工修订版:在局部编辑工具中擦除人物、文字等误检,并补画漏检区域。
调参可以遵循“结构元素—阈值—形态学连接—掩膜膨胀”的顺序。每次只改一个因素,并在同一块 100% 局部区域比较结果。膨胀半径应从 1 个像素开始试;如果修复后仍有亮边或暗边,再增加到 2 个像素。对于宽度明显大于 2 像素的划痕,膨胀量应以覆盖实际边缘为准,不能机械套用这个数值。
可把照片分为背景、人物、文字和边框四类区域。背景允许使用稍宽的掩膜;人物轮廓和文字附近应缩小掩膜,或直接人工修订。折痕与划痕重叠时,自动检测通常难以区分两者,保留人工编辑步骤比继续提高阈值更可靠。
小划痕用 inpaint,大缺损再用补丁纹理
纹理合成是从缺损周边寻找相近的颜色、亮度和纹理,再填回掩膜区域。它不是简单取邻域平均值,因此掩膜边界、纹理方向和附近是否存在可参考内容都会影响结果。
对细窄、局部的划痕,可先使用 OpenCV 的 cv2.inpaint。该函数提供 Telea 和 Navier-Stokes 两种方法:
- Telea:适合小面积、细线状缺损,可作为第一组基线结果。
- Navier-Stokes:更强调沿边缘方向扩散,适合需要维持局部轮廓连续性的区域。
- 基于补丁的纹理合成:适合墙面、布料、木纹等具有重复纹理的较大缺损,但效果取决于补丁搜索范围和匹配策略。
cv2.inpaint 的修复半径可以从 2~5 像素开始,分别比较 Telea 与 Navier-Stokes。划痕宽度接近 1~2 像素时,优先测试较小半径;如果掩膜宽度达到数个像素,才逐步增加半径。半径过大容易抹平皮肤、织物和文字细节,修复后应放大到 100% 检查边缘,而不是只看缩略图。
处理顺序建议分两步:先修复背景中的细线,再单独处理人物轮廓和文字区域。对于脸部、衣领、建筑边线等结构,应缩小掩膜或人工补画;一次性对整张照片进行扩散修复,可能把原本被划痕打断的边缘错误延伸出去。
按四类区域验收,并保留可回退版本
修复完成后,把背景、人物、文字和边框分区检查。每个区域都应以 100% 显示比例查看,缩略图只能判断整体色调,无法发现重复颗粒、模糊光晕和细小残线。
- 背景:检查是否出现周期性重复的颗粒、墙面或布纹。
- 人物:检查轮廓、五官和衣领边缘是否被膨胀掩膜抹宽。
- 文字:检查笔画是否断裂、变粗或被错误延伸。
- 边框:检查直线是否弯曲,以及修复区是否出现亮度断层。
应同时保存原图、原始掩膜、修复掩膜、人工修订版和最终输出,最好使用 PNG 或 TIFF 保存中间结果,避免反复 JPEG 压缩引入新的块状伪影。若存在可靠的无损参考图,可计算 PSNR 与 SSIM;没有参考图时,这两个指标不能单独证明修复正确,仍需人工检查。
一套可直接执行的最小方案是:3×3 高斯滤波;分别用 5×1、1×5 结构元素计算顶帽和黑帽;以面积大于 10 像素、长宽比大于 5 做第一轮筛选;掩膜从 1 像素膨胀开始;用 2~5 像素修复半径比较 Telea 与 Navier-Stokes。具体结果仍取决于扫描分辨率、划痕宽度、背景纹理和软件版本,不能把这组参数当成所有照片的固定答案。
颜色量化中八叉树算法如何压缩调色板
从真彩色像素建立八叉树 八叉树量化解决的是“颜色种类太多”的问题:它把真彩色图像中的大量 RGB 颜色压缩成不超过 256 个代表色。这个过程不是直接压缩 PNG、JPEG 或 SVG 文件,而是先减少颜色集合,再把每个像素映射到调色板中
K-Means聚类在图片主色提取中的实现
说明主色提取要解决的实际问题 图片主色提取的目标,是从一张图的像素中找出 3~8 个代表颜色,生成可用于配色、设计参考或图片取色工具的主色板。输出不应只有几个色块,还应包含每种颜色的 HEX、RGB、像素占比,以及明确的排序依据。 直接按
抠图算法中三分图与Alpha估计的关系
Trimap 只缩小搜索范围,不直接生成透明度 Trimap(三分图)是一张给抠图算法的约束图:它把像素分为确定前景、确定背景和未知区。算法固定前两类像素的 Alpha 值,只在未知区估计连续的 Alpha matte,因此 Trimap
加权平均法实现彩色转黑白的亮度公式
从 RGB 数值映射到灰度亮度 把彩色图片转成黑白,核心不是把红、绿、蓝三个数直接相加后平均,而是按照人眼对不同颜色的敏感程度分配权重。常用的 BT.601/Rec.601 亮度近似公式是: Y = 0.299R + 0.587G +
双线性插值如何决定图片缩放后的清晰度
先分清三种插值各自改了什么 图片缩放时,目标图像的像素网格通常无法与原图一一对齐,程序必须估算目标像素应该是什么颜色。这个过程叫插值:可以把它理解成“查看目标位置附近的原图像素,再按距离分配它们的影响力”。 最近邻插值通常只读取 1 个邻