ティルトシフトレンズとは何ですか?また、多くの人が知っている助けを借りて何
ができるのか 最近、ハブラーにTilt-Shift
ジェネレーターに関する記事がありました。これは通常の写真を処理することでこの効果を作り出します。 ただし、このプログラムはWindows専用に作成されており、まだ費用がかかります。 何らかの理由で、グラフィックエディター用のすべてのプラグインにもお金とライセンスが必要でした。 したがって、この問題を個別に処理し、プロのソフトウェアよりもツールを少し簡単にし、レンズの光学を理想的にシミュレートするのではなく、自由でオープンで誰でもアクセスできるようにすることが決定されました! これから来たものとそうでないもの-あなたは自分で見ることができます。
最初のミニチュアを作ることから始めましょう。
はじめに、写真を選択するために最初に必要なこと。 最初は適切ではない画像を処理しようとすることは意味がありません。 主にこれに使用されるのは、高地から撮影された都市の画像です。これは、主に小さな世界の錯覚を作成するのに役立ちます。 輸送や人など、フレーム内に小さなオブジェクトがある場合にも適しています。
このような写真の主な効果は、レンズを回転させることで達成されます。これにより、焦点面が光軸に対して垂直ではなくなります。 これにより、くさび形の被写界深度が形成されます。 グラフィックエディターの助けを借りてこの効果を作成する方法については、Photoshopのレッスンを使用して、どのサイトでも詳細に慣れることができます。
仕事のために、私はこの写真を選択しました:
Photoshopで彩度を追加してフィルターを適用すると、次の結果が得られます。
もちろん、あなたは洗練された読者ではなく、実際の光学効果はフィルターと区別するのが非常に簡単ですが、それにもかかわらず、即興の手段でフレームをかなり適切に設定することで、良い結果を得ることができます。
実際、画像で行う必要があるのは、適切な場所に人工的なボケを配置し、彩度を調整することだけでした。これは、フレーム内のオブジェクトにプラスチックモデルの効果を与えるのに役立ちます。
プログラミングに移りましょう。
簡単なものから始めましょう。 まず、画像のマスクを準備する必要があります。 不要な作業をすぐにロードしないように、Photoshopで行います。 暗い場所では、アルファレイヤーは最大値に等しくなり、白-ゼロになります。つまり、これらの場所の画像は透明になります。
黒いピクセルがある場所では、ボケは重ならず、シーンは焦点を合わせたままになります。 マスクは「乗ろうとしている」方法を使用して作成されました。これはアプローチのデモンストレーションにすぎません。
Pythonを少し掘り下げた後、このような小さくてきれいなスクリプトができました。
- インポート画像
- インポートシステム
- numpy を np として インポートする
- scipy import ndimage から
- ImageEnhanceのインポート
- #INIT
- blur_size = 6
- image_base = "/Users/Mango/Desktop/tiltshift_alpha.png"
- image_mask = "/Users/Mango/Desktop/mask_tiltshift.png"
- image_output = "/Users/Mango/Desktop/tiltshift_preview.png"
- #ロード
- im_base =イメージ。 オープン ( image_base )
- im_mask =イメージ。 オープン ( image_mask )
- im_mask = im_mask。 サイズ変更 ( im_base。size )
- #プロセス
- enh = ImageEnhance。 カラー ( im_base )
- im_base = enh。 強化 ( 1.7 )
- enh = ImageEnhance。 コントラスト ( im_base )
- im_base = enh。 強化 ( 1.2 )
- im_blurred = np。 配列 ( im_base、dtype = float )
- im_blurred = ndimage。 gaussian_filter ( im_blurred、sigma = [ blur_size、blur_size、 0 ] )
- im_blurred =イメージ。 fromarray ( np。uint8 ( im_blurred ) )
- im_mask = im_mask。 変換 ( "L" )
- im_base = im_base。 変換 ( "RGBA" )
- #マージして保存
- im_base。 貼り付け ( im_blurred、mask = im_mask )
- im_base。 保存 ( image_output )
最初に元の画像とマスクを取得し、次にマスクのサイズを画像のサイズに合わせて調整し、処理を開始します。 ImageEnhanceモジュールを使用すると、色、明るさ、コントラストなどのインジケーターを調整できます。 次に、im_blurredはイメージのコピーを配列として保存します。 ボケを作成するには、古き良きガウスぼかしフィルターを使用しました。 その結果は、プロのエディターの同じレンズぼかしとは異なりますが、最初はかなり良い結果です。
最終段階では、アルファマスクを使用して、ぼやけた画像が元の画像に重ねられます。 また、各レイヤーには正しいパレットが必要であることも考慮する価値があります。 マスクはモノクロLモードで使用され、アルファレイヤーは変換(「RGBA」)を使用して元の画像に追加されます。これにより、マスクを使用して2番目のレイヤーを重ね合わせることができます。
結果は次のとおりです。
次に、結果のコードを少し完成させて、手書きのマスクの形で見苦しい外部追加を取り除きます。 これは複雑なことではなく、いわゆる反射勾配であり、2つの共線ベクトルによって定義されます。
さらに簡略化した形式では、このモデルは次のように表すことができます。
システム全体は、方向、ベクトルAの長さ、フォーカスエリア、およびベクトルBによって定義されます。すべての距離は、簡単にするためにy軸に沿って設定されます。
勾配の構成は次のとおりです。 まず、1ピクセルの幅を持つ画像が指定された距離で構築され、パターンとして機能します。 その後、さまざまな操作により、任意の形状を与え、目的の角度に回転させることができます。
少し実験して、この関数を取得しました:
- インポート画像
- ImageDrawをインポートする
- ImageOpsをインポートする
- インポート 数学
- def draw_mask (角度、幅、高さ、offset_init、offset_A、offset_focus、offset_B ) :
- オフセット=高さ* offset_init / 100
- vectorA = offset + offset_A * height / 100
- focus = vectorA + offset_focus * height / 100
- vectorB =フォーカス+ offset_B *高さ/ 100
- マスク=イメージ。 新規 ( 'L' 、 (幅、高さ) )
- mask_1px =画像。 新規 ( 'L' 、 ( 1 、高さ) )
- draw_1px = ImageDraw。 描画 ( mask_1px )
- for y in range ( 0 、offset ) : #ホワイトゾーンを描く
- draw_1px。 ポイント ( ( 0 、y ) 、 255 )
- for y in range ( offset、vectorA ) : #vectorAを描く
- draw_1px。 ポイント ( ( 0 、y ) 、 ( vectorA-y ) * ( 255 / ( vectorA-offset ) ) )
- for y in range ( vectorA、focus ) : #ホワイトゾーンを描く
- draw_1px。 ポイント ( ( 0 、y ) 、 0 )
- for y in range ( focus、vectorB ) : #vectorBを描く
- draw_1px。 ポイント ( ( 0 、y ) 、255- ( vectorB-y ) * ( 255 / ( vectorB-focus ) ) )
- for y in range ( vectorB、height ) : #ホワイトゾーンを描く
- draw_1px。 ポイント ( ( 0 、y ) 、 255 )
- m_width、m_height =マスク。 サイズ
- mask_1px = mask_1px。 サイズ変更 ( ( int ( m_width * 3 ) 、m_height ) 、 Image。ANTIALIAS )
- mask_1px = ImageOps。 反転 ( mask_1px )
- mask_top = mask_1px。 回転 (角度、画像。NEAREST 、 1 )
- mask_top = ImageOps。 反転 ( mask_top )
- マスク。 変換 ( "RGBA" )
- n_width、n_height = mask_top。 サイズ
- マスク。 貼り付け ( mask_top、 ( -n_width / 2 、- ( n_height / 2 -height / 2 ) ) ))
- マスク。 変換 ( "L" )
- 戻りマスク

このコードは、ツールの汎用性を高めたい場合や、Webインターフェースにネジ止めしたい場合に備えて、回転角度を考慮に入れています。これは近い将来に行います。
誰かがソースを必要とする場合、最終バージョンは
githubにあります。