前言:图像修复是一项非常有意义的研究工作,比如我们生活中的照片被污染,再比如名贵字画、国家文物壁画等珍贵物品被破坏,这些都需要图像修复工作来完成。

简介:整体变分(Total Variation)的方法最早是用来对受到噪声污染的图像进行降噪的,在这方面的应用最早是由L.Rudin和S.Osher等人在1992年提出的,2002年Chan等人把TV模型推广到图像修补中,并提出了基于TV模型的图像修补方法,同时说明了TV修补模型的缺点,进一步提出了CDD修补模型(curvature driven diffusions),此修补模型改正了TV修补模型的缺陷,对图像的修补具有很好的效果。

一、TV模型介绍

如图所示:D区域是被污染区(待修复),E是D的邻域

下面直接给出TV模型的数学公式:

                      ①

其中:u是图像中的像素点,λ为设定的参数

在该模型基础上,考虑到噪声的影响,边界E区域产生的噪声不能超过一定的范围;根据最佳猜测和贝叶斯理论,要求图像u在满足约束条件下使它的能量泛函最小,因此约束条件记做:公式②。根据拉格朗日乘数法,将①②方程转化成为一个求极值的方程,对其求导数并令其等于0,可得到如下方程:

其中:div代表散度(关于图像中的散度解释,可见此处:在图像处理中,散度 div 具体的作用是什么?)

由于图像是离散的数值,故可看做如下构成。其中:O为污染点,邻域B=(N,S,W,E),半像素邻域B‘ =(n,s,w,e)。

因此,离散化后可得到表达式:

化简得到最终的表达式:

其中:λe(O)为中心O处的λ参数,与上λe一致;uo为O点修复后的像素,另一个为O点修复前的原始像素。将上式迭代,知道达到较好的修复效果。

到此,TV模型的理论推导已完成。接下来就是要编程实现其功能。

matlab源码实现:

1 img=double(imread(‘lena.jpg‘));2 mask=imread(‘mask.jpg‘);3 a1=find(mask>127);4 b1=find(mask<=127);5 mask(a1)=0;6 mask(b1)=255;7 [m n]=size(img);8 for i=1:m9 for j=1:n10 if mask(i,j)==0

11 img(i,j)=0;12 end13 end14 end15 imshow(img,[]); %合成的需要修复的图像16

17 lambda=0.2;18 a=0.5;%避免分母为019 imgn=img;20 for l=1:1500 %迭代次数21 for i=2:m-1

22 for j=2:n-1

23 if mask(i,j)==0 %如果当前像素是被污染的像素,则进行处理24 Un=sqrt((img(i,j)-img(i-1,j))^2+((img(i-1,j-1)-img(i-1,j+1))/2)^2);25 Ue=sqrt((img(i,j)-img(i,j+1))^2+((img(i-1,j+1)-img(i+1,j+1))/2)^2);26 Uw=sqrt((img(i,j)-img(i,j-1))^2+((img(i-1,j-1)-img(i+1,j-1))/2)^2);27 Us=sqrt((img(i,j)-img(i+1,j))^2+((img(i+1,j-1)-img(i+1,j+1))/2)^2);28

29 Wn=1/sqrt(Un^2+a^2);30 We=1/sqrt(Ue^2+a^2);31 Ww=1/sqrt(Uw^2+a^2);32 Ws=1/sqrt(Us^2+a^2);33

34 Hon=Wn/((Wn+We+Ww+Ws)+lambda);35 Hoe=We/((Wn+We+Ww+Ws)+lambda);36 How=Ww/((Wn+We+Ww+Ws)+lambda);37 Hos=Ws/((Wn+We+Ww+Ws)+lambda);38

39 Hoo=lambda/((Wn+We+Ww+Ws)+lambda);40 value = Hon*img(i-1,j)+Hoe*img(i,j+1)+How*img(i,j-1)+Hos*img(i+1,j)+Hoo*img(i,j);41 imgn(i,j)=value;42 end43 end44 end45 img=imgn;46 end47 figure;48 imshow(img)

opencv源码实现:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8

9 using namespacecv;10

11 int main(void)12 {13 //读取原始图像及掩模图像

14 IplImage *src_uint8 = cvLoadImage("src.jpg", CV_LOAD_IMAGE_GRAYSCALE);15 IplImage *mask = cvLoadImage("mask.jpg", CV_LOAD_IMAGE_GRAYSCALE);16 //合成需要修复的图像

17 int M = mask->height;18 int N = mask->width;19 inti, j;20 CvMat *src = cvCreateMat(M, N, CV_32FC1);//存放浮点图像

21 cvConvert(src_uint8, src);22 for (i = 0; i < M; i++)23 {24 for (j = 0; j < N; j++)25 {26 if ((mask->imageData + i * mask->widthStep)[j] < 0)//理解此处判别条件,根据情况自行更改

27 {28 ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j] = 0.0;29 }30 if (((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j] < 0)31 {32 ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j] += 256.0;33 }34 }35 }36 cvConvert(src, src_uint8);37 cvShowImage("需要修复的图像", src_uint8);38 cvWaitKey(0);39

40 double t = getTickCount();//当前滴答数

41 float lambda = 0.2;42 float delta = 0.5;43 floatUO, UN, UW, US, UE, UNE, UNW, USW, USE;44 floatUn, Ue, Uw, Us;45 floatWn, We, Ww, Ws;46 floatHon, Hoe, How, Hos;47 floatHoo;48 int iteration = 500;49 while(iteration)50 {51 for (i = 1; i < M - 1; i++)52 {53 for (j = 1; j < N - 1; j++)54 {55 if (((char *)(mask->imageData + i * mask->widthStep))[j] < 0)//坏损区

56 {57 UO = ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j];58 UN = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i-1)))[j];59 US = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i+1)))[j];60 UE = ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j+1];61 UW = ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j-1];62

63 UNE = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i-1)))[j+1];64 UNW = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i-1)))[j-1];65 USE = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i+1)))[j+1];66 USW = ((float*)(void*)(src->data.ptr + (size_t)src->step*(i+1)))[j-1];67

68 Un = sqrt((UO - UN) * (UO - UN) + ((UNW - UNE) / 2.0) * ((UNW - UNE) / 2.0));69 Ue = sqrt((UO - UE) * (UO - UE) + ((UNE - USE) / 2.0) * ((UNE - USE) / 2.0));70 Uw = sqrt((UO - UW) * (UO - UW) + ((UNW - USW) / 2.0) * ((UNW - USW) / 2.0));71 Us = sqrt((UO - US) * (UO - US) + ((USW - USE) / 2.0) * ((USW - USE) / 2.0));72

73 Wn = 1.0/sqrt(Un * Un + delta *delta);74 We = 1.0/sqrt(Ue * Ue + delta *delta);75 Ww = 1.0/sqrt(Uw * Uw + delta *delta);76 Ws = 1.0/sqrt(Us * Us + delta *delta);77

78 Hon = Wn/(Wn+We+Ww+Ws+lambda);79 Hoe = We/(Wn+We+Ww+Ws+lambda);80 How = Ww/(Wn+We+Ww+Ws+lambda);81 Hos = Ws/(Wn+We+Ww+Ws+lambda);82

83 Hoo = lambda/(Wn+We+Ww+Ws+lambda);84 ((float*)(void*)(src->data.ptr + (size_t)src->step*i))[j]=(Hon*UN+Hoe*UE+How*UW+Hos*US+Hoo*UO);85 }86 }87 }88 iteration--;89 }90 cvConvert(src, src_uint8);91 t = ((double)getTickCount() - t)/getTickFrequency();92 printf("算法用时:%f秒\n", t);93 cvShowImage("修复结果", src_uint8);94 cvWaitKey(0);95 }

由于迭代次数和浮点数的运算,使得算法时间较长,效果如下,仔细观察可以看出仍有细节处修复效果不是很理想。在TV模型之后,又出现了许多改进的TV模型,在速度和效果上都比理想,此处不深入探讨。

原文:http://www.cnblogs.com/hxjbc/p/6675901.html

cdd 变分 图像修复 matlab,图像修复中的TV模型相关推荐

  1. 图像修复中的TV模型

    转载至http://blog.csdn.net/hujingshuang/article/details/44257179 前言:图像修复是一项非常有意义的研究工作,比如我们生活中的照片被污染,再比如 ...

  2. 【图像修复】浅析:图像修复中的TV模型

    前言:图像修复是一项非常有意义的研究工作,比如我们生活中的照片被污染,再比如名贵字画.国家文物壁画等珍贵物品被破坏,这些都需要图像修复工作来完成. 简介:整体变分(Total Variation)的方 ...

  3. 图像仿射变换matlab,图像的仿射变换原理和实现

    图像的仿射变换原理和实现 发布时间:2018-05-06 01:03, 浏览次数:1148 仿射变换能够保持图像的"平直性",包括旋转,缩放,平移,错切操作.一般而言,仿射变换矩阵 ...

  4. 非负矩阵图像融合MATLAB,图像融合的非负矩阵分解算法

    第 17 卷 第 9 期 2005 年 9 月 计算机辅助设计与图形学学报 JOURNAL OF COMPUTER2AIDED DESIGN & COMPUTER GRAPHICS Vol17 ...

  5. 一种从Robotstudio环境中导出机器人模型并在MATLAB下使其可视化的研究记录

    1.前记:回到学校反而没时间记录了自己瞎折腾的东西了,允我长长的叹一口气   '_' // 先提一下,在这篇MATLAB机器人可视化博客中提到了如何使CAD模型的机器人在MATLAB环境下可视化的问题 ...

  6. matlab练习程序(TV模型图像修复)

    曾经想要实现过Bertalmio图像修复算法,无奈自身实力不够,耗费两天时间也没能实现.昨天博客上有人问到TV模型,这个模型我过去是没听说过的,于是就找来相关论文研究了一下,发现TV模型也可以用来修复 ...

  7. 图像修复模型——TV模型

    1. 参考文献 2. TV图像修复模型 2.1 TV模型 % demo_TV.m % Author: HSW % Date: 2015/3/25 % HARBIN INSTITUTE OF TECHN ...

  8. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓

    第8章 图像轮廓与图像分割修复 8.1 查找并绘制轮廓 8.1.1 寻找轮廓:findContours()函数 1.作用:在二值图像中寻找轮廓 2.函数原型: void findcontours(In ...

  9. Opencv实战【3】——图像修复与图像锐化(darling in the franxx)

    目录 前言 图像修复 图像锐化 darling in the franxx图片 总结 前言 前天,在群里看见有人发了这张表情包: 感觉女主有点好看,然后问室友是啥番剧(darling in the f ...

最新文章

  1. 专有云到混合云,是云计算的下半场?
  2. Transformers包tokenizer.encode()方法源码阅读笔记
  3. jakarta_MicroProfile在Jakarta EE时代的作用
  4. java 方法泛型_Java基础学习,什么是泛型概念,使用泛型有哪些好处?
  5. Python教程:os 与 sys 模块详细用法
  6. python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究
  7. SpringBoot约定大于配置的特性解读 SpringBoot快速入门
  8. 软件测试程序员每天的工作都是做什么的?有哪些是必须要做的?
  9. Java 实现MD5
  10. 最新版Eclipse下载及安装(详细)
  11. word自动生成目录等
  12. 华为路由与交换 eSight基本概述学习笔记
  13. 象棋巫师魔法学校/象棋路边摊 前1050关
  14. 迪士尼挖角波士顿动力,耗时3年打造漫威英雄机器人,1:1复刻效果堪比CG
  15. 成为阿里云大使的笔记
  16. java解析ip地址_通过JAVA解析IP地址
  17. 安卓开发VideoView播放本地视频失败解决办法
  18. CST仿真指导 | 如何构建个性化的用户界面
  19. rs232串口通讯模块 - Delphi编程
  20. 【C++】面向对象之封装篇(下)

热门文章

  1. jpeg图像压缩原理
  2. scotland yard
  3. 头像上传(限制大小,格式,尺寸)
  4. github.io网页无法打开(连接不是私密连接)
  5. ibatis java.util.Map作为parameterClass和resultClass(转)
  6. 生成android使用的BKS证书
  7. 如何查看apk安装包源代码??Android反编译apk,解包,打包,签名一体化实测 ,修改图片音频软件名称版本号等入门
  8. 力学专业做cae需要学c语言吗,CAE工程师是需要掌握力学知识到何种程度?
  9. 关于renameTo的用法
  10. 百度的冬天:曾梦想成伟大公司 却为何陷入危机