图片旋转


话说,图片旋转是这样玩的吧?

function p=HY_imrotate(img,angle)
angle=angle/180*pi;
[h,w]=size(img);
% 计算新的图像大小
height=floor(h*cos(angle)+w*sin(angle));
width=floor(h*sin(angle)+w*cos(angle));
p=zeros(height,width);
% 变换矩阵
G=[ cos(angle), -sin(angle),    sin(angle);...
    sin(angle), cos(angle),     0;...
    0,          0,              1];
for x0=1:1:w
    for y0=1:1:h
        t=[x0;y0;h];
        A=G * t;
        x=floor(A(1)+0.5);
        y=floor(A(2)+0.5);
        if x>=1 && x<=width && y>=1 && y<=height
            p(x,y)=img(x0,y0);
        end
    end
end
end

原来的公式是绕着 $(0,0)$ 点旋转的,我现在的是绕着图片中心旋转的。

关于填洞洞。本来想说,把洞洞填上不就好了……如果这个点的值为 0 那么就取左边啊就当作线性插值了……说的简单啊!自己怎么都写不好。

用滤波器吧。做个平滑滤波啊什么的,结果失败了,图片特别模糊。用了一个维纳滤波,继续失败——黑点点还是黑点点,一点都没有减少,但是图像已经模糊不清了。

然后就用了一个 $Q\gt0$ 的逆谐波滤波器:

p=imfilter(p.^(Q+1),fspecial('average',3))./imfilter(p.^Q,fspecial('average',3));

效果还好,只是有点模糊。

然后又用了中值滤波器:

p=medfilt2(p);

效果也不错,只是图片还是模糊的,不如上面的好。

就这样把不改了。反正用 imrotate()就好了,不是么……

留下评论