前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原-图像处理基础(二)图像的放大与缩小

原-图像处理基础(二)图像的放大与缩小

作者头像
Pulsar-V
发布2018-04-28 13:40:30
2.9K0
发布2018-04-28 13:40:30
举报
文章被收录于专栏:Pulsar-VPulsar-V

最近邻插值法

输入图片说明
输入图片说明

其中

  • size(g(x))代表图像像素矩阵列宽
  • size(g(y))代表图像像素矩阵行高
  • scale 代表缩放倍数
代码语言:javascript
复制
\begin{matrix} 
f(x)=g(round(x),round(y)) \\ 
 round(x)=\frac {size(g(x))}{ scale}\\
 round(y)=\frac {size(g(y))}{ scale}\\
\end{matrix}

Matlab代码

代码语言:javascript
复制
%输入参数 源图像,放大倍数
function dst=imageNearestNeighbor(src,scale)
Row=size(src,1);  
Col=size(src,2);%图像行数和列数  
max_row=round(scale*Row);%求出变换后的坐标的最大值  
max_col=round(scale*Col);  
B=zeros(max_row,max_col,3);%定义变换后的图像  3表示3个通道(RGB)
for new_row=1:max_row
  for new_col=1:max_col
     x=round(new_row/scale);  
     y=round(new_col/scale);%最小临近法对图像进行插值  
     %处理边缘  
     if x==0 x=1;end  
     if y==0 y=1;end  
     if x>Row x=Row;end  %溢出处理
     if y>Col y=Col;end  %溢出处理
     B(i,j,:)=A(x,y,:);  %B(i,j)像素点对应A最近邻点A(x,y)
   end  
end  
B=uint8(B);%将矩阵转换成8位无符号整数   

OpenCV代码

代码语言:javascript
复制
//待更新

双线性插值

Matlab代码

代码语言:javascript
复制
%采用双线性内插值对图像进行缩放处理
%参数n表示缩放的倍数
function []=scale2(n)
ima=imread('test.jpg'); %读取原图像
ima=double(ima); %二维矩阵转为双精度类型
swh=size(ima); %获取原图像的宽高
sh=swh(:,1); %获取原图像的高
sw=swh(:,2); %获取原图像的宽
 
%"加墙"
ima2=zeros(sh+2,sw+2);
ima2(1,2:sw+1)=ima(1,:); %原图像上边加墙,灰度值与边界一致
ima2(sh+2,2:sw+1)=ima(sh,:); %原图像下边加墙,灰度值与边界一致
ima2(2:sh+1,2:sw+1)=ima; %将原图像赋值给中心部分
ima2(:,1)=ima2(:,2); %原图像左边加墙,灰度值与边界一致
ima2(:,sw+2)=ima2(:,sw+1); %原图像右边加墙,灰度值与边界一致
 
dw=sw*n; %计算缩放后的图像的宽
dh=sh*n; %计算缩放后的图像的高
 
dw1=round((sw+2)*n); %计算加墙后缩放的图像的宽
dh1=round((sh+2)*n); %计算加墙后缩放的图像的高
 
resIma1=zeros(dh1,dw1); %创建原图像的矩阵
 
%从不是“墙”的位置开始计算缩放后的图像的各点灰度值
%考虑缩小图像时,输入的缩放倍数是小数,需进行取整
start=round(n+1);
endI=round(dh+n);
endJ=round(dw+n);
 
for i=start:endI
    for j=start:endJ
        tx=i/n; %缩放后的图像坐标在原图像处的位置
        ty=j/n;
        tdx=tx-floor(tx); %得到小数坐标
        tdy=ty-floor(ty);
        %确定临近四个角的坐标
        %Q11点
        Q11x=tx-tdx;
        Q11y=ty-tdy;
        %Q12点
        Q12x=tx-tdx;
        Q12y=Q11y+1;
        %Q21点
        Q21x=Q11x+1;
        Q21y=Q11y;
        %Q22点
        Q22x=Q11x+1;
        Q22y=Q11y+1;
        %根据双线性内插算法,算出缩放后的图像在(i,j)点处的灰度值
        resIma1(i,j)=tdx*tdy*ima2(Q11x,Q11y)+(1-tdx)*tdy*ima2(Q12x,Q12y)+tdx*(1-tdy)*ima2(Q21x,Q21y)+(1-tdy)*(1-tdx)*ima2(Q22x,Q22y);
    end
end
resIma=resIma1(n+1:dh+n,n+1:dw+n); %截取除墙外的中心部分
resIma=uint8(resIma);
imshow(resIma); %显示缩放后的图像
end

OpenCV 代码

代码语言:javascript
复制
//待填坑

**附上一道很经典的 双线性插值 面试题 ** 已知Q12,Q22,Q11,Q21的坐标如图1,求P点的坐标

输入图片说明
输入图片说明

双三次插值

代码语言:javascript
复制
//笔者编程能力有限,待笔者好好研究研究。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最近邻插值法
  • 双线性插值
  • 双三次插值
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档