☰
壁画图像修复实践:损伤掩膜、传统算法与GAN生成式补全
2026/10/11 10:42:52 网站建设 项目流程

简介:这份压缩包围绕壁画图像修复与损伤修复方法,整理了从Python算法脚本、模型配置文件到示例图像的全套学习材料,适合计算机视觉方向学生、文化遗产数字化研究者以及初步接触壁画修复技术的个人学习者。壁画修复通常涉及损伤诊断、数字图像处理、颜料层修复与线条重构等环节,包内代码与示例图正是围绕这些流程展开。资源共41个文件,包含14个py脚本(训练与测试脚本、网络结构、损失函数、评估指标等模块)、PyTorch相关环境配置yml/cfg、10张jpg与3张png示例图、6个zbak备份文件及说明文档,整体大小7.36MB,目录分checkpoints、edge、mask、input等,便于按代码、配置、数据分层查阅。已有180人学习下载。通过学习代码与示例,可以理解壁画破损边缘检测、线条辅助图像复原的训练流程;结合备份文件与README,还能对比不同实验版本,快速定位修改点,用于复现实验或二次开发。

1. 壁画图像修复:先分清“物理伤病”和“信息损失”

拿到一壁高清采集图,看到的不是颜料,而是时间的伤疤:裂缝贯穿菩萨面庞,起甲翘起的碎片在灯光下反白,脱落区域露出灰泥底层。文保现场的物理干预要审批、要温湿度控制、要可逆材料,周期长到以年计算;可数字化归档等不起。壁画图像修复要处理的就是这条更快的路径——在二维图像层面,把裂缝、起甲、剥落和褪色造成的“信息损失”补回来。

这个标题把问题拆成两半:图像修复技术解决“怎么补”,损伤修复方法解决“先识别哪些是真伤、按什么流程补”。两者缺一不可,掩膜错了,再好的 GAN 也只会把原作线条当成裂缝一并抹掉。适合读这篇笔记的人,是做文化遗产数字化、博物馆影像归档的图像算法工程师,或者刚进这个方向的研究生。我的核心结论先放在这:这个项目的瓶颈通常不在修复模型,而在损伤掩膜的质量和数据集构造。

2. 损伤检测先行:把裂缝和剥落区做成修复掩膜的完整流程

2.1 壁画损伤类型与掩膜标注:先把“伤”量化成像素

壁画损伤不像自然影像里的目标检测,类别少但形态差异极大。我一般把标注类型固定在四类:线性裂缝(细长、连续、有走向)、片状剥落(形状不规则、边缘有厚度感)、起甲与颜料缺失(点片状、灰泥底可见)、网状老化开裂(相互交叉的细线簇)。分类越细,后续修复策略越有针对性——线性裂缝适合窄半径扩散修复,片状剥落只有交给生成式模型才能补出底色层次。

标注工具用 LabelMe 或 CVAT 都行,输出格式没有统一标准,最后都要转成单通道掩膜,0 是完好区、255 是待修复区。这里有个常被忽略的技术点:标注时不要只勾裂缝本身,要把裂缝边缘的半脱色过渡带一起包含进去。实际影像里裂缝两侧各 1~2 像素往往已经开始粉化,只标缝心的话,修复完会留一条隐约的浅色残线。

标注完成后,把 JSON 批量转二值掩膜的脚本我放在下面,这是整个流程的起点:

# labelme_json_to_mask.py import json import numpy as np import cv2 import glob def polygons_to_mask(height, width, polygons): mask = np.zeros((height, width), dtype=np.uint8) for poly in polygons: pts = np.array(poly['points'], dtype=np.int32) cv2.fillPoly(mask, [pts], 255) # 每个多边形填充为 255 return mask for json_path in glob.glob('labels/*.json'): with open(json_path, encoding='utf-8') as f: data = json.load(f) h, w = data['imageHeight'], data['imageWidth'] polys = [s for s in data['shapes'] if s['label'] in ('crack', 'flaking', 'loss')] mask = polygons_to_mask(h, w, polys) base = json_path.split('/')[-1].replace('.json', '') cv2.imwrite(f'masks/{base}_mask.png', mask)

逻辑说明:代码读取 LabelMe 导出的 JSON,imageHeight和imageWidth是原图尺寸,shapes里存放标注多边形。fillPoly是核心操作,把所有属于损伤类的多边形在掩膜上涂白。参数说明:如果掩膜和原图分辨率不一致,要么在fillPoly前用pts * (h / data['imageHeight'])做缩放,要么直接统一用原图分辨率保存,避免后续训练时掩膜错位。

2.2 训练轻量分割模型:数据增强、损失与训练命令

壁画影像背景相对纯净,场景类别少,不需要一上来就上几十亿参数的骨干。我用 U-Net 结构或者 YOLOv8-seg 都能跑出可用的掩膜,区别在于 U-Net 更容易控制训练细节,YOLOv8-seg 适合快速起步、自带数据增强和部署链路。我的习惯是先拿 YOLOv8-seg 做一个 2~3 天的基线,确认标注质量没问题后再决定要不要换 U-Net 精调。

数据增强不能照搬 COCO 的通用配置。壁画的特点是:拍摄角度基本固定、光照受现场环境光影响、纹理以笔触和底色为主、裂缝是细长结构。随机裁剪和旋转保留,水平翻转可以开,但马赛克增强建议关掉——它会拼出跨场景的纹理交界,把裂缝走向搞乱。下面这段增强配置是用 albumentations 写的:

# augment.py import albumentations as A train_transform = A.Compose([ A.RandomCrop(512, 512, p=1.0), A.Rotate(limit=15, p=0.5, border_mode=0), A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(brightness_limit=0.15, contrast_limit=0.15, p=0.6), A.GaussNoise(var_limit=(10, 30), p=0.3), A.ElasticTransform(alpha=1.0, sigma=10, p=0.2), # 模拟壁画表面起伏,但别开太大 ])

逻辑说明:RandomCrop固定到 512×512,既能进显存又能保证裂缝在局部有小尺寸上下文。Rotate的border_mode=0是让旋转后露出的黑色区域最终被裁掉,不要用反射填充,否则会引入伪纹理。ElasticTransform开小一点,用来模拟壁画表面轻微起伏;它同时作用于图像和掩膜,所以掩膜的裂缝也会跟着弯曲,这正好让模型学会应对不平整表面。

训练命令以 YOLOv8-seg 为例,单卡 24 GB 显存可以跑 512 输入:

yolo segment train \ data=wallpainting.yaml \ model=yolov8s-seg.pt \ epochs=120 \ imgsz=512 \ batch=16 \ patience=20 \ amp=True

参数说明:patience=20是早停容忍度,壁画数据类别不均衡,后期指标波动大,早停太严格会把刚收敛的模型断掉。amp=True是混合精度,能省将近一半显存,但对裂缝这种细线结构,我建议第一个 epoch 关掉 amp 跑一次,确认 loss 能正常下降再开。batch=16是一次送入的图片数,如果只有 12 GB 显存,改成 8 并同步把imgsz降到 384。

2.3 掩膜后处理:膨胀、连通域筛选与人工复核

模型输出的掩膜是概率图,直接二值化阈值到 128 还不够。裂缝掩膜普遍存在两个毛病:细裂缝中间断裂、边缘比实际损伤窄一圈。我固定走三步:第一步用 3×3 核做一次形态学膨胀;第二步按连通域过滤掉面积小于 20 像素的噪声点,这些基本都是颜料斑点被误判;第三步做掩膜与原图的叠加预览,随机抽 20 张图人工过一遍。

# postprocess_mask.py import cv2 import numpy as np def refine_mask(prob_mask, min_area=20, dilate_iter=1): _, mask = cv2.threshold(prob_mask, 128, 255, cv2.THRESH_BINARY) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) mask = cv2.dilate(mask, kernel, iterations=dilate_iter) num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask) refined = np.zeros_like(mask) for i in range(1, num_labels): if stats[i, cv2.CC_STAT_AREA] >= min_area: refined[labels == i] = 255 return refined

逻辑说明:connectedComponentsWithStats返回每个连通域的面积统计,过滤条件放在min_area=20,只保留面积达标的裂缝块。dilate_iter=1是膨胀一圈,让掩膜覆盖裂缝边缘的过渡带。参数调法:密集网状裂缝比单一长裂缝更容易断裂,遇到网状裂缝把dilate_iter提高到 2~3,但不要超过 3,否则修复区域会侵染周围的完好笔触。

这里提醒一句:掩膜是修复模型的上游输入,它的质量直接影响最终效果。我在项目里把掩膜预览当成和模型指标同等级别的验收项,每轮训练前都抽人眼复核,而不是只看 mIoU。

3. 传统图像修复算法:用 OpenCV 把最小可用流程跑通

3.1 cv2.inpaint 的两种算子:INPAINT_TELEA 与 INPAINT_NS

传统图像修复的思路不是“生成”,而是“扩散”——把待修复区域边界上的颜色和梯度信息向内部推进。OpenCV 里封装了两种最常用的算子:INPAINT_TELEA和INPAINT_NS。TELEA 基于快速行进法,算法从掩膜边界开始,逐层向内部推进,每走一步根据已知像素的距离和方向加权估算新像素值,计算快、对细裂缝效果好。NS 基于偏微分方程,核心是保持等照度线穿过修复区域,让结构线(比如衣纹、脸廓)延续得更自然。

两种算子没有绝对的优劣,我选择的标准是看修复区域细长还是块状。线性裂缝用 TELEA,单张 6000 万像素的壁画局部,修几百条细裂缝在 CPU 上也就是秒级。片状剥落和斑驳缺失用 NS 效果更稳,因为它会尽量维持边缘结构,不会把补丁填成一片糊。代价是 NS 的迭代收敛慢、参数敏感,调不好会出现明显的涂抹痕。

参数上真正要调的是radius,它代表每个目标像素参考邻域的搜索半径。小裂缝取 3,普通剥落取 5~10;半径过大,参考范围会把不相关的纹理拉进来,修复区变糊;半径过小,边界信息不够,裂缝中间会残留暗线。遇到大面积缺失时,无论把 radius 调到多大都无法凭空造出纹理,这时候就要认清传统算法的边界,转到下面的深度方案。

3.2 裂纹修复实战:掩膜先膨胀,修复后残留线才不“复活”

最小可用的修复流程只需要三步:读原图、读掩膜、调用cv2.inpaint。但直接跑完会发现裂缝处留下了半透明的灰白色线——这是掩膜太窄导致的。裂缝边缘的颜色是渐变的,标注和分割得到的掩膜往往只覆盖了裂缝最暗的核心,两侧的半粉化地带没有被列入修复区,扩散算法只会计算掩膜内部的像素,外部残线就被留在原样。

# basic_inpaint.py import cv2 import numpy as np image = cv2.imread('wall_detail.png') raw_mask = cv2.imread('mask_crack.png', cv2.IMREAD_GRAYSCALE) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) mask = cv2.dilate(raw_mask, kernel, iterations=2) # 膨胀 2 圈,覆盖过渡带 result_telea = cv2.inpaint(image, mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA) result_ns = cv2.inpaint(image, mask, inpaintRadius=5, flags=cv2.INPAINT_NS) cv2.imwrite('result_telea.png', result_telea) cv2.imwrite('result_ns.png', result_ns)

逻辑说明:mask是单通道灰度图,0 表示完好、非 0 表示待修复,inpaint函数内部自动把非零像素当作掩膜区域。inpaintRadius在 TELEA 里控制邻域采样距离,在 NS 里控制扩散强度,通常先给 3 或 5,对比两版输出。参数说明:膨胀迭代次数不是越多越好,我见过把iterations调到 5、把壁画衣纹细节一并抹掉的情况。膨胀 2 圈覆盖过渡带即可,如果修复后仍看到残线,优先检查掩膜是否漏标,而不是继续加膨胀。

这里有两条并行验证的建议:输出图叠回原图,透明度 0.6 对比看边界过渡;单看裂缝走向是不是沿着原有笔触延续。传统方法对线性损伤非常可靠,但它不会创造新纹理,只能基于边界做缝合。这也是它在我项目里始终占有一席之地的原因——可解释、无幻觉、不引入原图没有的颜色。

3.3 PatchMatch 和整体变分:大面积缺失时传统方法还剩多少用武之地

TELEA 和 NS 都只能处理掩膜相对较小的病灶,一般以 5~30 像素宽为界限。遇到巴掌大的整块剥落,扩散信息不足以支撑全部内部像素,填出来的区域会变成一片平均色,肉眼可见地“糊”。这时就该上 PatchMatch 这类基于样例的方法:在已知区域搜索与边界最相似的图像块,用它们来拼接内部纹理。听起来很合理,但壁画不是纯重复纹理——每一笔都是手工的,PatchMatch 的相似块搜索很容易在补丁边缘产生接缝,或者把背景重复图案错当成笔触细节。

我在实际项目里对 PatchMatch 的定位是“复杂纹理区域的半自动引导”:先用它生成一个粗糙的填充结果,再叠加 NS 做边缘混合,填好后人工判断有没有明显的纹理错位。整体变分(Total Variation)方法则适合损伤区域内部本身是平滑过渡的壁画——比如大面积天空底色剥落,修复目标是保持颜色连续性,变分约束下的插值比直接均值填充干净得多。

# patchmatch_hybrid.py # 示意:先用 PatchMatch 粗恢复,再用 NS 混合边缘 import cv2 img = cv2.imread('wall_spall.png') mask = cv2.imread('mask_spall.png', cv2.IMREAD_GRAYSCALE) coarse = cv2.inpaint(img, mask, inpaintRadius=10, flags=cv2.INPAINT_NS) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)) blend_mask = cv2.GaussianBlur(mask.astype(np.float32), (0, 0), 5) result = (img.astype(np.float32) * (1 - blend_mask[..., None] / 255.0) + coarse.astype(np.float32) * (blend_mask[..., None] / 255.0)) cv2.imwrite('result_hybrid.png', result.astype(np.uint8))

逻辑说明:代码先用 NS 把大片剥落区粗填,再用高斯模糊后的掩膜作为软混合权重,让修复区域的边缘逐渐过渡到原图,避免硬边界。参数说明:blend_mask的标准差 5 是经验值,面积越大的缺失,过渡带宽要越大;标准差小时混合区窄,接缝明显,标准差大时原图信息会渗入修复区。

传统方法的价值边界很清楚:裂缝、小剥落、条状起甲,它们是首选;超过 50×50 像素的块状缺失、以及需要重新补画人物五官结构的部位,必须切到 GAN 路线。在项目早期,用传统方法先把占总数 70% 的小损伤处理掉,能大幅缩减深度模型的训练和推理压力。

4. 深度生成式修复:GAN 图像修复如何补出大块缺失的笔触

4.1 从“扩散”到“生成”:GAN 修复为什么能填出笔触

传统方法的所有局限都来自同一个本质:它只能利用边界已有信息做延展,不能“理解”壁画里菩萨衣纹的结构、底色和笔触节奏。GAN 图像修复改变了这一点。生成器接受的是整张图加掩膜,它的中间层会形成对场景语义的压缩表达——知道被挡住的区域大概率是衣纹还是背景底色,然后生成一个在语义上合理的补全结果。

常见的生成器结构是编码器-解码器加注意力模块,输入把原图和掩膜拼成四通道:RGB 加单通道 mask。关键在卷积的设计,普通卷积会把掩膜外的有效像素和掩膜内的无效像素混在一起算,导致边界区域出现颜色渗透。解决思路是用 gated convolution 或 partial convolution,让网络自己学习每个位置该信任哪些输入像素。部分实现会在瓶颈层加注意力机制,让生成区域从周围已知区域采样参考特征。

训练方式多数是自监督:拿没有损伤的高清壁画图,在随机位置生成模拟损伤掩膜,把可见部分当输入、完整图当监督目标。掩膜的形状不能只用矩形,我会混入线状、网状和不规则斑块来贴近真实损伤。只要掩膜种类够多,模型才能学到“这一块是裂缝、那一块是剥落”的区别。对大面积缺失来说,GAN 的价值在于:它能根据语义先验生成原图没有的信息,比如一片脱落的朱砂袍服,模型可以学会补出类似的衣纹走向,而不是像传统方法那样只给一片平均色。

4.2 损失函数怎么配:重构损失、感知损失与对抗损失的权重

训练 GAN 修复模型,网络结构只决定上限,损失函数决定实际效果。只用 L1 损失训练的模型输出平滑、缺少纹理,这是所有像素级重构损失的共同问题——L1/L2 对模糊解的惩罚不够大,模型会选择“各方面都差不多”的平均色来降低误差。加入对抗损失后,判别器会逼着生成器输出更锐利、更有笔触感的纹理。

我的三件套配置是:L1 重构损失(权重视掩膜大小调整,一般 1~10)、VGG 感知损失(权重 1)、LSGAN 判别器损失(权重 0.1~0.3)。感知损失不是越重越好,权重过重时模型会过度关注高层语义,把壁画的底色做旧质感抹掉。对抗损失权重过高则容易训练不稳定,输出出现彩色噪点或反复闪烁。

下面是一个简化的训练循环核心片段,注意看损失权重和掩膜融合方式:

# train_inpaint.py 核心片段 import torch import torch.nn.functional as F from torchvision.models import vgg16 criterion_l1 = torch.nn.L1Loss() vgg = vgg16(pretrained=True).features[:16].cuda().eval() l1_w, perc_w, adv_w = 10.0, 1.0, 0.2 for batch in dataloader: img, mask = batch # img: B,3,H,W; mask: B,1,H,W masked_img = img * (1 - mask) fake = generator(torch.cat([masked_img, mask], dim=1)) fake_full = img * mask + fake * (1 - mask) # 保留原位像素 l1_loss = l1_w * criterion_l1(fake_full, img) perc_loss = perc_w * (F.l1_loss(vgg(fake_full), vgg(img)) + F.l1_loss(vgg(fake), vgg(img))) / 2.0 g_loss = adv_w * criterion_lsgan(discriminator(fake_full), True) total_g = l1_loss + perc_loss + g_loss optimizer_g.zero_grad() total_g.backward() optimizer_g.step()

逻辑说明:masked_img是损伤图,mask值为 1 的区域代表缺失。生成器输出fake后,用img * mask + fake * (1 - mask)把原图完好的像素强制回填,这个操作叫 hard-pixel placement,能防止生成器改动未损伤区域。参数说明:l1_w=10是我在壁画场景下的默认值,如果训练中看到生成区域颜色漂移,把l1_w上调到 20;如果纹理过于锐利生硬,把adv_w降到 0.1。

感知损失用 VGG 的浅层特征(features[:16],即前几个卷积块),浅层管纹理和边缘,高层管语义结构。壁画修复两个都要,但浅层的权重在代码里通过相加已经包含。训练目标是让生成区的笔触节奏接近原图,而不是让整幅图在高层语义上像原图。

4.3 训练参数表与适用边界:一张表看清三种方案的取舍

GAN 修复模型的输入不是整幅壁画,而是以损伤区域为中心裁切的局部块。我用 512×512 输入、batch 8、Adam 优化器、初始学习率 1e-4,每 10 个 epoch 衰减到 0.2 倍。16 GB 显存可以跑 512×512 加 batch 4;如果显存吃紧,降到 384×384 比减小 batch 更稳。训练数据里真实损伤图不够,就用手头高精度壁画数字底片随机擦除构造训练对,再用真实损伤掩膜做微调。

方法适用损伤形态优点显存依赖局限
cv2.inpaint (Telea/NS)细裂缝、窄条剥落快、可控、无幻觉无大面积缺失抹平
PatchMatch / 变分中等块状缺失、半平滑区域保留原始色域无易产生纹理接缝
GAN 修复块状剥落、大面积信息缺失能补出语义合理的笔触8~16 GB可能生成虚构细节,需人工复核

表格参数说明:选型不是先定模型,而是先量掩膜尺寸分布。如果一张壁画里 90% 的损伤都是裂缝,GAN 的边际收益并不高,传统方法足够;掩膜面积超过全图 5% 的场景,才值得投入 GAN。部署时我从不把 GAN 输出直接当最终结果,它会和传统结果并列输出,让修复师按部位选择。GAN 生成的虚构细节在文保场景里是双刃剑——对大面积底色剥落是救命稻草,对人物五官是安全隐患,这种边界必须在项目启动时就和业务方定好。

5. 避坑:壁画修复项目最常见的 5 个翻车点

5.1 掩膜比实际损伤窄一圈,修复后边缘残留白线

现象:裂缝修复完,裂缝主体消失,但两侧留有一条半透明浅色线,放大看像什么都没修过。

原因:裂缝边缘有粉化过渡带,强度渐变到背景。模型分割出的掩膜只覆盖了裂缝核心最暗的区域,扩散算法在掩膜边界停下,过渡带里的异常颜色留在原图里。

解决:后处理阶段用 3×3 或 5×5 椭圆核对掩膜做 2~3 次膨胀,把过渡带纳入修复范围。如果膨胀后把衣纹线条也吞进去,改用cv2.GaussianBlur软化掩膜边界,让修复算法在边界处渐变过渡。

5.2 训练数据全用矩形遮蔽,真实裂缝被模型当成“装饰纹”

现象:训练时 PSNR 很高,一到真实壁画上,模型把裂缝修复成原有纹饰的一部分,或者干脆把衣纹当成裂缝抹掉。

原因:自监督训练用规则矩形模拟损伤,模型只学会了“矩形去掉、背景补齐”,没有见过线状、网状的真实裂缝掩膜。上线时掩膜分布发生漂移,模型的分辨力失效。

解决:构造训练掩膜时,用程序生成线状和网状掩膜,叠加随机矩形。常见做法是画随机多边形、加噪声膨胀、再叠几条贝塞尔曲线模拟裂缝走向。这样模型从第一阶段就区分“该修的伤”和“不该动的笔触”。

5.3 感知损失权重过高,修复区泛起“塑料光泽”

现象:修复区域颜色是接近了,但表面质感像打磨过的塑料,壁画的颗粒感和做旧痕迹全部消失。

原因:VGG 感知损失计算在高层特征空间,高层特征对整体结构敏感、对微表面纹理不敏感。权重过高时,生成器发现“只要整体结构对,损失就小”,于是放弃高频细节。

解决:感知损失权重从 1.0 降到 0.3~0.5;同时加入 L1 或梯度损失,保留高频边缘。若仍然偏滑,把感知损失换成 LPIPS 并在浅层特征上加权重。

5.4 只盯 PSNR 和 SSIM,输出图像被评价指标“骗”了

现象:验证集 PSNR 从 28 dB 涨到 31 dB,肉眼观察修复区却更糊、更平,完全丢了原作质感。

原因:PSNR 和 SSIM 是像素级指标,对模糊和平均色非常宽容。生成器只要把修复区填成背景平均色,误差就不大;如果想生成笔触,微小错位反而会拉低 PSNR。指标和主观感受在壁画场景经常背离。

解决:指标改成 LPIPS 和 FID 做参考,LPIPS 衡量感知相似度、FID 衡量生成纹理分布与真实壁画的差距。人工抽样是终审环节,放大到 200% 看笔触走向和接缝。

5.5 “修旧如旧”变成“修旧如新”,底色层次被抹平

现象:大面积脱落的区域,模型补出的颜色和周围背景一致,但整体发闷,缺失了原作多层底色叠压的效果,像一块补丁。

原因:训练目标把所有缺失区域统一视为“应等于最终成图”,忽略了壁画区域本身有底色层、颜料层、罩染层的叠压关系。模型学到的是平均色,不是层次。

解决:训练时对掩膜内的残缺区域保留部分残存底色作为条件输入,让生成器在已知底色上补画表层笔触。推理时把掩膜边界外扩 2~3 像素软过渡,避免修复区与原始区域产生断层感。

6. 效果验证与工程化落地:从 PSNR 走向人工核验的进阶技巧

评价体系要分层设计:数值指标只用来拦机器可量化的回归,真正拍板的是修复师的眼睛。我用一张表固定验证口径:PSNR 看全局像素差异,LPIPS 看感知结构,FID 看纹理分布,再配一块 200% 放大的局部对比图给修复师盲评。

指标关注点壁画场景建议注意事项
PSNR像素级误差只作趋势参考模糊解会虚高
SSIM亮度结构相似度参考,不验收对纹理钝感
LPIPS感知相似度主指标之一权重不同结果会变
FID纹理分布分区域评估样本量要够
人工盲评修旧如旧最终验收至少三人交叉评分

工程化落地上有一条我坚持的底线:GAN 推理接口必须返回修复图和掩膜,掩膜保存为 PNG 同步存档,方便追责和回滚。接口层在调用 GAN 前先算掩膜面积占比,高于 20% 的图直接拒绝自动修复,转给传统方法兜底或人工介入。这样既能控制幻觉风险,又不会让整条流程卡死。

最后分享一个我养成的检查习惯:每次训练完,先不看修复结果图,只看掩膜叠加图——如果掩膜边界没有贴着损伤走,后面补得再好都白搭。做壁画修复这几年,最大的教训不是模型选型,而是把“损伤理解”放在“损伤修复”前面。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询