图像修复模型——TV模型

article/2025/10/15 15:09:55

1. 参考文献

2. TV图像修复模型

2.1 TV模型

% demo_TV.m
% Author: HSW
% Date: 2015/3/25
% HARBIN INSTITUTE OF TECHNOLOGY
%
% set matlab
close all;
clear all;
clc;options.null = 0;
% read image
Img = imread('Image\butterfly.bmp');
% Img = imread('Image\peppers.bmp');
%Img = rgb2gray(Img);
Img = im2double(Img);
if max(Img(:)) < 2Img = Img*255;
endFlagColor = (size(Img,3) == 3);% set mask
SetMask = 2;
if SetMask == 1% read maskMask = imread('Mask\peppers_mask512.bmp');Mask = Mask > 5;MFlagColor = (size(Mask,3) == 3);if MFlagColor ~= FlagColor && FlagColor == 1Mask = repmat(Mask,[1,1,3]);elseif MFlagColor ~= FlagColor && FlagColor == 0Mask = Mask(:,:,1);end
elseif SetMask == 2% Interactively set maskif not(exist('grab_mode'))grab_mode = 'line';endoptions.grab_mode = grab_mode;if not(exist('grab_radius'))grab_radius = 4;endswitch grab_modecase 'points'options.r = grab_radius;U = grab_inpainting_mask(Img,options);case 'line'options.r = grab_radius;[U,options.point_list] = grab_inpainting_mask(Img,options);end %switchIin = find(U(:,:,1) == Inf);Iout = find(U(:,:,1) ~= Inf);m1 = length(Iin); % 缺损点的总数% product the maskMask = zeros(size(Img));if FlagColor == 1tmpMask = zeros([size(Img,1),size(Img,2)]);for channel = 1:3tmpMask(Iin) = 1 ;Mask(:,:,channel) = tmpMask;endelseMask(Iin) = 1; % 缺损区域为1end % if FlagColor
end% if SetMask
FlagNoise = 0; % default noiseless
if FlagNoise == 1sigma = 25; nImg = Img + sigma*randn(size(Img)); 
elsenImg = Img; 
end 
nImg = (1-Mask).*nImg;
PSNRin = 10*log10(255^2/mean((Img(:)-nImg(:)).^2));
InImg = nImg;
% Initial Image
if FlagColor == 1Positions = find(Mask(:,:,1) == 1);for channel = 1:3tmpnImg = nImg(:,:,channel);tmpnImg(Positions) = floor(255*rand(1,length(Positions))) + 1;InImg(:,:,channel) = tmpnImg;end
elsePositions = find(Mask == 1);randValue = floor(255*rand(1,length(Positions))) + 1;InImg(Positions) = randValue;
end% Main Total Variable Model
IterNum = 300;
lambda = 0.001; 
if FlagNoise == 1lambda = 1; 
end 
I = InImg;
for iter = 1:IterNumI = TV_inpaint_gray_color(I,Mask,lambda,FlagNoise);if mod(iter,100) == 0figure;imshow(I/255,[]);title(['Results of iterNum = ',num2str(iter)]);end
end %for iterI = max(0,min(I,255));
PSNRout = 10*log10(255^2/mean((I(:) - Img(:)).^2));
figure;
subplot(1,3,1);
imshow(Img/255,[]);
title('Original Image');
subplot(1,3,2);
imshow(nImg/255,[]);
title(['Masked Image PSNR = ',num2str(PSNRin), ' dB']);
subplot(1,3,3);
imshow(I/255,[]);
title(['Inpainting Image PSNR = ', num2str(PSNRout), ' dB']);

2.2 全变分模型

function I = TV_inpaint_gray_color(I,M,lambda,FlagNoise)
% input:
%       I: 待修复图像
%       lambda: 保真项系数,在修复实验中不需要处理
%       M:缺损区域mask, 缺损区域取值为1
%       FlagNoise: 标示是否含噪声
% output;
%        I: 修复结果
% Author: HSW
% Date: 2015/3/25
% HARBIN INSTITUTE OF TECHNOLOGY
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dims = ndims(I);
epsilon = 0.001;
switch dimscase 3 %彩色图像if FlagNoise == 0for channel = 1:dimsGradientE_m = sqrt((I([2:end,end],:,channel) - I(:,:,channel)).^2 +  ((I([2:end,end],[2:end,end],channel) + I(:,[2:end,end],channel) - I(:,[1,1:end-1],channel) - I([2:end,end],[1,1:end-1],channel))./4).^2);GradientS_m = sqrt( (I(:,:,channel) - I(:,[1,1:end-1],channel) ).^2 +  ((I([2:end,end],:,channel) - I([1,1:end-1],:,channel) + I([2:end,end],[1,1:end-1],channel) - I([1,1:end-1],[1,1:end-1],channel) )./4).^2 );GradientW_m = sqrt( ( I(:,:,channel) - I([1,1:end-1],:,channel) ).^2 + ((I(:,[2:end,end],channel) - I(:,[1,1:end-1],channel) + I([1,1:end-1],[2:end,end],channel) - I([1,1:end-1],[1,1:end-1],channel))./4).^2 );GradientN_m =  sqrt( ( ( I([2:end,end],:,channel) - I([1,1:end-1],:,channel) + I([2:end,end],[2:end,end],channel) - I([1,1:end-1],[2:end,end],channel))./4).^2 + ( I(:,[2:end,end],channel) - I(:,:,channel) ).^2 );GradientE = 1./(GradientE_m + epsilon);GradientS = 1./(GradientS_m + epsilon);GradientW = 1./(GradientW_m + epsilon);GradientN = 1./(GradientN_m + epsilon);Temp = GradientE + GradientS + GradientW + GradientN;Temp = Temp + (Temp == 0).*epsilon;I(:,:,channel) = (GradientE.*I([2:end,end],:,channel) + GradientW.*I([1,1:end-1],:,channel) + GradientN.*I(:,[2:end,end],channel) + GradientS.*I(:,[1,1:end-1],channel)).*M(:,:,channel)./Temp + (1-M(:,:,channel)).*I(:,:,channel);endelsefor channel = 1:dimsGradientE_m = sqrt((I([2:end,end],:,channel) - I(:,:,channel)).^2 +  ((I([2:end,end],[2:end,end],channel) + I(:,[2:end,end],channel) - I(:,[1,1:end-1],channel) - I([2:end,end],[1,1:end-1],channel))./4).^2);GradientS_m = sqrt( (I(:,:,channel) - I(:,[1,1:end-1],channel) ).^2 +  ((I([2:end,end],:,channel) - I([1,1:end-1],:,channel) + I([2:end,end],[1,1:end-1],channel) - I([1,1:end-1],[1,1:end-1],channel) )./4).^2 );GradientW_m = sqrt( ( I(:,:,channel) - I([1,1:end-1],:,channel) ).^2 + ((I(:,[2:end,end],channel) - I(:,[1,1:end-1],channel) + I([1,1:end-1],[2:end,end],channel) - I([1,1:end-1],[1,1:end-1],channel))./4).^2 );GradientN_m =  sqrt( ( ( I([2:end,end],:,channel) - I([1,1:end-1],:,channel) + I([2:end,end],[2:end,end],channel) - I([1,1:end-1],[2:end,end],channel))./4).^2 + ( I(:,[2:end,end],channel) - I(:,:,channel) ).^2 );GradientE = 1./(GradientE_m + epsilon);GradientS = 1./(GradientS_m + epsilon);GradientW = 1./(GradientW_m + epsilon);GradientN = 1./(GradientN_m + epsilon);Temp = GradientE + GradientS + GradientW + GradientN + lambda;Temp = Temp + (Temp == 0).*epsilon;I(:,:,channel) = (GradientE.*I([2:end,end],:,channel) + GradientW.*I([1,1:end-1],:,channel) + GradientN.*I(:,[2:end,end],channel) + GradientS.*I(:,[1,1:end-1],channel) + lambda*I(:,:,channel)).*M(:,:,channel)./Temp + (1-M(:,:,channel)).*I(:,:,channel);endend% if FlagNoiseotherwise %灰度图像if FlagNoise == 0GradientE_m = sqrt((I([2:end,end],:) - I).^2 +  ((I([2:end,end],[2:end,end]) + I(:,[2:end,end]) - I(:,[1,1:end-1]) - I([2:end,end],[1,1:end-1]))./4).^2);GradientS_m = sqrt( (I - I(:,[1,1:end-1]) ).^2 +  ((I([2:end,end],:) - I([1,1:end-1],:) + I([2:end,end],[1,1:end-1]) - I([1,1:end-1],[1,1:end-1]) )./4).^2 );GradientW_m = sqrt( ( I - I([1,1:end-1],:) ).^2 + ((I(:,[2:end,end]) - I(:,[1,1:end-1]) + I([1,1:end-1],[2:end,end]) - I([1,1:end-1],[1,1:end-1]))./4).^2 );GradientN_m =  sqrt( ( ( I([2:end,end],:) - I([1,1:end-1],:) + I([2:end,end],[2:end,end]) - I([1,1:end-1],[2:end,end]))./4).^2 + ( I(:,[2:end,end]) - I ).^2 );GradientE = 1./(GradientE_m + epsilon);GradientS = 1./(GradientS_m + epsilon);GradientW = 1./(GradientW_m + epsilon);GradientN = 1./(GradientN_m + epsilon);Temp = GradientE + GradientS + GradientW + GradientN;Temp = Temp + (Temp == 0).*epsilon;I = (GradientE.*I([2:end,end],:) + GradientW.*I([1,1:end-1],:) + GradientN.*I(:,[2:end,end]) + GradientS.*I(:,[1,1:end-1])).*M./Temp + (1-M).*I;elseGradientE_m = sqrt((I([2:end,end],:) - I).^2 +  ((I([2:end,end],[2:end,end]) + I(:,[2:end,end]) - I(:,[1,1:end-1]) - I([2:end,end],[1,1:end-1]))./4).^2);GradientS_m = sqrt( (I - I(:,[1,1:end-1]) ).^2 +  ((I([2:end,end],:) - I([1,1:end-1],:) + I([2:end,end],[1,1:end-1]) - I([1,1:end-1],[1,1:end-1]) )./4).^2 );GradientW_m = sqrt( ( I - I([1,1:end-1],:) ).^2 + ((I(:,[2:end,end]) - I(:,[1,1:end-1]) + I([1,1:end-1],[2:end,end]) - I([1,1:end-1],[1,1:end-1]))./4).^2 );GradientN_m =  sqrt( ( ( I([2:end,end],:) - I([1,1:end-1],:) + I([2:end,end],[2:end,end]) - I([1,1:end-1],[2:end,end]))./4).^2 + ( I(:,[2:end,end]) - I ).^2 );GradientE = 1./(GradientE_m + epsilon);GradientS = 1./(GradientS_m + epsilon);GradientW = 1./(GradientW_m + epsilon);GradientN = 1./(GradientN_m + epsilon);Temp = GradientE + GradientS + GradientW + GradientN + lambda;Temp = Temp + (Temp == 0).*epsilon;I = (GradientE.*I([2:end,end],:) + GradientW.*I([1,1:end-1],:) + GradientN.*I(:,[2:end,end]) + GradientS.*I(:,[1,1:end-1]) + lambda*I).*M./Temp + (1-M).*I;end %if FlagNoise
end% switch dims
end% function
function v = getoptions(options, name, v, mendatory)% getoptions - retrieve options parameter
%
%   v = getoptions(options, 'entry', v0);
% is equivalent to the code:
%   if isfield(options, 'entry')
%       v = options.entry;
%   else
%       v = v0;
%   end
%
%   Copyright (c) 2007 Gabriel Peyreif nargin<4mendatory = 0;
endif isfield(options, name)v = eval(['options.' name ';']);
elseif mendatoryerror(['You have to provide options.' name '.']);
end 


function [U,point_list] = grab_inpainting_mask(M, options)% grab_inpainting_mask - create a mask from user input
%
%   U = grab_inpainting_mask(M, options);
%
%   Select set of point in an image (useful to select a region for
%   inpainting). The set of point is U==Inf.
%
%   options.r is the radius for selection (default r=5).
%
%   Selection stops with right click.
%
%   Set options.mode='points' to gather disconnected points.
%   Set options.mode='line' to gather connected lines.
%
%   Copyright (c) 2006 Gabriel Peyreif nargin==3 && method==1U = grab_inpainting_mask_old(M, options);return;
endoptions.null = 0;
r = getoptions(options, 'r', 5);
method = getoptions(options, 'mode', 'points');if strcmp(method, 'line')if not(isfield(options, 'point_list'))[V,point_list] = pick_polygons(rescale(sum(M,3)),r);elsepoint_list = options.point_list;V = draw_polygons(rescale(sum(M,3)),r,point_list);end        U = M; U(V==1) = Inf;return;
endm = size(M,1);
n = size(M,2);
s = size(M,3);U = sum(M,3)/3;
b = 1;
[Y,X] = meshgrid(1:n,1:m); 
point_list = [];
while b==1clf;hold on;imagesc(rescale(M)); axis image; axis off; colormap gray(256);[y,x,b] = ginput(1);point_list(:,end+1) = [x;y];I = find((X-x).^2 + (Y-y).^2 <= r^2 );U(I) = Inf;for k=1:sMa = M(:,:,k);Ma(I) = 0;M(:,:,k) = Ma;end
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function sk = draw_polygons(mask,r,point_list)sk = mask*0;
for i=1:length(point_list)pl = point_list{i};for k=2:length(pl)sk = draw_line(sk,pl(1,k-1),pl(2,k-1),pl(1,k),pl(2,k),r);end
endfunction [sk,point_list] = pick_polygons(mask,r)% pick_polygons - ask for the user to build a set of curves
%
%   sk = pick_polygons(mask,r);
%
%   mask is a background image (should be in [0,1] approx).
%
%   The user right-click on a set of point which create a curve.
%   Left click stop a curve.
%   Another left click stop the process.
%
%   Copyright (c) 2007 Gabriel Peyren = size(mask,1);sk = zeros(n);
point_list = {};
b = 1;
while b(end)==1% draw a lineclf;imagesc(mask+sk); axis image; axis off;colormap gray(256);[y1,x1,b] = ginput(1);pl = [x1;y1];while b==1clf;imagesc(mask+sk); axis image; axis off;[y2,x2,c] = ginput(1);if c~=1if length(pl)>1point_list{end+1} = pl;endbreak;endpl(:,end+1) = [x2;y2];sk = draw_line(sk,x1,y1,x2,y2,r);x1 = x2; y1 = y2;end
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function sk = draw_line(sk,x1,y1,x2,y2,r)n = size(sk,1);
[Y,X] = meshgrid(1:n,1:n);
q = 80;
t = linspace(0,1,q);
x = x1*t+x2*(1-t); y = y1*t+y2*(1-t);
if r==0x = round( x ); y = round( y );sk( x+(y-1)*n ) = 1;
elsefor k=1:qI = find((X-x(k)).^2 + (Y-y(k)).^2 <= r^2 );sk(I) = 1;end
endfunction U = grab_inpainting_mask_old(M, r)% grab_inpainting_mask - create a mask from user input
%
%   U = grab_inpainting_mask(M, r);
%
%   r is the radius for selection (default r=5).
%
%   Selection stops with right click.
%
%   Copyright (c) 2006 Gabriel Peyr?if nargin<2r = 5;
endm = size(M,1);
n = size(M,2);
s = size(M,3);U = sum(M,3)/3;
b = 1;
[Y,X] = meshgrid(1:n,1:m); 
while b==1clf;hold on;imagesc(rescale(M)); axis image; axis off; colormap gray(256);[y,x,b] = ginput(1);I = find((X-x).^2 + (Y-y).^2 <= r^2 );U(I) = Inf;for k=1:sMa = M(:,:,k);Ma(I) = 0;M(:,:,k) = Ma;end
end


function y = rescale(x,a,b)% rescale - rescale data in [a,b]
%
%   y = rescale(x,a,b);
%
%   Copyright (c) 2004 Gabriel Peyr?if nargin<2a = 0;
end
if nargin<3b = 1;
endm = min(x(:));
M = max(x(:));if M-m<epsy = x;
elsey = (b-a) * (x-m)/(M-m) + a;
end

3. 模型效果



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

相关文章

图像修复 学习笔记

目录 局部卷积&#xff08;PConv&#xff09;图像修复 Pconv torch 实现&#xff1a; 局部卷积&#xff08;PConv&#xff09;图像修复 本文提出了局部卷积&#xff08;PConv&#xff09;层来处理不规则孔。图1显示了使用建议的PConv的一些修复结果。看样子还不错&#xff0…

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

1、内容简介 略 516-可以交流、咨询、答疑 2、内容说明 摘 要&#xff1a;针对 Criminisi算法难以获得理想的修复效果&#xff0c;且存在修复时间过长等缺陷&#xff0c;提出一种改进 Criminisi算法的 图像修复算法。改进优先权计算方式找到最优待修复块&#xff0c;完善最优…

图像修复简介

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

Halcon图像修复

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

图像修复

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

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

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

图像修复介绍

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

【OpenCV】- 图像修复

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

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

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

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

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

Linux udhcpc/udhcpd 移植

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

udhcpc6的default.script

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

UNIX source code-DHCP

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

udhcpc 移植和使用

问题描述&#xff1a; busybox udhcpc获取IP&#xff0c;但没有自动将获取到的ip设置到网卡上&#xff0c;并且没有自动设置网关&#xff0c;路由表等。必须手动设置才能连接外网。 解决方案&#xff1a; udhcpc可以通过-s参数指定运行脚本&#xff0c;当获取到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;…