Pythonで2Dマトリクス(画像)を時計回りに90度回転させる方法
はじめに
ここでは、1つの画像を表す2次元マトリクス(行列)が与えられたと仮定します。この画像を時計回りに90度回転させることを目標とします。
例として、以下のような3×3のマトリクスを考えてみましょう。
| 1 | 5 | 7 |
| 9 | 6 | 3 |
| 2 | 1 | 3 |
このマトリクスを時計回りに90度回転させると、出力は次のようになります。
| 2 | 9 | 1 |
| 1 | 6 | 5 |
| 3 | 3 | 7 |
解決のためのアルゴリズム
この問題を解くために、以下の手順に従います。
- 一時的なリスト
temp_mat = []を用意し、col := マトリクスの長さ - 1とします。 colを 0 からマトリクスの長さまでループさせます。- 空のリスト
temp := []を作成します。 rowを「マトリクスの長さ - 1」から -1 まで逆順にループさせます。matrix[row, col]の要素をtempに追加します。
- 完成した
tempをtemp_matに追加します。
- 空のリスト
iを 0 からマトリクスの長さまでループさせます。jを 0 からマトリクスの長さまでループさせます。matrix[i, j] := temp_mat[i, j]として値を書き戻します。
ポイントは、元のマトリクスの各列を下から上へ読み取り、それを新しい行として並べ替えるという考え方です。これにより、余分なメモリを最小限に抑えながら回転を実現できます。
Pythonでの実装例
理解を深めるために、以下の実装例を見てみましょう。
class Solution(object): def rotate(self, matrix): temp_matrix = [] column = len(matrix)-1 for column in range(len(matrix)): temp = [] for row in range(len(matrix)-1,-1,-1): temp.append(matrix[row][column]) temp_matrix.append(temp) for i in range(len(matrix)): for j in range(len(matrix)): matrix[i][j] = temp_matrix[i][j] return matrix ob1 = Solution() print(ob1.rotate([[1,5,7],[9,6,3],[2,1,3]]))
入力
[[1,5,7],[9,6,3],[2,1,3]]
出力
[[2,9,1],[1,6,5],[3,3,7]]
まとめ
このように、列方向の要素を逆順に収集して新しい行を作ることで、2次元マトリクスを時計回りに90度回転させることができます。計算量は O(n²) となり、n×n のマトリクスに対して効率的に動作します。実際の画像処理では、NumPy の np.rot90() や Pillow の Image.rotate() といったライブラリ関数を使うことで、より簡単に同様の操作を実現することも可能です。
-
Pythonでの画像処理入門!PillowとOpenCVで学ぶ基本操作
Pythonには、画像処理に役立つ豊富なライブラリが用意されています。代表的なものは以下の通りです。 OpenCV − リアルタイムコンピュータビジョンを主眼とした画像処理ライブラリ。2D・3D特徴量ツールキット、顔認識やジェスチャー認識、ヒューマンコンピュータインタラクション、モバイルロボティクス、物体識別など、幅広い分野で活用されています。 NumPy / SciPy − 画像の操作や処理に利用される数値計算ライブラリ。 scikit-image − 画像処理向けの多数のアルゴリズムを提供するライブラリ。 Pillow(Python Imaging Library) − サムネイル作成、
-
Pythonでフォトモザイクを実装する方法をわかりやすく解説
フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン