图像修复模型——TV模型

图像修复模型——TV模型1 参考文献 2 TV 图像修复模型 2 1TV 模型 demo TV m Author HSW Date 2015 3 25 HARBININSTIT setmatlabclo clearall clc options null 0 readimageImg imread Image but

1. 参考文献

图像修复模型——TV模型

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(:)) < 2 Img = Img*255; end FlagColor = (size(Img,3) == 3); % set mask SetMask = 2; if SetMask == 1 % read mask Mask = imread('Mask\peppers_mask512.bmp'); Mask = Mask > 5; MFlagColor = (size(Mask,3) == 3); if MFlagColor ~= FlagColor && FlagColor == 1 Mask = repmat(Mask,[1,1,3]); elseif MFlagColor ~= FlagColor && FlagColor == 0 Mask = Mask(:,:,1); end elseif SetMask == 2 % Interactively set mask if not(exist('grab_mode')) grab_mode = 'line'; end options.grab_mode = grab_mode; if not(exist('grab_radius')) grab_radius = 4; end switch grab_mode case '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 %switch Iin = find(U(:,:,1) == Inf); Iout = find(U(:,:,1) ~= Inf); m1 = length(Iin); % 缺损点的总数 % product the mask Mask = zeros(size(Img)); if FlagColor == 1 tmpMask = zeros([size(Img,1),size(Img,2)]); for channel = 1:3 tmpMask(Iin) = 1 ; Mask(:,:,channel) = tmpMask; end else Mask(Iin) = 1; % 缺损区域为1 end % if FlagColor end% if SetMask FlagNoise = 0; % default noiseless if FlagNoise == 1 sigma = 25; nImg = Img + sigma*randn(size(Img)); else nImg = Img; end nImg = (1-Mask).*nImg; PSNRin = 10*log10(255^2/mean((Img(:)-nImg(:)).^2)); InImg = nImg; % Initial Image if FlagColor == 1 Positions = find(Mask(:,:,1) == 1); for channel = 1:3 tmpnImg = nImg(:,:,channel); tmpnImg(Positions) = floor(255*rand(1,length(Positions))) + 1; InImg(:,:,channel) = tmpnImg; end else Positions = 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 == 1 lambda = 1; end I = InImg; for iter = 1:IterNum I = TV_inpaint_gray_color(I,Mask,lambda,FlagNoise); if mod(iter,100) == 0 figure; imshow(I/255,[]); title(['Results of iterNum = ',num2str(iter)]); end end %for iter I = 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 dims case 3 %彩色图像 if FlagNoise == 0 for channel = 1:dims GradientE_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); end else for channel = 1:dims GradientE_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); end end% if FlagNoise otherwise %灰度图像 if FlagNoise == 0 GradientE_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; else GradientE_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 Peyre if nargin<4 mendatory = 0; end if isfield(options, name) v = eval(['options.' name ';']); elseif mendatory error(['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 Peyre if nargin==3 && method==1 U = grab_inpainting_mask_old(M, options); return; end options.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); else point_list = options.point_list; V = draw_polygons(rescale(sum(M,3)),r,point_list); end U = M; U(V==1) = Inf; return; end m = 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==1 clf; 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:s Ma = 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 end function [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 Peyre n = size(mask,1); sk = zeros(n); point_list = {}; b = 1; while b(end)==1 % draw a line clf; imagesc(mask+sk); axis image; axis off; colormap gray(256); [y1,x1,b] = ginput(1); pl = [x1;y1]; while b==1 clf; imagesc(mask+sk); axis image; axis off; [y2,x2,c] = ginput(1); if c~=1 if length(pl)>1 point_list{end+1} = pl; end break; end pl(:,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==0 x = round( x ); y = round( y ); sk( x+(y-1)*n ) = 1; else for k=1:q I = find((X-x(k)).^2 + (Y-y(k)).^2 <= r^2 ); sk(I) = 1; end end function 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<2 r = 5; end m = 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==1 clf; 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:s Ma = 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<2 a = 0; end if nargin<3 b = 1; end m = min(x(:)); M = max(x(:)); if M-m 
   

3. 模型效果

图像修复模型——TV模型

图像修复模型——TV模型


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217871.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:34
下一篇 2026年3月18日 上午8:35


相关推荐

  • systemctl使用reload及踩坑

    systemctl使用reload及踩坑1 demo service 文件 Unit Description demo demoserverDo http git demo com demoAfter network targetremote fs targetnss lookup target Service Type sampleUser rootPIDFile run demo

    2025年10月13日
    5
  • n8n安装教程,一键打造免费开源的AI自动化工具

    n8n安装教程,一键打造免费开源的AI自动化工具

    2026年3月15日
    2
  • BAT机器学习面试1000题系列(第1~305题)

    BAT机器学习面试1000题系列整理:July、元超、立娜、德伟、贾茹、王剑、AntZ、孟莹等众人。本系列大部分题目来源于公开网络,取之分享,用之分享,且在撰写答案过程中若引用他人解析则必注明原作者及来源链接。另,不少答案得到寒小阳、管博士、张雨石、王赟、褚博士等七月在线名师审校。说明:本系列作为国内首个AI题库,首发于七月在线实验室公众号上:julyedulab,并部分更新…

    2022年4月6日
    34
  • Data URI scheme「建议收藏」

    Data URI scheme「建议收藏」什么是DataURISchemedataURIscheme允许我们使用内联(inline-code)的方式在网页中包含数据,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。常用于将图片嵌入网页。HTML中网页图片一般是https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=162360699,3…

    2022年10月19日
    4
  • sql if语句实例[通俗易懂]

    sql if语句实例[通俗易懂]if函数语法:if(booleantestCondition,value1,value2)返回值:当判断条件testCondition为TRUE时,返回value1;否则返回value2示例:原始数据转化:SELECTapp_list,if(account_id>20,1,0)FROMtemp.bdl_op_crawler_loan0902…

    2022年7月17日
    16
  • Pycharm激活方法(active code)

    Pycharm激活方法(active code)第一步,将“0.0.0.0 account.jetbrains.com”添加到hosts文件中第二步,输入activecode,提交详情见:http://idea.lanyus.com/

    2022年8月26日
    124

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号