matlab图像局部放大算法
程序员文章站
2022-05-20 22:01:33
...
此代码可从https://github.com/TimeIvyace/Partial-Enlargement-of-Image.git中下载
本算法简单的实现了图像局部放大的效果,算法需要确定放大区域的中心坐标点,以及放大圆形区域的半径和放大强度,来进行放大区域内的等比例放大,与美图秀秀的大眼功能类似。以人脸图像放大眼睛为例。在使用机器学习等算法得到人脸68个特征点的基础上,我们可以大致确定眼珠中点的位置。
由此可以大致得到左眼中心点位置为坐标37和40的中点,右眼中心点位置为坐标43和46的中点。接下来,通过设置放大区域半径以及放大强度,则可以实现眼睛放大。
局部放大算法代码:
function J=bigger(I,pointx,pointy,r)
%I为原图像,pointx和pointy为放大中心点坐标,r为放大半径
im=I;
%分别得到放大区域的上下左右坐标
left=round(pointy-r);
right=round(pointy+r);
top=round(pointx-r);
bottom=round(pointx+r);
%放大区域面积
space = r * r;
strength=30; %放大强度
%原图像为彩色图像,要分成RGB三个分量进行处理
fr=im(:,:,1);
fg=im(:,:,2);
fb=im(:,:,3);
im2fr=fr;
im2fg=fg;
im2fb=fb;
%插值算法
for x=top:bottom
offsetx=x-pointx;
for y=left:right
offsety=y-pointy;
xy=offsetx*offsetx+offsety*offsety;
if xy<=space
%等比例放大
scale=1-xy/space;
scale=1-strength/100*scale;
%posy和posx为放大后坐标值
%采用最近邻插值算法
posy=round(offsety*scale+pointy);
posx=round(offsetx*scale+pointx);
im2fr(x,y)=fr(posx,posy);
im2fg(x,y)=fg(posx,posy);
im2fb(x,y)=fb(posx,posy);
end
end
end
%将RGB三个分量整合,得到彩色图像
J=cat(3,im2fr,im2fg,im2fb);
算法没有对图像边界进行判断,若放大区域超出图片范围,则会出错。插值算法使用的是最简单的最近邻算法,所以放大区域边界并不是特别平滑,接下来可以使用更高阶的插值算法进行改进。通过修改放大半径r以及放大强度strength,可以得到一个较为满意的效果。