一个愿意伫立在巨人肩膀上的农民......
1、理论
CDD
模型是在
TV
模型的基础上改进而得到的,
TV
模型先确定待修复区域的边界区域,然后使用各向异性扩散的方法从破损区的边缘向内部逐步修复,该模型不能很好地连接断裂区域,修复结果也不具有连通性,视觉效果较为生硬。在
TV
模型中扩散系数只是图像梯度模的倒数
,因此在修复时时常会出现破损区域信息填充不联通的情况。如图
展示了
TV
模型修复时视觉不连通的示意图。

而
CDD
模型是在
TV
模型基础上应用一种基于曲率驱动扩散的方法对图像进行修复,在图像修复中可以达到更好的视觉连通效果。
CDD
模型引入的曲率函数
𝑔
(
|
𝑘
|
)如下:

其中曲率
。该定义可使图像在曲率较大的地方扩散强度增大,在曲率较小的地方,扩散强度减少到零。
CDD
模型方程为:

CDD
模型求解与
TV
模型求解使用方法的相同,都是半点格式法。在
TV
模型的扩散系数只是图片梯度模的倒数
,在
CDD
模型中引入了新的曲率信息,将已知信息向破损区域扩散的强度更改为
,经过更改的扩散强度已经不仅仅依赖于图像的梯度信息,还需要考虑到等照度线的几何信息。
2、matlab程序(完整代码,可直接运行)
close all;
clear;
clc;
imgoriginal=imread('yuan.png');
figure;
subplot(1,3,1);
imshow(imgoriginal);
title('待修复图')
[width,height] = size(imgoriginal);
img= double(imgoriginal);
mask = zeros(width,height/3,3);
for j = 1:height/3
for i = 1:width
if ((imgoriginal(i,j,1) >220)&&(imgoriginal(i,j,2) >220)&&(imgoriginal(i,j,3) >220))
mask(i,j,1) = 255;
mask(i,j,2) = 255;
mask(i,j,3) = 255;
else
mask(i,j,1) = 0;
mask(i,j,2) = 0;
mask(i,j,3) = 0;
end
end
end
subplot(1,3,2);
imshow(mask);
title('检索的掩码图')
a=zeros(width,height);
I=cat(3,a,2*a,3*a);
J=cat(3,a,2*a,3*a);
n = 1;
itertimes=2000;
tic;
while n <= itertimes
for i = 2:width-1
for j = 2:height/3-1
if (mask(i,j+1,1) == 255)||(mask(i,j-1,1) == 255)||(mask(i+1,j,1) == 255)||(mask(i-1,j,1) == 255)
for k=1:3
grid_w(k) = (img(i,j,k)-img(i-1,j,k))^2+(1.0/16)*(img(i-1,j+1,k)+img(i,j+1,k)-img(i-1,j-1,k)-img(i,j-1,k))^2;
grid_e(k) = (img(i,j,k)-img(i+1,j,k))^2+(1.0/16)*(img(i,j+1,k)+img(i+1,j+1,k)-img(i,j-1,k)-img(i+1,j-1,k))^2;
grid_s(k) = (img(i,j,k)-img(i,j-1,k))^2+(1.0/16)*(img(i+1,j,k)+img(i+1,j-1,k)-img(i-1,j,k)-img(i-1,j-1,k))^2;
grid_n(k) = (img(i,j,k)-img(i,j+1,k))^2+(1.0/16)*(img(i+1,j,k)+img(i+1,j+1,k)-img(i-1,j,k)-img(i-1,j+1,k))^2;
I(i,j,k)=0.5*(img(i+1,j,k)-img(i-1,j,k))/sqrt(0.25*(img(i+1,j,k)-img(i-1,j,k))^2+0.25*(img(i,j+1,k)-img(i,j-1,k))^2+1);
J(i,j,k)=0.5*(img(i,j+1,k)-img(i,j-1,k))/sqrt(0.25*(img(i+1,j,k)-img(i-1,j,k))^2+0.25*(img(i,j+1,k)-img(i,j-1,k))^2+1);
Kw(k)=sqrt((I(i,j,k)-I(i-1,j,k)+(I(i-1,j+1,k)+I(i,j+1,k)-I(i-1,j-1,k)-I(i,j-1,k))/2)^2+(J(i,j,k)-J(i-1,j,k)+(J(i-1,j+1,k)+J(i,j+1,k)-J(i-1,j-1,k)-J(i,j-1,k))/2)^2);
Ke(k)=sqrt((I(i+1,j,k)-I(i,j,k)+(I(i,j+1,k)+I(i+1,j+1,k)-I(i,j-1,k)-I(i+1,j-1,k))/2)^2+(J(i+1,j,k)-J(i,j,k)+(J(i,j+1,k)+J(i+1,j+1,k)-J(i,j-1,k)-J(i+1,j-1,k))/2)^2);
Ks(k)=sqrt((I(i,j,k)-I(i,j-1,k)+(I(i+1,j,k)+I(i+1,j-1,k)-I(i-1,j,k)-I(i-1,j-1,k))/2)^2+(J(i,j,k)-J(i,j-1,k)+(J(i+1,j,k)+J(i+1,j-1,k)-J(i-1,j,k)-J(i-1,j-1,k))/2)^2);
Kn(k)=sqrt((I(i,j+1,k)-I(i,j,k)+(I(i+1,j,k)+I(i+1,j+1,k)-I(i-1,j,k)-I(i-1,j+1,k))/2)^2+(J(i,j+1,k)-J(i,j,k)+(I(i+1,j,k)+J(i+1,j+1,k)-J(i-1,j,k)-J(i-1,j+1,k))/2)^2);
w1(k) = Kw(k)/sqrt(1+grid_w(k))+1;
w2(k) = Ke(k)/sqrt(1+grid_e(k))+1;
w3(k) = Ks(k)/sqrt(1+grid_s(k))+1;
w4(k) = Kn(k)/sqrt(1+grid_n(k))+1;
img(i,j,k) =(w1(k)*img(i-1,j,k)+w2(k)*img(i+1,j,k)+w3(k)*img(i,j-1,k)+w4(k)*img(i,j+1,k))/(w1(k)+w2(k)+w3(k)+w4(k));
end
end
end
end
n = n+1;
end
img = uint8(floor(img));
toc;
subplot(1,3,3);
imshow(img,[]);
title('修复结果图')
imwrite(img,'CDD修复后.bmp');
3、运行结果
5、文献原文及代码文件点击下方连接,可直接跑通
6、参考文献
[1] ATF C, B JS. Nontexture Inpainting by Curvature-Driven Diffusions[J]. Journal of Visual Communication and Image Representation, 2001, 12(4):436-449.
创作不易,请尊重原创,引用请添加原文链接......