【Python・OpenCV】斜体文字画像の画角を補正する方法(アフィン変換・slant補正・傾斜補正)

eye-catch

今回は、Pythonを用いて、文字画像の画角を自然体にするために、アフィン変換を用いて画像の補正をする方法を記述していきます。

プログラミングでお悩みではありませんか?

こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。

プログラミングを学びたい人におすすめのスクール5選!

サンプル

よくわからない方も多いと思いますので、実例をもとに、どのような処理をするのかを先に説明しておきます。

日本人が書くローマン体の文字は、文字の画角が右肩上がりになっていることが多いです。その画角を水平に補正していきます。一方で、英語や一部のフォントではイタリック体と呼ばれ、傾斜のついた文字が書かれることがあります。

このような文字をまっすぐに補正することを目的としています。

ローマン体の結果

元画像の影響で、完成形がイタリック体※になっていますが気にしないでください。
(※文字が斜めに傾いている文字)

文字の横画が水平に補正されているのが分かると思います。

元画像補正後完成形

イタリック体の結果

元画像の影響で、完成形がローマン体※になっていますが気にしないでください。
(※文字の画角が右肩上がりになっている文字)

文字の縦画が垂直に補正されているのが分かると思います。

元画像補正後完成形

傾き補正の方法

文字の画角を水平に補正するために、アフィン変換という手法を用います。

アフィン変換とは、画像を回転や、移動、拡大、縮小など、処理が簡単に行うことができる手法です。これらの処理を合成するには、変換するための行列の式をかけるとこで複雑な処理が実行できます。

詳しくは別の方が書いているQiitaを参考にしてください。超絶詳しく書いてあります。

ローマン体の場合(slant補正)

「文字の画角を水平に補正する」ためには、画像全体を画像内のある座標を(x, y)、変換後の座標を(x’, y’)としたときに、以下の行列で変換する必要があります。

$$\begin{bmatrix}x’ \\y’ \\ 1 \end {bmatrix}=\begin{bmatrix}1 &0 &0\\\tan\theta &1 &0\\0 &0 &1\end{bmatrix}\begin{bmatrix}x \\y\\ 1 \end{bmatrix}$$

イタリック体の場合(傾斜補正)

文字の傾斜を補正する場合は、以下の行列で変換します。なぜこのような式になるのかは次の「実装」の部分で解説しています。

$$\begin{bmatrix}x’ \\y’ \\ 1 \end {bmatrix}=\begin{bmatrix}1 &sin\theta &0\\ 0 &1 &0\\0 &0 &1\end{bmatrix}\begin{bmatrix}x \\y\\ 1 \end{bmatrix}$$

実装

ここからは具体的にサンプルコードを紹介していきます。

座標の変換を行うと、最初のサンプルで見たように、画像の一部分がはみ出てしまうために、変換の前に画像に十分な余白を追加した後で行います。

今回用いた画像ファイルを置いておきます。

画像の傾き補正「Affine」

ここでの「src」と「dest」の決定方法を説明します。

「src」では、変換前の3つの座標(A, B, C)を設定します。そして、slant補正を行う場合での変換後の座標を(A’, B’, C’)とすると次のようになります。

・ A(0, 0) → A'(0, 0)
・ B(0, 1) → B'(0, 1)
・ C(1, 0) → C'(1, tan(theta))

slnat補正

一方で、傾斜補正を行う場合での 変換後の座標を(A’, B’, C’)とすると次のようになります。

・ A(0, 0) → A'(0, 0)
・ B(0, 1) → B'(sin(theta), 1)
・ C(1, 0) → C'(1, 0)

傾斜補正

画像の切り取り「cut_img」

ここで処理する内容について解説していきます。

画像を2値化し、画像内の各ピクセルに対して、黒(画素値0)ならば、「1」を、白(画素値255)ならば「0」を割り当てます。

この時の、縦、横方向で見た時の黒のピクセル数を数えることで、画像の必要な部分を切り取るためのインデックス番号を求めます。

適当に切り取られた画像

メイン関数

ここでは、コメントアウトで解説している通りです。

全体のコード

最後にコメントなしのコードの全体を記述していきます。

出力結果に関しては最初に示したサンプルを参照してください。

合成

最後に、ローマン体に対する「slant」補正と、イタリック体に対する「傾斜補正」を両方とも行う場合の結果を記述していきます。

元画像完成形

美しいですね~!

先ほどの「全体のコード」と違う箇所は、関数「Affine_slant」を追加したということだけです。

画像に対して「Affine_slant」を行い、slant補正をします。補正された画像に対してさらに「Affine」を行うことで傾斜も補正するという流れになっています。

まとめ

今回は、傾斜文字の画角をアフィン変換を用いて補正する方法を記述しました。

紹介したプログラムでは、補正する画角の角度を直接指定して画角の補正を行っていましたが、「その角度を自動的に求めたい」と思う方も多いと思います。

次の記事では、文字の画角を水平にするための角度を自動的に求めて補正する方法を解説していきます。

プログラミングでお悩みではありませんか?

こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。

プログラミングを学びたい人におすすめのスクール5選!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA