В современном MATLAB для поворота изображения существует функция imrotate
. Но можно обойтись и без нее...
Поворот цветного изображения на случайный угол. Реализован для MATLAB 7.0 и выше. В более ранних версиях следует заменить &&
на &
в условном операторе.
im1 = imread('lena.jpg'); imshow(im1);
[m,n,p]=size(im1);
thet = 2*pi*rand;
mm = m*sqrt(2);
nn = n*sqrt(2);
for t=1:mm
for s=1:nn
i = round((t-mm/2)*cos(thet)+(s-nn/2)*sin(thet)+m/2);
j = round(-(t-mm/2)*sin(thet)+(s-nn/2)*cos(thet)+n/2);
if i>0 && j>0 && i<=m && j<=n
im2(t,s,:)=im1(i,j,:);
end
end
end
figure; imshow(im2);
Всякое изображение на экране — плоское, т.е. каждый его элемент (пиксель) задается двумя координатами: номерами строки и столбца. В нашем случае эти номера изменяются от 1
до m
и от 1
до n
.
Мы хотим повернуть каждый пиксель изображения на заданный угол thet
относительно центра изображения. Для этого используем матрицу поворота
R = [cos(thet), sin(thet); -sin(thet), cos(thet)]
Но нам нужно повернуть картинку относительно центра, а не относительно левого нижнего угла, поэтому мы вдобавок переносим начало координат в центр, сдвигая его на m/2
и n/2
соответственно.
Размеры трансформированного изображения отличаются от размеров исходного. Например, ширина изображения, повернутого на 45 градусов в {\(\sqrt{2}\)} раза больше исходного. Поэтому мы заранее резервируем место под увеличенные размеры, а если пиксель не относится к исходному изображению, то он выводится черным цветом.
Исходное изображение:
Результат преобразования:
Комментарии
comments powered by Disqus