码迷,mamicode.com
首页 > 其他好文 > 详细

一种简单的图像修复方法

时间:2018-01-02 23:34:25      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:快速迭代   nbsp   模拟   美颜   仿真   else   快速   mil   col   

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

假设输入图像为:

技术分享图片

计算方向权重:

技术分享图片

对于其他方向,操作类似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‘)

 结果如下:

技术分享图片

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

 

 

一种简单的图像修复方法

标签:快速迭代   nbsp   模拟   美颜   仿真   else   快速   mil   col   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!