2、圖像的鏡像變換
圖像的鏡像變換分為水平鏡像和垂直鏡像,下面分別進(jìn)行這兩種鏡像的介紹,首先說(shuō)明一下,無(wú)論是水平鏡像還是垂直鏡像,鏡像后高度和寬度都不變。
?
H圖像的高度,關(guān)聯(lián)x W:圖像的寬度,關(guān)聯(lián)y
·水平鏡像操作:以原圖像的垂直中軸線為中心,將圖像分為左右兩部分進(jìn)行對(duì)稱變換。示意圖如下所示
?
水平鏡像中,原圖中的(x0,y0)經(jīng)過(guò)水平鏡像后,坐標(biāo)變成了(x0,W-y0),用數(shù)學(xué)公式表達(dá)就是:
x1 = x0,
y1 = W-y0 ;
寫成矩陣就是:
?
也就是說(shuō),水平鏡像變換矩陣(因子)為:
?
用matlab代碼實(shí)現(xiàn)如下所示:
?
代碼已經(jīng)沒(méi)有什么好介紹的了,跟前面的平移差不多,只不過(guò)變換矩陣是水平鏡像變化矩陣,得到的效果如下所示:a2
·垂直鏡像操作:以原圖像的水平中軸線為中心,將圖像分為上下兩部分進(jìn)行對(duì)稱變換。示意圖如下所示:
?
垂直鏡像中,原圖中的(x0,y0)經(jīng)過(guò)垂直鏡像后,坐標(biāo)變成了(H-x0,y0),用數(shù)學(xué)公式表達(dá)就是:
x1 = H - x0,
y1 = y0 ;
寫成矩陣就是:
?
也就是說(shuō),垂直鏡像變換矩陣(因子)為:
?
用matlab代碼實(shí)現(xiàn)如下所示:
close all ;
clear all ;
clc ;
im = imread(‘F:/圖像處理/Koala.jpg’);%讀入一幅圖
[H,W,Z] = size(im); % 獲取圖像大小,H為垂直方向768點(diǎn),W為水平方向1024點(diǎn)
I=im2double(im);%將圖像類型轉(zhuǎn)換成雙精度
res = ones(H,W,Z); % 構(gòu)造結(jié)果矩陣。每個(gè)像素點(diǎn)默認(rèn)初始化為1(白色)
tras = [-1 0 H; 0 1 0; 0 0 1]; % 垂直鏡像的變換矩陣
for x0 = 1 : H%第1行到第768行
for y0 = 1 : W%第1列到第1024列
temp = [x0; y0; 1];%將每一點(diǎn)的位置進(jìn)行緩存,1行1列,1行2列···1行1024列
temp = tras * temp; % 根據(jù)算法進(jìn)行,矩陣乘法:轉(zhuǎn)換矩陣乘以原像素位置
x1 = temp(1, 1);%新的像素x1位置,也就是新的行位置(從1~768)
y1 = temp(2, 1);%新的像素y1位置,也就是新的列位置(從1~1024)
% 變換后的位置判斷是否越界
if (x1 《= H) & (y1 《= W) & (x1 》= 1) & (y1 》= 1)%新的行位置要小于新的列位置
res(x1,y1,:)= I(x0,y0,:);%進(jìn)行顏色賦值
end
end
end;
set(0,‘defaultFigurePosition’,[100,100,1000,500]);%設(shè)置窗口大小
set(0,‘defaultFigureColor’,[1 1 1]);%設(shè)置窗口顏色
figure;%打開一個(gè)窗口,用來(lái)顯示(多幅)圖像
subplot(1,2,1), imshow(I),axis on ;%顯示圖片,一行兩列,第一幅
subplot(1,2,2), imshow(res),axis on;%顯示圖片,一行兩列,第二幅
代碼實(shí)現(xiàn)的效果如下所示:
評(píng)論