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

article/2025/10/15 15:21:06

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复制图像信息到Hpind(Hp(toFill)) = ind(Hq(toFill));img(rows,cols,:) = ind2img(ind(rows,cols),origImg);  endinpaintedImg=img;A=double(img0);
B=double(inpaintedImg);Psnr=PSNR(A,B);
inpaintedImg=uint8(inpaintedImg);
figure;imshow(inpaintedImg); title('Criminisi算法修复结果');


4、参考论文

 


http://chatgpt.dhexx.cn/article/Hn89FYZo.shtml

相关文章

图像修复简介

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google C项目编程风格指南 (中文版) 分享在实际应用中,图像经常被噪声腐蚀。这些噪音是镜头上的灰…

Halcon图像修复

1.之前研究OpenCV的图像修复时,知道Opencv提供的inpaint API能够实现这个效果。 void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模,指示要修复的像素 OutputArray dst, 目标图像 double inpaintRadius, 像素周围的邻域补绘。…

图像修复

转自:https://blog.csdn.net/moxibingdao/article/details/107075598 本文继 去雨去雾去模糊篇 和 图像增强与图像恢复篇 之后,继续盘点CVPR 2020 中低层图像处理技术,本篇聚焦于图像修复(Image Inpainting)。 示例如…

CVPR 2020 论文大盘点-图像修复Inpainting篇

转自:https://mp.weixin.qq.com/s?__bizMzIwMTE1NjQxMQ&mid2247519592&idx2&sn3a0598c9f52e47929678a572ea451d98&chksm96f0ff3ca187762a107b4b9194e862b757d3d943ec399b35cbb7576cd92ee55cc648d7121ac3&scene21#wechat_redirect 本文继 去雨…

图像修复介绍

图像修复是一种利用缺损图像中已知部分的信息预测缺损区域的内容,允许使用替代内容取填充目标区域的技术。其最终目的是保证修复后的图像整体结构连贯统一,修复区域边缘处过渡自然,修复内容细节丰富合理,最好能够使观察者无法分辨…

【OpenCV】- 图像修复

说明:图像修复可以解决类似噪声或者是镜头上的灰尘或水滴或者旧照片上面的划痕等。 文章目录 1、实现图像修补:inpaint()函数2、opencv之鼠标响应函数3、示例程序 1、实现图像修补:inpaint()函数 说明:图像修补技术由inpaint()函数…

图像修复(Image Restoration)算法数据集详细介绍

目录 人脸数据集 1.Helen Face 2.CelebA (Celebrity Attribute) 3.CelebA-HQ 4.FFHQ(Flickr-Faces-HQ) 场景数据集 1.MS COCO (Common Objects in Context) 2.ImageNet 3.Places2 街景数据集 1.Paris StreetView 2.Cityscapes 纹理数据集 …

图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】

声明:精简翻译,未完全校对 积压的存稿、好久没更文了、先发一篇这个代码很不错、推荐有兴趣的同学学习博主也写了对应的测评文章待发、点赞越多、发的越快如有同学,学有余力、可以转载这个文章( 附原文地址即可 )、校对…

Linux udhcpc/udhcpd 移植

参考文档: http://blog.chinaunix.net/uid-14704264-id-4272838.html https://www.cnblogs.com/chenfulin5/p/9481249.html 若系统busybox 自带了 udhcpc 和 udhcpd 工具 udhcpc 作为客户端工具,用于动态获取IP; udhcpd 作为服务器工具&…

udhcpc6的default.script

udhcpc6使用中遇到的问题 和udhcpc一样,udhcpc6是busybox中的一个工具,主要用来提供dhcpv6客户端服务。 在使用过程中遇到了一个问题,直接执行udhcpc6 -i eth0,可以看到打印信息中显示正在发送discover包,如果本地有…

UNIX source code-DHCP

文章目录 DHCP基础知识什么是DHCP为什么要使用DHCP IP地址分配机制工作原理报文类型基本步骤中继重用IP租赁期限 代码解析文件作用udhcpd.c结构体代码逻辑(流程) udhcpc.c结构体代码逻辑(流程) file.c结构体(read_conf…

udhcpc 移植和使用

问题描述: busybox udhcpc获取IP,但没有自动将获取到的ip设置到网卡上,并且没有自动设置网关,路由表等。必须手动设置才能连接外网。 解决方案: udhcpc可以通过-s参数指定运行脚本,当获取到ip地址后&…

初始化ArrayList、List的两种方法

说明&#xff1a; 个人偏向第二种方法&#xff0c;适合没有服务器数据的情况下&#xff0c;做个简单的list来开发 方式一&#xff1a; ArrayList<String> list new ArrayList<String>();String str01 String("str01");String str02 String("str0…

Java 中初始化 List 集合的 6 种方式!

List 是 Java 开发中经常会使用的集合&#xff0c;你们知道有哪些方式可以初始化一个 List 吗&#xff1f;这其中不缺乏一些坑&#xff0c;今天栈长我给大家一一普及一下。 1、常规方式 List<String> languages new ArrayList<>(); languages.add("Java&qu…

java创建List时候 初始化赋值

在这之前 可能有的读者&#xff0c; 只知道数组初始化 时候的赋值。 String[] strings new String[]{"one","two","three"};当创建list时候&#xff0c;也许 你还会写过以下代码 正确的写法 List<String> list new ArrayList<>(…

初始化列表

前言 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _month;int _day; }; 虽然上述构造函数调…

Java 初始化 List 的几种方法

最常见的初始化 List 方法为&#xff1a; List<String> languages new ArrayList<>(); languages.add("Java"); languages.add("PHP"); languages.add("Python"); System.out.println(languages);但是实际上&#xff0c;我们并不会…

LIST集合初始化及常见方法

目录 1.ArrayList集合的初始化&#xff1a; 2.常用的List集合方法&#xff1a; 1.添加元素方法 2.查看&#xff08;遍历元素&#xff09;&#xff1a; 3.修改元素&#xff1a; 4.删除元素&#xff1a; 5.其他的常见方法&#xff1a; 1.ArrayList集合的初始化&#xff1a;…

微信小程序上传图片怎么限制大小

最近有一个微信小程序的项目&#xff0c;要求是上传多张图片&#xff0c;数量不能超过3张 &#xff0c;而且在php里因为上传图片被设置了只能上传2M&#xff0c;导致上传不成功&#xff0c;所以我在前端 设置一个函数&#xff0c;用了微信api(wx.chooseImage)获取图片&#xf…

微信小程序 import文件大小限制

微信小程序 import 引入外部文件 最大限制 超过 500k 时小程序会报错 当 import 引入的文件小于 500k 20200317补充: 后来有尝试了一下 echart ,发现引入的文件也大于500k,但是并没有出现报错, 我十分怀疑是json 的长度过长导致的, 如果有人知道是什么原因,希望不吝赐教.