1)在做圖像坐標映射反查的時候,算出當前點在原始圖像的外部還是內部,若在外部,判斷當前像素點的X或者Y位置,找臨近四個邊界的像
素值代替;
該方法太過繁瑣,適合自己寫程序實現,如若想調用現有的壹些庫函數,可以考慮2)做法:
2)將待旋轉的圖像進行邊界填充,最不濟的情況下可以擴充為原始圖像的大小;
旋轉邊界填充圖像;
計算原始圖像經過旋轉以後的結果圖像的尺寸大小;
在邊界填充旋轉圖像上截取目標圖像;(圖像都是按照圖像中心旋轉的);
附上壹段matlab人臉根據人眼位置對齊的代碼:
[plain] view plain copy
eye_angle = atan2( (eye_pts(2,2) - eye_pts(1,2)),(eye_pts(2,1) - eye_pts(1,1) ) ) * 180 / pi; % 人眼的傾斜角度
if eye_angle < 0
eye_angle = eye_angle + 360;
end
if floor(eye_angle) <= 5 || floor( 360 - eye_angle ) <= 5
continue;
end % 5度之內不做對齊操作
img = imread(img_path);
[m,n,~] = size(img);
img_pad = padarray(img,[m n],'both','replicate');% 擴充圖像
img_pad_rotate = imrotate(img_pad,eye_angle,'bilinear'); % 旋轉擴充圖像
[m_pad_r,n_pad_r,~] = size(img_pad_rotate);
[plain] view plain copy
eye_angle = eye_angle * pi / 180;
f_cos = cos(eye_angle);f_sin = sin(eye_angle);
new_m = floor(m * abs(f_cos) + n * abs(f_sin));
new_n = floor(n * abs(f_sin) + m * abs(f_cos));% 最終對齊圖像的大小
left = floor((n_pad_r - new_n) / 2);right = left + new_n;
bott = floor((m_pad_r - new_m) / 2);up = bott + new_m;
face_rorate = img_pad_rotate(bott : up,left : right,:); % 截取目標圖像
figure,imshow(face_rorate)