Python を使用して任意の画像をスケッチに変換する

Python を使用して任意の画像をスケッチに変換する

美しいスケッチを作成するには、多くの時間と労力が必要です。幸いなことに、プログラミングが進化したため、画像を簡単に変換して美しいデザインを作成できるようになりました。実行できる印象的なテクニックの 1 つは、画像をデジタル スケッチに変換することです。

メカニカル スケッチは自分の鉛筆画とまったく同じには見えませんが、出力結果は試してみる価値があります。非常に使いやすい Python 言語で OpenCV モジュールを使用して、このようなアプリをプログラミングする方法を学びます。

OpenCV モジュール

OpenCV は、画像処理とコンピューター ビジョンに使用されるコンピューター ビジョン手法のインテルが開発および管理しているオープンソース ライブラリです。ユーザーは、最適化されたアプリケーションを作成し、画像やビデオをリアルタイムで操作し、ニーズに最適なアルゴリズムを選択することが簡単になります。

OpenCV の一般的なアプリケーションには、顔検出、映画撮影における自動顔追跡、ソーシャル メディア フィルター、車のナンバー プレート認識、CCTV 監視などがあります。Python で OpenCV モジュールを使用するには、ターミナルを開いて次のコマンドを入力します。

pip install opencv-python

Python を使用して任意の画像をスケッチに変換する方法

お気に入りの画像をデジタル スケッチに変換するには、簡単に参照できるように、新しい Python プログラムと同じフォルダーに配置することから始めます。次に、次の手順を使用してプログラムの構築を開始します。

最初のステップは、OpenCV モジュールを環境にインポートすることです。OpenCV が利用可能になると、その機能を使用してさまざまなタスクを実行できます。画像ファイルのパスをimread()関数に渡してロードします。後で参照できるように、ここではimage1という変数に画像を保存します。

ウィンドウのタイトルをwindow_nameという名前の変数に格納します。これは、 imshow()関数を使用して画像を表示することを選択した場合に役立ちます。この関数には、表示するタイトルと画像の 2 つのパラメーターが必要です。

import cv2

image1 = cv2.imread('image.jpg')
window_name = 'Actual image'
cv2.imshow(window_name, image1)

目的のイメージを取得したら、5 つの操作を実行してスケッチに変換する必要があります。まず、カラー画像をグレースケールに変換します。これは、 cvtColor()関数を使用して行うことができます。この関数は、色を変更したい画像とCOLOR_BGR2GRAYなどの変換コードを受け取ります。

grey_img = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

グレースケール画像ができたら、その色を反転します。この時点で、コンピューターが画像を形成する方法を理解する必要があります。画像は、さまざまな強度を持つ多くの小さなピクセルで構成されています。カラー イメージでは、各ピクセルに赤、緑、青の成分が含まれており、それぞれの強度は 0 ~ 255 の範囲で変化します。

In a grayscale image, there are only shades of grays, so the intensity of a pixelセル範囲は 0 ~ 1 です。このイメージのピクセル強度を反転するには、グレースケール イメージをbitwise_not()関数に渡します。

名前が示すように、この関数は各ピクセルの値をその相補的な値に反転します。0 より大きいすべてのピクセルは 0 に設定され、0 に等しいすべてのピクセルは 255 に設定されます。

invert = cv2.bitwise_not(grey_img)

ピクセル強度を反転した後、Gaussian Blur を使用して画像を滑らかにすることができます。ガウスぼかし処理では、ガウス フィルターを使用します。ガウス フィルターは、信号または画像の高周波成分を除去して、低周波数のみを通過させるローパス フィルターです。

OpenCV のGaussianBlur()関数は 4 つのパラメーターを受け入れます。これらは、ソース イメージ、ksize (カーネルのサイズ)、および sigmaX (ガウス カーネル標準偏差) として機能する行列オブジェクトです。

手に物理的な写真があるとします。ぼかしたい場合は、その上にワックスまたはパーチメント ペーパーを適用できます。カーネルは、この透明な紙切れと想像できます。デジタルでは、これは少し異なります。デジタル画像にぼかし、シャープ化、およびその他の効果を適用するには、行列に画像のピクセルの強度を掛けます。

ksize は常に正の奇数です。カーネル サイズを大きくすると、ぼかしが大きくなります。sigmaX を理解するには、紙にワックスを塗っていると仮定します。ワックスを塗ると、紙は均一に半透明になります。同様に、カーネルの値を特定のポイント (平均) に近づける必要があります。sigmaX 値は、画像内のピクセルの平均値とその他の値の差を定義します。

反転された画像、カーネル サイズ (21, 21)、標準偏差 0 を Gaussian Blur 関数に渡します。

blur = cv2.GaussianBlur(invert, (21, 21), 0)

ぼかした画像を再度 bitwise_not() 関数に渡して反転させます。

invertedblur = cv2.bitwise_not(blur)

最後に、divide()関数を使用して、256 のスケールでグレースケール画像配列と反転ぼかし画像配列の要素ごとの除算を実行します。

sketch = cv2.divide(grey_img, invertedblur, scale=256.0)

基本的に、関数は次の操作を実行します。

def divide(grey_img, b, invertedblur=256.0):
    return (grey_img * scale) / invertedblur

結果を sketch という名前の変数に保存します。最終的なイメージを保存するには、出力ファイルの名前とスケッチ イメージをimwrite()関数に渡します。これを確認するには、imread() 関数を使用して、保存されたスケッチ イメージを読み込み、ウィンドウ タイトルを付けて、imshow() 関数を使用して表示します。

0 を渡してwaitkey()関数を使用し、キーを押すまで元のイメージ ウィンドウと生成されたスケッチ ウィンドウを表示します。

cv2.imwrite("sketch.jpeg", sketch)
image = cv2.imread("sketch.jpeg")
window_name ='Sketch image'
cv2.imshow(window_name, image)
cv2.waitKey(0)

すべてのコードをまとめると、プログラムの準備が整います。

この Python プログラムを使用してイメージをスケッチに変換するサンプル出力

美しい風景の画像を選択してプログラムを実行し、この見事なデジタル スケッチを生成できます。

湖のある家をスケッチするイメージ

縦長の画像では、プログラムは次のデジタル スケッチを生成します。

男をスケッチするイメージ

好みに応じて関数のパラメーターを試して、目的のデジタル スケッチを生成できます。

画像処理とコンピュータ ビジョン

画像処理とコンピューター ビジョンは、密接に関連する 2 つの技術分野です。どちらも、望ましい結果を得るためにデジタル画像を変更する必要があります。画像処理は画像を改善することに重点を置いていますが、コンピューター ビジョンは画像内のパターンやオブジェクトを見つけて理解することに重点を置いています。

scikit-image は、さまざまな画像処理機能を提供するもう 1 つの Python ライブラリです。いくつかのコンパイル済みモジュール、フィルター、レイヤー、変換などがあります。CNN や RNN などの深層学習モデルに使用するモジュールを探している場合は、Torchvision を検討することをお勧めします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です