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

简介:

最近邻插值法

输入图片说明
其中

  • size(g(x))代表图像像素矩阵列宽
  • size(g(y))代表图像像素矩阵行高
  • scale 代表缩放倍数
\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代码

%输入参数 源图像,放大倍数
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代码

//待更新

双线性插值

Matlab代码

%采用双线性内插值对图像进行缩放处理
%参数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 代码

//待填坑

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

双三次插值

//笔者编程能力有限,待笔者好好研究研究。
目录
相关文章
|
机器学习/深度学习 传感器 算法
【交互式阈值二进制图像】采用彩色或单色图像通过交互/手动方式阈值单色图像或彩色图像的单个色带研究(Matlab代码实现)
【交互式阈值二进制图像】采用彩色或单色图像通过交互/手动方式阈值单色图像或彩色图像的单个色带研究(Matlab代码实现)
|
机器学习/深度学习
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
深度学习数据增强方法-内含(亮度增强,对比度增强,旋转图图像,翻转图像,仿射变化扩充图像,错切变化扩充图像,HSV数据增强)七种方式进行增强-每种扩充一张实现7倍扩)+ 图像缩放代码-批量
|
6月前
|
算法 计算机视觉
图像处理之基于像素的图像混合
图像处理之基于像素的图像混合
40 1
|
6月前
|
算法 计算机视觉
图像处理之图像快速旋转算法
图像处理之图像快速旋转算法
454 1
|
7月前
|
计算机视觉 索引
【OpenCV】—ROI区域图像叠加&图像混合
【OpenCV】—ROI区域图像叠加&图像混合
|
7月前
|
算法 数据挖掘
[Halcon&图像] 阈值分割算法拓展
[Halcon&图像] 阈值分割算法拓展
139 1
|
7月前
|
文字识别 Python
Halcon 学习笔记五:几何定位+仿射变换+测量
Halcon 学习笔记五:几何定位+仿射变换+测量
692 0
|
存储 数据可视化 数据管理
处理RGB-D图像数据以构建室内环境地图并估计相机的轨迹
视觉同步定位和映射 (vSLAM) 是指计算摄像机相对于周围环境的位置和方向,同时映射环境的过程。 您可以使用单眼摄像头执行 vSLAM。但是,深度无法准确计算,估计的轨迹未知,并且随着时间的推移而漂移。要生成无法从第一帧开始三角测量的初始地图,必须使用单眼相机的多个视图。更好、更可靠的解决方案是使用 RGB-D 相机,它由一个 RGB 彩色图像和一个深度图像组成。
194 0
|
算法 数据可视化
【视觉基础篇】16 # 如何使用噪声生成复杂的纹理?
【视觉基础篇】16 # 如何使用噪声生成复杂的纹理?
192 0
【视觉基础篇】16 # 如何使用噪声生成复杂的纹理?
|
传感器 JSON 数据可视化
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?
207 0
【视觉高级篇】22 # 如何用仿射变换来移动和旋转3D物体?