6

基于改进Criminisi算法的图像修复

 2 years ago
source link: https://blog.51cto.com/domi/5586218
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

基于改进Criminisi算法的图像修复

精选 原创

domi+1 2022-08-17 12:39:07 博主文章分类:matlab ©著作权

文章标签 最优匹配 纹理图像 搜索策略 文章分类 其它 人工智能 yyds干货盘点 阅读数296

1、内容简介

516-可以交流、咨询、答疑

2、内容说明

摘 要:针对 Criminisi算法难以获得理想的修复效果,且存在修复时间过长等缺陷,提出一种改进 Criminisi算法的 图像修复算法。改进优先权计算方式找到最优待修复块,完善最优匹配块搜索策略,找到最优匹配块,采用新的置信 值更新方式以获得更为理想修复效果,通过仿真实验测试算法性能,结果表明,相较于 Criminisi算法,改进 Criminisi 算法不仅获得了较理想的图像修复效果,而且大幅度减少了修复时间,提高了图像修复的效果。

关键词:图像修复;Criminisi算法;优先级;图像纹理

随着计算机图像技术的迅速发展,其在生物医学、 工业生产、遥感测绘等领域得到了成功的应用。但是在 图像拍摄和采集过程中,由于受到外界因素的干扰,不可 避免会丢失部分信息,一些区域缺失,影响图像质量[1]。 图像修复技术是指根据已知信息,对修复区域内丢失信 息进行补充,提高图像在视觉上的真实性,已经成为图 像处理领域的研究热点和重点[2]。 针对图像修复问题,学者们投入了大量的时间和精 力进行相关研究,提出了一些图像修复算法,当前主要 分为两类方法:基于非纹理图像修复和基于纹理修复方 法[3]。基于非纹理的图像修复方法主要是利用待修复区 域附近的已知信息,按一定的规则向待修复区域蔓延, 如文献[4]提出的基于高阶偏微分的图像修复算法,文 献[5]提出的基于整体变分(TV)模型的图像修复算法 等,它们适合于小区域的图像修复,但如果待修复的区 域比较大,难以获得比较理想的修复效果。文献[6]提 出基于先验模型的图像修复算法,对于结构信息的图 像,可以得到较好的修复效果,但是对于含有丰富纹理 图像,修复效果较差。基于纹理综合的修复方法指利用 块匹配选取合适的纹理块来修复,其中 Criminisi算法是 最为经典的纹理图像修复算法[7],其首先从图像完好区 域中寻找与待修复区域最匹配的像素块,然后将其填 充到受损区域,修复效果较好。然而在实际应用过程, Criminisi算法存在一些不足,如出现马赛克效应和纹理 混乱现象。为了克服 Criminisi算法的不足,国内外一些 学者在该算法的基础上,提出了一些改进 Criminisi图像 修复算法[8-11],但是这些算法都存在各自的缺陷,如何提 高图像修复效果,值得进一步研究。 为了获得理想的修复效果,针对 Criminisi算法存在的不足,提出一种改进 Criminisi 算法的图像修复算法, 并通过仿真实验测试算法的可行性和优越性。首先改 进优先权计算方式找到最优待修复块,然后完善最优匹 配块搜索策略,并找到最优匹配块,最后采用新的置信 值更新方式以获得更为理想的修复效果,并通过仿真实 验测试算法性能。结果表明,相对于 Criminisi 算法,改 进 Criminisi算法不仅得到了理想的图像修复效果,而且 大幅度减少了修复时间,提高了图像的修复效率。

3、仿真分析

function [Psnr,inpaintedImg] =RGB_Criminisi(imagepath,maskpath,fillColor)

%Criminisi算法修复彩色图像


img0=imagepath;
fillImg=maskpath;

img = double(fillImg);%要修复的图像
fillRegion=img(:,:,1)==fillColor(1)&img(:,:,2)==fillColor(2)&img(:,:,3)==fillColor(3);

origImg = img;
ind = img2ind(img);
%------------------------------------------------------
in=ind;
[A,BB]=find(in); %得到每个点的坐标
%-----------------------------------------------------
sz = [size(img,1) size(img,2)];
z1=size(img,1);
z2=size(img,2);
sourceRegion = ~fillRegion;


% 求等照度线值
[Ix(:,:,3),Iy(:,:,3)] = gradient(img(:,:,3));
[Ix(:,:,2),Iy(:,:,2)] = gradient(img(:,:,2));
[Ix(:,:,1),Iy(:,:,1)] = gradient(img(:,:,1));
Ix = sum(Ix,3)/(3*255); Iy = sum(Iy,3)/(3*255);
temp = Ix; Ix = -Iy; Iy = temp; % 旋转90度

%------------------------------------------------------------------------
%求得梯度值
[ix(:,:,3),iy(:,:,3)] = gradient(img(:,:,3));
[ix(:,:,2),iy(:,:,2)] = gradient(img(:,:,2));
[ix(:,:,1),iy(:,:,1)] = gradient(img(:,:,1));
ix = sum(ix,3)/(3*255); iy = sum(iy,3)/(3*255);
%------------------------------------------------------------------------


% 初始化置信度项C和数据项D值
C = double(sourceRegion);
D = repmat(-.1,sz);


% 修复(直到所有的破损区域都被修复完成)
while any(fillRegion(:))
% 寻找边缘
dR = find(conv2(double(fillRegion),[1,1,1;1,-8,1;1,1,1],'same')>0);
[Nx,Ny] = gradient(double(~fillRegion));
N = [Nx(dR(:)) Ny(dR(:))];
N(~isfinite(N))=0;

% 计算置信度项值
for k=dR'
Hp = qukuai_9(sz,k);
q = Hp(~(fillRegion(Hp)));
C(k) = sum(C(q))/numel(Hp);
end

% 计算优先权
D(dR) = abs(Ix(dR).*N(:,1)+Iy(dR).*N(:,2)) /255;
priorities =C(dR).*D(dR);


% 找到优先权最大的块 Hp
[unused,ndx] = max(priorities(:));
p = dR(ndx(1));
%---------------------

[Hp,rows,cols] = qukuai_9(sz,p); %9x9块大小
toFill=fillRegion(Hp);
Wpatch=img(rows,cols,:); %得到待修复块

%------------------------------------------------------------------------
%采用全局搜索,寻找最佳匹配块
Hq=whole_match(z1,z2,img,Wpatch,fillColor);
%------------------------------------------------------------------------

% 更新填充区域
fillRegion(Hp(toFill)) = false;

% 更新C(p)值和等照度线值
C(Hp(toFill)) = C(p);
Ix(Hp(toFill)) = Ix(Hq(toFill));
Iy(Hp(toFill)) = Iy(Hq(toFill));

%-----------------------------------------------------------------------
%更新梯度值
ix(Hp(toFill)) = ix(Hq(toFill));
iy(Hp(toFill)) = iy(Hq(toFill));
%----------------------------------------------------------------------


% 从Hq复制图像信息到Hp
ind(Hp(toFill)) = ind(Hq(toFill));
img(rows,cols,:) = ind2img(ind(rows,cols),origImg);

end

inpaintedImg=img;

A=double(img0);
B=double(inpaintedImg);

Psnr=PSNR(A,B);
inpaintedImg=uint8(inpaintedImg);
figure;imshow(inpaintedImg); title('Criminisi算法修复结果');
基于改进Criminisi算法的图像修复_搜索策略

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK