您的位置:首页 > 其它

多媒体技术与应用之图像修复实验

2019-05-28 17:11 99 查看

普通的图像修补代码:

clear all
close all
flag = 20;%设置模板大小为41*41
I=imread('color.bmp');
subplot(121);imshow(I);title('原始图像 ') ;

[m,n,hh]=size(I); %长 宽 三层rgb
A=rgb2gray(I);%彩色图转换灰度图
I1=I;
[rowind,columnind]=find(A<4);
pointnum=length(rowind);%受污染像素的个数

rowstart=rowind-flag;
rowend=rowind+flag;%统计每个受污染像素修复模板的起止行

rowstart(rowstart<1)=1;
rowend(rowend>m)=m;%起始行不能小于1,终止行不能大于m
columnstart=columnind-flag;
columnend=columnind+flag;%统计模板的起止列
columnstart(columnstart<1)=1;
columnend(columnend>n)=n;

for num=1:pointnum%对每个受污染的像素进行修复
x=rowind(num);
y=columnind(num);

xstart=rowstart(num);
xend=rowend(num);
x1=x-xstart+1;%得到基点的相对坐标
ystart=columnstart(num);
yend=columnend(num);
y1=y-ystart+1;%得到基点的相对坐标

depthpos=A(xstart:xend,ystart:yend)>10 ; %参与加权的像素与基准点相差大于10的深度图像素点且不能是受污染点

[locind1,locind2]=find(depthpos);
W=(locind1-x1).^2+(locind2-y1).^2;% 权值为距离平方 的倒数
TT=1./W;
T=sum(TT);

Aloc=I(xstart:xend,ystart:yend,1);%对红色通道进行处理
Aloc=double(Aloc(depthpos));
R=Aloc.*TT;
R=sum(R);
I1(x,y,1)=R/T;

Aloc=I(xstart:xend,ystart:yend,2);%对绿色通道进行处理
Aloc=double(Aloc(depthpos));
R=Aloc.*TT;
R=sum(R);
I1(x,y,2)=R/T;

Aloc=I(xstart:xend,ystart:yend,3);%对蓝色通道进行处理
Aloc=double(Aloc(depthpos));
R=Aloc.*TT;
R=sum(R);

I1(x,y,3)=R/T;
end
subplot(122),imshow(I1),title(' 基于单幅图像修复 ')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: