一种简单的图像修复方法

该方法可以用于美颜中的祛斑,通过快速迭代的方式去除斑点。

假设输入图像为:

计算方向权重:

对于其他方向,操作类似We。

最终的输出为:

对要修复的区域,反复进行同样的操作即可。

简单的matlab仿真代码如下:

clear
clc
close all

% 设定迭代次数
iter=100;

InputData = imread(‘anish.jpg‘);
InputData = rgb2gray(InputData);
InputData = double(InputData);

[height,width]=size(InputData);
mask=ones(height,width);

% 模拟产生斑点
imshow(uint8(InputData))
[x,y] = ginput();
InputData(x-3:x+3,y-3:y+3) = 0;
mask(x-3:x+3,y-3:y+3) = 0;
OutputData=InputData;

imshow(uint8(InputData)),title(‘input‘)

for t=1:1:iter
    for i=1:1:height
        for j=1:1:width
            if mask(i,j)==0
                if j>1&&j<width
                    E=j+1;
                    W=j-1;
                elseif j==1
                    E=j+1;
                    W=j+1;
                else
                    E=j-1;
                    W=j-1;
                end
                if i>1&&i<height
                    S=i+1;
                    N=i-1;
                elseif i==1
                    S=i+1;
                    N=i+1;
                else
                    S=i-1;
                    N=i-1;
                end
                Io=OutputData(i,j);
                Ie=OutputData(i,E);
                Iw=OutputData(i,W);
                In=OutputData(N,j);
                Is=OutputData(S,j);

                Ine=OutputData(N,E);
                Inw=OutputData(N,W);
                Ise=OutputData(S,E);
                Isw=OutputData(S,W);

                We=1+(Ie-Io)^2+(Ine+In-Ise-Is)^2/16;
                We=1/sqrt(We);

                Ww=1+(Iw-Io)^2+(Inw+In-Is-Isw)^2/16;
                Ww=1/sqrt(Ww);

                Ws=1+(Is-Io)^2+(Ise+Ie-Iw-Isw)^2/16;
                Ws=1/sqrt(Ws);

                Wn=1+(In-Io)^2+(Ine+Ie-Iw-Inw)^2/16;
                Wn=1/sqrt(Wn);

                OutputData(i,j)=(Ie*We+Iw*Ww+In*Wn+Is*Ws)/(We+Ww+Ws+Wn);
            end
        end
    end
end
figure,imshow(uint8(OutputData)),title(‘output‘)

结果如下:

一般地,如果待修复的区域越大,需要迭代的次数相对就大。

原文地址:https://www.cnblogs.com/Keven-Lee/p/8179048.html

时间: 2024-10-14 19:02:42

一种简单的图像修复方法的相关文章

基于Bilateral Attention和Pyramid Filling Block的图像修复方法

One-Stage Inpainting with Bilateral Attention and Pyramid Filling Block 论文链接:https://arxiv.org/abs/1912.08642 源码地址:https://github.com/KumapowerLIU/One-Stage-Inpainting-with-Bilateral-Attention-and-Pyramid-Filling-Block 1. 引言 这篇论文解决的问题是图像修复(Image inpa

推荐一种简单易学的读书方法

推荐一种简单易学的读书方法 本文由有道云笔记推荐 前段时间我简单统计了一下,从大学毕业后到现在的6年多时间里,总共读了200多本书,平均1年读20-40本,范围涉及企业管理.营销.励志.传记.小说.历史.哲学等等.书读的多了,慢慢的也形成了一套自认为适合自己的读书方法,可以简单地用12个字进行概括:"定目标.列书单.读两遍.致运用".下面我会仔细地跟大家聊聊. 一.定目标(确定读书目标)人的时间和精力是有限的,因此读书.学习都存在成本.为了能够以最小的投入获得最大的产出,我们一定要先确

四种简单的图像显著性区域特征提取方法-----&gt; AC/HC/LC/FT。

四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient region detec显著性检测 laviewpbt  2014.8.3 编辑 Email:[email protected]   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以下将研究的一些收获和经验共享.      先从最简单的最容易实现的算法说起吧: 1

一种简单的ELF加固方法

介绍一种ELF文件函数粒度的加固方法,可以有效防止对程序的静态分析.这是一种有源码加固方式,需要被加固程序中代码配合.加固流程如下: 1)读取ELF文件头,获取e_phoff和e_phnum2)通过Elf64_Phdr中的p_type字段,找到DYNAMIC3)遍历.dynamic,找到.dynsym..dynstr 节区偏移,和.dynstr节区的大小4)遍历.dynsym,找到函数对应的Elf64_Sym符号后,根据st_value和st_size字段找到函数在ELF的偏移和函数大小5)根据

一种简单的图像隐写

其实看完摘要,基本上原理就已经很明白了,就是通过一个全偶数的"刻板",将刻字内容刻在上面就是把对应的地方改成奇数.提取的时候把奇数部分"翻印"出来就行了.下面看一下实现. step1:找到一张图片[BMP格式],并将其所有的R通道值改成偶数 为什么非得是bmp?我昨天也被图片格式给整了一把,简单来说,在我们比较熟知的集中图片格式中,如png.jpeg.bmp,只有bmp是无压缩的,我们可以精准的控制像素值.jpg图像由于受到的压缩的影响,像素值有1-3的波动,这还怎

Gradle实现的两种简单的多渠道打包方法

Android多渠道打包Gradle多渠道打包友盟多渠道打包productFlavors 本来计划今天发Android的官方技术文档的翻译——<Gradle插件用户指南>的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了. 今天就说一下使用Gradle进行类似友盟这样的多渠道打包的方法吧. 本文原创,转载请注意在CSDN上的出处: http://blog.csdn.net/maosidiaoxian/article/details/42000913 目前我掌握的方法有两种,都非常简

IOS几种简单有效的数组排序方法

//第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1, id obj2){  if ([obj1 integerValue] > [obj2 integerValue]) {         return (NSComparisonResult)NSOrderedDescending;     }       if ([obj1 integerV

一种简单的对象赋值方法,定义实例后以{}赋值,比传统方法更简洁

public class Rectangle    {        public Point TopLeft { get; set; }        public Point BottomRight { get; set; }    } static void CompareObjectInitMethods()    {        // 传统初始化方法        Rectangle r = new Rectangle();        Point p1 = new Point()

简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT

https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1 四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 上文讲了几种简单的方法,显著性检测就是把一幅图像中最吸引人注意的部分提取出来. 我用opencv重写了LC,AC,FT三种算法,代码和效果如下: 利用频谱来做的显著性提取的方式 1.,后面的方法其实大概都是基于这个实现的,代码样子差不多 LC思路就是利用对