#import "../template.typ": *

#show: project.with(
  title: "3",
  authors: ("absolutex",),
)

= 机器视觉实践 三

== 实验目的

人脸图像祛痣
+ 去除人脸上的痣，使其恢复正常皮肤
+ 要求图像祛痣算法具有实时性
+ 要求实现图像局部祛痣，即在祛痣的同时保持无痣区域的颜色和对比度不变
+ 具体祛痣方法不限
+ 编程语言不限，可通过C++，Python或Matlab 实现

== 实验内容

一般祛痣广泛使用的有两种方法，一个是用 inpaint 计算出来，另一个是直接拿另一片区域的皮肤填补有痣区域的皮肤。这里把两个方法都实现了一遍。

当然下下策是使用单一色块填补，在人脸祛痣这种区域，如果使用单一色块直接覆盖，明显能看出p图痕迹。

=== inpaint

这里直接复用了第一次实验的 inpaint 代码，该代码使用一层用户手绘的蒙版作为 mask。inpaint 的调用在 ipt 函数里，这里不再赘述。

#include_code("../src/mole/inpaint.py")

=== 区域复制

这里是区域复制的不完整代码，ImageRegionFillApp 继承自另一个文件的 ImageTkApp，主要是一些底层代码，这里不放出。

代码使用两阶段绘制，第一个阶段是绘制一条直线到用户指定的区域，建立起区域与区域的映射关系，第二阶段是鼠标拖拽这条直线，将线段终点区域的色块（半径为 3 的圆形区域）复制到线段起点，也就是痣的区域。

鼠标右键可以从第二阶段回到第一阶段，以处理多个痣。

#include_code("../src/mole/move_region.py")

== 实验结果与心得体会

本次实验使用的素材是大模型生成的现实中不存在的人脸，痣是我自己用 GIMP 点上去的。

=== inpaint

#figure(
  image("inpaint.jpg", width: 100%),
  caption: [inpaint 去痣 效果图],
)

inpaint 效果主要取决于蒙版画的范围是否精确，越精确，边缘的色块突变越少。

本次实验 inpaint 的结果远看没有什么问题，近看的话还是能看出，去痣区域的内部颜色过于均匀，可以看出伪造痕迹。

=== 区域复制

#figure(
  image("move_region.jpg", width: 100%),
  caption: [区域复制去痣 效果图],
)

区域复制去痣更加考验手法。特别是这次的图像刚好有痣在脸部高光的分界处，如何选取色块来源可以让脸部的光线变化更加平缓，这是一个技术活。需要经过多次尝试，才能达成这样的效果。


