Matlab学习笔记——双线性插值旋转图像

用普通坐标变换的方法进行旋转图像时,由于取整后的坐标不能与原来一一对应,会出现空像素即黑点,例如

I=imread('cameraman.tif');
x=pi/4;
[m,n]=size(I);
J=zeros(m,n);
for n1=1:m
    for n2=1:n
        u=floor(n1*cos(x)-n2*sin(x))+m;
        v=floor(n1*sin(x)+n2*cos(x))+n;
        J(u,v)=I(n1,n2);
    end
end
J=uint8(J);
imshow(J);

旋转效果如下图
这里写图片描述

可以看到图片上明显的黑点。

为了解决这种问题,可以采取插值法将空像素点补全,常用插值法包括最邻近插值法,双线性插值法,三次内插值法。


双线性插值法实现如下:

img=imread('cameraman.tif');    
[h,w]=size(img);
img2=imrotate(img,45,'bilinear');

theta=pi/4;
rot=[cos(theta) sin(theta) 0;-sin(theta) cos(theta) 0;0 0 1]; 
pix1=[1 1 1]*rot;               %变换后图像左上点的坐标
pix2=[1 w 1]*rot;               %变换后图像右上点的坐标
pix3=[h 1 1]*rot;               %变换后图像左下点的坐标
pix4=[h w 1]*rot;               %变换后图像右下点的坐标

height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5]));     %变换后图像的高度
width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5]));      %变换后图像的宽度
imgn=zeros(height,width);

delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)]));             %取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)]));             %取得x方向的负轴超出的偏移量

for i=1-delta_y:height-delta_y
    for j=1-delta_x:width-delta_x
        pix=[i j 1]/rot;                                
        %用变换后图像的点的坐标去寻找原图像点的坐标,                                         
        %否则有些变换后的图像的像素点无法完全填充
        float_Y=pix(1)-floor(pix(1)); 
        float_X=pix(2)-floor(pix(2));    

        if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w     

            pix_up_left=[floor(pix(1)) floor(pix(2))];           %四个相邻的点
            pix_up_right=[floor(pix(1)) ceil(pix(2))];
            pix_down_left=[ceil(pix(1)) floor(pix(2))];
            pix_down_right=[ceil(pix(1)) ceil(pix(2))]; 

            value_up_left=(1-float_X)*(1-float_Y);               %计算临近四个点的权重
            value_up_right=float_X*(1-float_Y);
            value_down_left=(1-float_X)*float_Y;
            value_down_right=float_X*float_Y;

            imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
                                        value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
                                        value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
                                        value_down_right*img(pix_down_right(1),pix_down_right(2));
        end       

    end
end
subplot(1,2,1);imshow(img2);title('imrotate双线性插值旋转');
subplot(1,2,2);imshow(uint8(imgn));title('手动双线性插值旋转');

运行结果
这里写图片描述
可以看到右侧双线性插值旋转后的图片没有上图中的黑点出现,说明空像素点得到了对应的填充,效果较好。

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中的双线性插值旋转是通过使用双线性插值图像进行旋转双线性插值是一种常用的图像插值方,它通过对相邻像素的加权平均来估计待插值像素的灰度值。 旋转图像的算可以通过以下步骤实现: 1. 确定旋转中心:选择待旋转图像的中心点作为旋转中心。 2. 计算旋转矩阵:根据旋转角度计算旋转矩阵。旋转矩阵可以通过调用MATLAB的`imrotate`函数来实现。 3. 计算目标图像尺寸:根据旋转角度和原始图像尺寸计算旋转后的图像尺寸。可以使用`imref2d`函数创建一个参考对象,用于存储旋转后的图像尺寸和空间参考信息。 4. 执行双线性插值:根据旋转矩阵和目标图像尺寸,对原始图像进行旋转和插值操作。可以使用`imwarp`函数实现,该函数能够对图像进行仿射变换。 5. 显示旋转后的图像:通过调用`imshow`函数显示旋转后的图像。 以下是一个示例代码: ```matlab % 读取原始图像 originalImage = imread('input.jpg'); % 设置旋转中心 rotationCenter = size(originalImage) / 2; % 设置旋转角度 rotationAngle = 30; % 单位为度 % 计算旋转矩阵 rotationMatrix = imrotate(originalImage, rotationAngle); % 计算目标图像尺寸 outputSize = size(rotationMatrix); % 执行双线性插值 outputImage = imwarp(originalImage, affine2d(rotationMatrix), 'OutputView', imref2d(outputSize)); % 显示旋转后的图像 imshow(outputImage); ``` 上述代码中,我们首先读取了待旋转的原始图像。然后,我们设置旋转中心和旋转角度,并通过`imrotate`函数计算旋转矩阵。接下来,我们使用`imwarp`函数对原始图像进行旋转双线性插值操作,输出旋转后的图像。最后,我们使用`imshow`函数显示旋转后的图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值