【图像处理知识复习】08图像旋转后空洞问题处理 Matlab

算法

遍历旋转后图像,判断当前点是否为空穴(四近邻像素值都大于0,且当前点等于0)。邻近插值法,则左边像素替代当前0像素,如果均值插值,则取四近邻均值。

效果如下:


1. Matlab代码如下:

%题目:图像的旋转,(1)邻近插值法,(2)均值插值,处理空穴。
%旋转公式;I = icost-jsint; J = isint+jcost。旋转角度t给定。

%这里空穴,指的是当前0像素的四近邻像素值都大于零,当前像素就是空穴。

f = imread('D:/Code/Image/classic.jpg');
f = rgb2gray(f);
figure,imshow(f);
[row,col] = size(f);
A = zeros(row,col);%保存的是行号
B = zeros(row,col);%保存的是列号
%1, 旋转后的行、列号
for i=1:row
   for j=1:col
        A(i,j) = round( i*cosd(30)-j*sind(30) );%旋转后的行号矩阵
   end
end
for i=1:row
   for j=1:col
        B(i,j) = round( i*sind(30)+j*cosd(30) );%旋转后的列号矩阵
   end
end
%2, 使行列号值为正整数
for i=1:row
    for j=1:col
        if ( 1-A(i,j) ) >0
            plusi = 1-A(i,j);
            A = A+plusi;%使保存的行号值为正整数
        end
        if ( 1-B(i,j) ) >0
            B = B+plusj;%使保存的列号值为正整数
        end
    end
end
%3,定义新的画布,并遍历旧画布,填充到新画布中
maxi = max(max(A)); %最大行号
maxj = max(max(B)); %最大列号
G = zeros(maxi,maxj);%扩大后的画布,保存的值为灰度值
for i=1:row
   for j=1:col
        G(A(i,j),B(i,j)) = f(i,j);%像素值填充
   end
end
figure,
imshow(uint8(G));%显示旋转后图像

%(1) 邻近插值
for i=2:maxi-1
    for j=2:maxj-1
        if G(i,j)==0 && G(i-1,j)>0 && G(i-1,j-1)>0 && G(i,j+1)>0 && G(i+1,j)>0 % 判断当前点是否为空穴点
            G(i,j) = G(i,j-1);
        end
    end
end
figure,imshow(uint8(G));

%(2)均值插值
for i=2:maxi-1
    for j=2:maxj-1
        if G(i,j)==0 && G(i-1,j)>0 && G(i-1,j-1)>0 && G(i,j+1)>0 && G(i+1,j)>0
            G(i,j) = (G(i-1,j) + G(i-1,j-1) + G(i,j+1) + G(i+1,j))/4;
        end
    end
end
figure,imshow(uint8(G));


  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值