此代码可从/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:bottomoffsetx=x-pointx;for y=left:rightoffsety=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);endendend%将RGB三个分量整合,得到彩色图像J=cat(3,im2fr,im2fg,im2fb);
算法没有对图像边界进行判断,若放大区域超出图片范围,则会出错。插值算法使用的是最简单的最近邻算法,所以放大区域边界并不是特别平滑,接下来可以使用更高阶的插值算法进行改进。通过修改放大半径r以及放大强度strength,可以得到一个较为满意的效果。