(1)相关代码
import cv2
src = cv2.imread('1.jpg')
mask = cv2.imread('2.jpg', cv2.IMREAD_GRAYSCALE) # 灰度图(IMREAD_GRAYSCALE)方式读入水印蒙版图像
dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA)
cv2.imwrite('result.jpg', dst)
(2)对应算法
INPAINT_TELEA算法是由TELEA在2004年提出的基于快速行进的修复算法(FMM算法),先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点。具体实现时,首先制作出黑底白色水印且相同位置的水印蒙版图(必须单通道灰度图),然后使用inpaint方法处理原始图像,具体使用时可把水印区放粗,以达到最好的处理效果。
![](https://img.haomeiwen.com/i14596362/835afe84f5a76500.png)
该算法(又名FMM算法)的去除原理为,先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点。对于单个像素来说,其修复过程如下:
![](https://img.haomeiwen.com/i14596362/da6b9a002523a6c8.png)
如图Ω区域是待修复的区域;要修复Ω中的像素,就需要计算出新的像素值来代替原值。现在假设p点是我们要修复的像素。以p为中心选取一个小邻域B(ε),该邻域中的点像素值都是已知的(只要已知的)(如图中虚线部分)。
我们需要的是用邻域Bε(p)中的所有点计算p点的新灰度值。显然,各个像素点所起的作用应该是不同的,也就引入了权值函数来决定哪些像素的值对新像素值影响更大,哪些比较小。
![](https://img.haomeiwen.com/i14596362/9848bb2a3d0803a1.png)
这里的w(p, q)就是权值函数,q为邻域Bε(p)中的某一点是用来限定邻域中各像素的贡献大小的。
其中, 和
分别为距离参数和水平集参数,一般都取为 1。方向因子 dir(p,q)保证了越靠近法线方向 N的像素点对 p 点的贡献最大;几何距离因子 dst(p,q)保证了离 p 点越近的像素点对p 点贡献越大;水平集距离因子lev(p,q)保证了离经过点 p 的待修复区域的轮廓线越近的已知像素点对点 p 的贡献越大。
网友评论