Matlab图像的几何变换之图像镜像
Matlab图像镜像
Matlab图像镜像分为水平镜像和竖直镜像,水平镜像代码如下:
clc
I=rgb2gray(imread('DORMITORY.JPG'));
figure,imshow(I);
title('原图');
[r,c]=size(I);
dst=zeros(r,c); %建立r×c的0矩阵,用来存储镜像变换后的矩阵
for i=1:r
for j=1:c
x=i; %镜像变换后x的值,水平镜像变换x的值不变,这里是以x为纵坐标,y为横坐标
y=c-j+1; %镜像变换后y的值
dst(x,y)=I(i,j);
end
end
figure,imshow(uint8(dst));
title('镜像变换后的图片');
程序运行结果如下:
水平镜像变换中x的值是不变的(这里以x为纵坐标,y为横坐标),但是y的值会变为c-j+1,这个很好理解,假设我们现在有一个一行十列的像素,对第七个像素镜像变换,如下图所示:
Matlab里面是有相应的函数来实现图像的镜像变换的,具体的代码如下:
I=rgb2gray(imread('DORMITORY.JPG'));
figure;
subplot(1,3,1),imshow(I); %把绘图窗口分成一行三列,并将原图像I在第一行第一列显示
title('原图');
[Height,Width]=size(I); %获取原图像的高度和宽度
T1=affine2d([-1 0 0;0 1 0;Width 0 1]); %构造空间变换结构T1,这里为水平镜像变换矩阵
T2=affine2d([1 0 0;0 -1 0;0 Height 1]); %构造空间变换结构T2,这里为竖直镜像变换矩阵
A1=imwarp(I,T1); %对原图像I进行水平镜像变换
A2=imwarp(I,T2); %对原图像I进行竖直镜像变换
subplot(1,3,2),imshow(A1); %把绘图窗口分成一行三列,并将A1在第一行第二列显示
title('水平镜像变换后的图片A1');
subplot(1,3,3),imshow(A2); %把绘图窗口分成一行三列,并将A2在第一行第三列显示
title('竖直镜像变换后的图片A2');
结果如下图所示:
镜像变换矩阵说明:
设
(
x
0
,
y
0
)
是原图像上的点,经过水平镜像后的点是
(
x
1
,
y
1
)
,则水平镜像变换矩阵:
[
x
1
y
1
1
]
=
[
x
0
y
0
1
]
⎡
⎣
⎢
−
1
0
W
i
d
t
h
0
1
0
0
0
1
⎤
⎦
⎥
=
[
W
i
d
t
h
−
x
0
y
0
1
]
设
(
x
0
,
y
0
)
是原图像上的点,经过竖直镜像后的点是
(
x
2
,
y
2
)
,则竖直镜像变换矩阵:
[
x
1
y
1
1
]
=
[
x
0
y
0
1
]
⎡
⎣
⎢
1
0
0
0
−
1
H
e
i
g
h
t
0
0
1
⎤
⎦
⎥
=
[
x
0
H
e
i
g
h
t
−
y
0
1
]
程序中有关图像镜像函数介绍:
B=imwarp(A,tform) ;
transforms the image A according to the geometric transformation defined by tform, which is a geometric transformation object. B is the transformed image.
tform=affine2d(M);
creates an affine2d object given an input 3-by-3 matrix M that specifies a valid affine transformation.
関連
-
[解決済み] MATLABでctrl+Aを使わずにすべてのコードを自動インデントする
-
[解決済み] ある行列から固有ベクトルの異なる解を得ることができるでしょうか?
-
[解決済み] MATLABエラー "このコンテキストでは関数定義は許可されていません。" [重複しています]。
-
[解決済み] Matlabのリスト理解
-
[解決済み] エラー --> 整数には同じクラスの整数か、スカラー倍数しか組み合わせることができません。
-
[解決済み] グラフと関係のないカスタム凡例を追加する
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] Matlabで3角形の行列を作るループをベクトル化する
-
[解決済み] MatlabでY軸のプロット範囲を調整する方法は?
-
Matlab R2018b の Windows へのインストール チュートリアル
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MATLAB: symからlogicalへの変換ができない
-
[解決済み] matlabで補強行列を作成し、縮小行エシュロン形式を作成する。
-
[解決済み] Matlab - 連立方程式を解くときにvpasolveエラーが発生する
-
[解決済み] MATLABによるパワーメソッド
-
[解決済み] 減衰比一定の直線と根元の軌跡との交点を求めるためのrlocfindの代替プログラム(Matlab
-
[解決済み] 1変数に対するfzeroとfsolveの差分
-
[解決済み] MatLab: 関数の引数を設定する
-
[解決済み] matlabでchi2gof関数を理解する
-
[解決済み] RGBカラーによるMATLABプロット
-
[解決済み] 行列の列数を求めるには?