Artcraft 是我自己花了大半个季度打磨出来的一套图像处理流程前一半时间都在跟“把照片做成手作质感”这件事较劲后一半时间则是在填各种翻车坑。这个名字是我自己拼的art 取艺术与美术craft 取手艺与工艺合起来就是有手工艺感的艺术化再造。起因很实在我把自己拍的照片丢给各种 AI 滤镜和风格化工具出来的图精致、完整、层次分明可是总像一幅被过度美化的宣传图缺了真实作品里那种油墨、纸面、刀痕和轻微失误带来的“人味”。反复试了多次之后我决定不做滤镜而是做一套能拆解图像成分、再重新注入手工痕迹的工作流。这篇文章写给三类人一是对 AI 生成图已经有点审美疲劳想找回手工质感的设计师和插画师二是需要把照片转成版画、木刻、蜡染感物料但又没时间真的去学整套印刷工艺的创作者三是想理解“工艺感为什么能被量化成参数”的技术爱好者。Artcraft 不是一个现成的软件它更像一张配方单我用它能稳定地让普通照片变成有手作气息的画面。下面我会把思路、流程、参数和踩过的坑完整写出来尽量做到照着走一遍也能跑通。1. Artcraft 不是滤镜而是一条给图像“注入手工痕迹”的流水线1.1 从“太完美”到“有点人味”我为什么憋出这套方案有一次我给一张在街边小店拍的照片做风格化处理照片里有斑驳的墙面、褪色的招牌和歪斜的窗户。结果所有滤镜都把瑕疵修掉了墙面变得平整招牌色彩被调得鲜艳窗户的透视也被“纠正”了。那张处理完的图单独看挺好看可它已经不是我记忆里的画面了而是一张过度美化的效果图。我后来才意识到问题的根源不在技术而在目标定义大多数图像处理工具默认“瑕疵”是噪声要消除但手工艺作品里的油墨不均、纸张纹理、边缘抖动、套色偏移这些恰恰是决定“手工感”的核心信号。Artcraft 的出发点就是反转这个逻辑先不用滤镜去追求完美而是把图像拆成不同信号层再刻意保留甚至放大那些像人为操作留下的痕迹。这个思路其实受到了版画和丝网印刷的启发。做版画的人不会追求像素级的整齐他们会在颜料粘稠度、纸张含水量、按压力量这些物理因素里找随机美感。数字图像没有物理摩擦唯一的办法就是把“手工痕迹”建模成可调整的参数比如边缘抖动幅度、油墨不均匀度、纸纹尺寸。这也决定了 Artcraft 的定位它不是一键风格化工具而是一条可干预的流水线。1.2 一个决定性认知先拆图才能把手作感加回去Artcraft 最早版本其实走错了方向。我当时以为只要把照片放进一个“木刻风格引擎”就能得到手作感结果得到的图要么像塑料浮雕要么像低配版卡通。后来某个做独立游戏开发的朋友提醒我应该先看看传统手工艺人是怎么处理一张素材的他们会先分析画面的主体轮廓、明暗分布、色彩范围再决定用什么刀法、什么油墨层次。这句话让我彻底转换了思路。Artcraft 现在的工作方式分两步第一步是“拆”把图像拆成构图层、光影层、纹理层、瑕疵层第二步是“建”用程序化手段分别重建这些层最后合成一张新图。这样做的好处是每一层都可以单独调整比如想加强纸面颗粒感就不用重新跑全流程想保留原图的结构轮廓可以直接把构图层原样叠回来。用一个不太严谨但容易理解的类比手工做皮具的人拿到一块皮料不会直接随便上色压纹而是先分辨皮面特性、缺陷区域、染色边界再决定压纹深浅和做旧程度。Artcraft 做的事情就是把皮料换成照片数据用计算机视觉手段找出构图、明暗、纹理边界最后把“做旧”“压纹”这些工艺动作变成图像处理操作。2. 拆解不是分图层而是分离“构图、光影、纹理与瑕疵”2.1 四层结构的来源手工油印与版画给我们的启示Artcraft 的四层结构并不是从软件功能里想出来的而是来自手工油印和木刻的观察。一张木刻版画拿到手上第一眼看到的是大的构图轮廓这是构图层然后视线会被明暗对比强烈的地方吸引这是光影层凑近看能发现纸面上的纤维、油墨覆盖不均匀的痕迹这是纹理层最后是那些被印刷工人视为小失误的墨点、边缘断线、套色偏移这是瑕疵层。数字图像处理里这四个层面可以对应语义分割图、亮度分箱图、噪声纹理图、局部遮罩图。这个对应关系非常重要因为它改变了我们处理图像的方式。传统风格迁移会直接修改像素颜色而 Artcraft 是分别修改不同频段的信号。比如构图层只保留轮廓和主体位置光影层只保留明暗组合纹理层只负责添加微观表面瑕疵层单独控制“哪里看起来像手工失误”。每一层都是独立的中间产物可以随时加回或剔除。在实际操作中层的分离不需要做得像科学实验那么精细够用就行。我的经验是用语义分割拿到主体掩码后先不要急着做细节检测因为多数照片的主体都很简单真正干扰手感的是背景里的杂乱纹理。先把主体和背景分到不同通道后续加纹理时就能区别对待比如主体部分纸纹细一点背景部分油墨粗一点这样画面更有手作层次。2.2 落地拆解哪些步骤能机器化哪些不能Artcraft 的拆解流程我整理成了一套固定的动作全部用通用图像处理手段完成不依赖特定商业软件。第一步是读取高分辨率原图尽量选未经过度压缩的版本因为后面对亮度分箱和边缘提取的质量要求很高压得太狠会出现色块断裂。第二步做一次显著主体分离得到构图掩码这一步能帮助后续控制纹理作用的范围。第三步把 RGB 图像转成亮度通道并做分层量化通常量化为 3 到 5 个亮度带这一步对应光影层的提取。第四步生成程序化纸面纹理第五步根据亮度分布生成瑕疵遮罩。下面是我在项目里实际使用的一个简版拆分函数可以看作框架示意。它不是我软件里的完整实现但保留了最核心的结构照着写也能跑通基本流程def split_artcraft(img, n_colors5, edge_smooth6): # 1. 主体结构显著物体掩码决定纹理作用范围 mask salient_mask(img) # 2. 光影亮度分箱输出 3-5 个明暗带 lum rgb_to_luminance(img) bands quantize(lum, n_colors) # 3. 纹理程序化纸面噪声带一点方向性 tex paper_noise(seed2024, scale30, anisotropy1.2) # 4. 瑕疵暗部容易出现油墨杂质因此用亮度遮罩生成 defect droplet_mask(lum, threshold0.45) return [mask, bands, tex, defect]机器能完成的部分是边缘提取、亮度分箱、色彩聚类、噪声叠加机器做不好的是判断“这里应不应该像手工失误”。比如一张人像的脸上出现一道油墨划痕会显得很违和而同一道划痕放在墙角背景里就会觉得很自然。所以我在 Artcraft 里给瑕疵层加了一个自定义笔刷遮罩工具允许手动涂抹不希望出现瑕疵的区域宁可花 30 秒手画一笔也不要用抖动参数把整张图都变成事故现场。2.3 拆解失败的长尾表现低对比照片与高光过曝拆解流程听起来简单实际跑起来经常在三类照片上翻车。第一类是低对比照片比如阴天拍摄的街景亮度分布集中在一个很小的范围亮度分箱之后几乎只剩两个色阶画面变得像一块灰色塑料这时候需要在分箱之前做一次对比度拉伸或者手动把亮度带宽调小到 4 档以上别偷懒用默认值。第二类是高光过曝的照片比如正午天空和白色墙面亮度通道顶部直接溢出后续颜色量化会把高光区域映射成纸白而纸白一旦面积过大手工感就消失了取而代之的是印刷品褪色感。第三类是颜色过于浓烈的照片比如高饱和度的霓虹灯夜景。浓色照片直接做色板映射时会大量产出超出艺术预期的假边界因为相邻像素颜色差异太大会被当成轮廓线结果夜空变成一片等高线地图。对这类图我通常先把饱和度降到原来的 60%再执行拆解等纹理层合成后再把饱和度拉回一点效果会自然很多。这三类翻车在后面的章节里我会展开讲因为它们恰恰是参数调优最有价值的地方。3. 把“工艺感”变成可计算的配方边缘、色板、纹理与坐标抖动3.1 工艺感的三条可计算特征如果只用一句话概括 Artcraft 的核心我会说它把“工艺感”压缩成了三条可计算的特征边缘不是统一粗细的色块不是无限渐变的微观噪声不是各向同性的。先说边缘。机器生成的边缘通常是像素级的精确线条而手工刀刻的边缘会随着用力方向变粗变细、断断续续。对应到算法上就是对边缘检测结果做坐标抖动让边缘像素的位置产生小幅偏移同时用不同强度的模糊核处理不同区域。再说色块。传统版画受限于套色工艺画面颜色是有限集合而且色块之间会有明显的边界不像照片那样平滑过渡。Artcraft 使用 K-means 聚类把颜色压缩到 4 到 6 个主色再根据目标色板做映射得到“有限色阶但层次分明”的感觉。最后说噪声。纸面纹路、油墨颗粒、刀痕方向都是带有局部一致性的结构不是随机噪点如果直接用白噪声填充画面会显得又脏又粗糙。3.2 油墨量化与色板转移的具体参数颜色量化是 Artcraft 里最影响观感的一步我测试下来K-means 聚类到 4 到 6 个颜色时手工感最强。5 个颜色通常是比较稳的起点整体氛围偏“套色版画”4 个颜色会显得更粗犷适合表现木刻感6 个颜色则接近丝网印刷保留了更多细节。实际操作里我不会直接使用聚类结果而是会准备一个自定义色板把聚类中心映射到目标色板这样能控制画面是暖调还是冷调。具体映射过程可以理解为把颜色空间压缩成一条从纸白到油墨黑的轴再叠加少量色相偏移。我常用的色板是纸白、浅灰、中灰、深褐、暖黑这五个颜色。纸白不是纯白色而是略带暖黄感的调和色这样可以让亮部更有纸张质感油墨黑也不是纯黑而是带一点青褐色的深色调避免阴影变成死黑。下面的代码展示了简化的核心思路palette [ (245, 240, 226), # 纸白 (210, 200, 178), # 浅灰 (155, 140, 118), # 中灰 (104, 82, 66), # 深褐 (28, 24, 22), # 暖黑 ] def assign_pixel(p, palette): best min(palette, keylambda c: color_distance(p, c)) return best这里有个容易被忽略的参数是亮度轴的分布。手工印刷的暗部层次通常很少不会保留非常细腻的过渡因为它受限于油墨物理特性。所以我在映射暗部时会有意把亮度在 20 到 60 之间的像素合并成同一层这样阴影区域会出现自然的色块偏差观感上很接近套色不均的效果。一开始如果觉得画面脏多半是因为暗部保留层次太多而不是色板选得不对。3.3 用程序化噪声伪造木刻刀痕与纸面不平程序化噪声是 Artcraft 里最依赖手感的一步也是最容易做过头的一步。纸面纹理我习惯用多层噪声叠加一层大尺度的低频噪声模拟纸张纤维走向一层小尺度的高频噪声模拟油墨颗粒再用一个轻微的分形噪声作为扰动。这样出来的纸纹不是均匀细沙而是有大面积起伏、又有局部颗粒的自然质地。单纯用白噪声会像砂纸单纯用低频噪声又会像塑料表面。刀痕效果则依赖坐标置换。我会把颜色量化后的亮度带叠加一个扭曲偏移场让原本平直的色块边界发生波浪状弯曲模仿刀刻时力度不均产生的弧线。这个偏移场的幅度要控制在 2 到 4 个像素左右太小看不见太大会让构图彻底变形。对于画面中的前景主体我通常会把置换幅度调低背景区域则可以适当调大因为背景的刀痕更明显反而增加了手工感。我建议把纸纹幅度和瑕疵幅度分成两个独立参数来调。纸纹幅度管全局的微观手感瑕疵幅度管局部的偶然痕迹。很多人处理“画面太干净”时会一股脑把噪声叠加强度拉高结果整张图变成灰蒙蒙的脏底。正确做法是结合亮度关系亮部的纸纹可以适当增加暗部的油墨不均匀度也要增加但中部灰调区域要克制这会让视觉重心更集中在主体上。3.4 把零散工具串成一条可重复运行的流水线当每一个步骤都独立测试通过后最重要的事情是把它们按顺序串起来变成一行命令就能从头跑到尾的流水线。Artcraft 的流水线顺序是原图预处理、主体分割、亮度分箱、色板映射、边缘提取、坐标置换、纸纹叠加、瑕疵叠加、合成输出。顺序不能随意调整因为边缘提取如果放在色板映射之后得到的轮廓会带上颜色量化的痕迹不够干净瑕疵叠加如果放在纸纹叠加之前瑕疵会被纸纹覆盖掉效果大打折扣。流水线里的每个环节都记录了参数快照这样同一张图可以快速对比不同参数组合。我额外加了一个批量比较功能生成同一个作品的四个版本输出像设计师交稿那样围成一个网格对比看。很多时候眼睛在单张图上察觉不到的差异放在网格里一眼就能看出来这个习惯也帮我避免了不少参数走偏的问题。4. 翻车比成功更值得写手感是在一次次失真里逼出来的4.1 第一次高光全糊阴影变沥青Artcraft 第一版真正处理一张背光人像时输出结果让我看了很久没说出话。高光部分因为过曝被映射成一片纸白人物轮廓边缘检测出的碎线在全图上像蜘蛛网一样乱窜阴影区域全部变成了深褐色沥青一样的团块。当时我对着参数面板调了整整一个下午才意识到最大的问题在边缘松弛度边缘抖动幅度设置成了全局统一值头发丝、衣服折痕、背景树枝全都用了同样的强度导致画面细节全部糊成一团。那次之后我总结了两个规则。第一边缘抖动要按线宽分层细节区域头发、织物纹路使用较小幅度大轮廓区域面部、建筑边缘使用较大幅度第二暗部在色板映射时不要过度合并层次要把最低亮度区域单独限制在画面的小比例里比如不超过总像素的 8%否则画面会出现明显的“沥青化”。现在我的流水线里加入了一步亮度直方图检查每当暗部面积超过阈值就直接告警。4.2 颜色量化把天空切成土坡另外一次典型翻车发生在处理一张包含大面积天空的照片时。原图天空是细腻的蓝灰色渐变颜色量化后硬生生被切成了四五个阶梯条带远远看过去就像一片土坡的等高线。这个问题表面看是聚类数量太少实际上是因为我没有对渐变区域做局部平滑。后来我在量化之前增加了一个边缘保留滤波也就是在色块交界处保留少量渐变过渡让阶梯感减弱。更重要的是我意识到色板映射不是让色块尽可能精确而是在保留手作感的同时不破坏原始构图的明暗关系。我的解决方案是增加“主色锚点”机制先在原图上指定三到五个关键区域的颜色作为色板形成的约束条件量化器会在这个约束下寻找近似解而不是完全从零聚类。这样天空这种大面积渐变区域就不会因为聚类边界变化而出现严重断层。4.3 把破绽变成味道的三个修复技巧经过一系列翻车之后我总结出三个最有效的修复技巧现在基本每天都用。第一个技巧是给边缘坐标加“手工抖动”但不是均匀随机抖动而是沿着边缘方向做小幅度波浪偏移模拟刀具切入纸张时的阻力变化。第二个技巧是把瑕疵层的生成与亮度绑定暗部区域随机分布一些小的油墨斑点和断线亮部区域保持干净这样瑕疵会集中在视觉边缘起到增强手工感的作用而不是均匀撒在整张图上。第三个技巧是纸纹层要用多尺度叠加。我用两个不同倍率的噪声相乘一层模拟纸张纤维走向一层模拟油墨颗粒感合成后再经过一次轻微的模糊避免出现过于锐利的程序化痕迹。这三个技巧都不复杂但它们让 Artcraft 的输出从“程序生成的风格图”变成了“像是人手工处理过的东西”。我的判断标准很简单放大到 200% 之后画面上有没有那种不完美的生动感。4.4 一张图修到满意状态的调参清单为了让读者少走弯路我把常用参数整理成一张速查表。但请记住这些值只是起点不同照片的直方图和主体分布差异很大不能死套。参数作用建议初始值翻车表现色板数量控制有限色阶感5太少变海报太多变照片暗部面积占比控制沥青化风险8%过高画面发黑发闷边缘松弛度控制刀刻手感2.5过高细节全糊过低像矢量图纸纹幅度控制纸面颗粒感0.35过高变脏底过低变塑料瑕疵密度控制偶发油墨痕迹12%过高是事故现场过低没手作感坐标置换幅度控制色块边界弯曲3 像素过大构图扭曲过小无感拿到一张新图我会先把所有参数设置成表里的初始值跑一版看整体感觉再针对最明显的问题单独调一个参数。切忌同时改四个参数否则根本无法判断哪个调整起了作用。每次只改一个记录前后对比这是调参的基本原则。5. 从个人工具变成团队工作流批量、交互与边缘情况5.1 批量处理时的内存与分辨率控制当 Artcraft 从“处理一张孤零零的照片”变成“批量处理一批素材”时第一个现实问题是分辨率与内存的平衡。一开始我直接对原尺寸大图做全套流程结果程序因为边缘提取阶段的内存占用过高而不断崩溃。后来我把处理流程改成分块处理先缩放一半尺寸做完拆解再把构图层和纹理层在低分辨率下合成最后用原图信息对高光区域做一次修正。这样既能保证纹理细节又不会让中间数据量爆炸。批量处理的另一个关键点是命名规范。我会把每个中间层单独输出为带后缀的文件后缀包含参数快照编码比如“img_l5_e2.5_t0.35_def12”。这样就算某一张图后期出了问题也能通过文件名快速定位当时用了哪些参数不需要重新翻参数面板。这个习惯我从第一版开始就坚持后来在团队协作里帮了大忙。5.2 参数地图不要盲目调给客户一个可感知的调节面板如果把 Artcraft 交给不太熟悉图像处理的人使用直接暴露“色板数量”“边缘松弛度”这种参数会让人手足无措。我做过一次实验让几个朋友分别用专业参数名和通俗参数名去调同一张图结果是使用通俗参数名的那组明显更快得到满意效果。从那之后我制作了一个参数映射层把底层专业参数整合成“笔画干净度”“油墨浓度”“作旧程度”三个大滑杆。这三个滑杆的映射逻辑也不复杂。笔画干净度主要控制边缘松弛度和坐标置换幅度值越高画面越利落油墨浓度控制色板中暖黑的比例和暗部面积作旧程度则综合控制纸纹幅度、瑕疵密度和局部断线概率。这样即使完全不懂算法的人也能理解“我要更旧一点”应该往哪个方向拖。不要小看这一步它决定了一个工具是只能自己用还是能交给一个团队用。5.3 让AI只负责“变化”不负责“风格”Artcraft 这套流程本身并不排斥 AI 辅助但我的原则是让 AI 只负责“变化”不让它负责“风格”。每当我想在既有输出上增加一点创意元素比如把普通背景替换成抽象的肌理或者给人物加上一些夸张的线条我会把 Artcraft 的成品图像作为输入再用生成式模型的图生图能力做局部修改。关键是重绘幅度必须控制在较低水平经验值是 0.25 到 0.38 之间。如果超过 0.5AI 会开始重新诠释构图和光影把好不容易保留下来的手作纹理冲淡。直接拿原图给 AI 做风格化得到的结果往往缺少工艺感拿 Artcraft 的输出给 AI 做局部变化AI 会在已有纹理的基础上增减细节输出反而是“既有手工底色、又有创意变形”的混合体。这个工作流我用了很久每次都很稳定。其实背后的逻辑一句话就能说清风格应该由你控制AI 只能当一个画室里思路跳跃的助手。5.4 高频问题排查表最后整理几个高频问题都是我实际使用中反复遇到的直接给出原因和解决路径方便读者对照排查。现象常见原因解决方法画面过于平滑没有手感纸纹幅度太低或纸纹层没有多尺度叠加把纸纹幅度从 0.35 提到 0.5并叠加第二层低频噪声颜色看起来很脏色板数量超出 6 个或暗部保留层次太多减少色板数量重点合并亮度 20 到 60 的像素边缘全部糊成一片边缘松弛度全局统一没有按线宽分层对细节区域使用原值只在轮廓区域增加松弛度中景细节完全消失语义分割层级过多或模糊半径太大增加模糊半径判断只对背景区域做低通滤波暗部像沥青团块暗部面积占比过高限制暗部面积不超过 8%并允许少量高光溢出如果遇到表里没有的情况我的建议是先关掉瑕疵层和纸纹层回到最原始的色板映射确认构图和颜色关系是满意的再一步一步把纹理和瑕疵加回来。这样做能快速定位问题出在哪一层而不是在合成结果里瞎猜。实际用下来我的体会是 Artcraft 的价值不在于把照片处理得“好看”而在于把图像的每个成分拆开再由你决定保留什么、舍弃什么。每次把一套新参数发给朋友试用我最喜欢听到的评价不是“这个滤镜真棒”而是“这画面像是人亲手做出来的”。最后再分享一个小技巧把参数面板里的名字改成手艺人熟悉的词比如“油墨粘稠度”“纸面干净度”“刀锋钝感”同一个参数不同的命名使用者的接受度会有天壤之别。技术流程做完了真正让工具活起来的往往是这些不起眼的交互细节。