Pythonを使用して画像の一部をぼかす最もエレガントな方法は何ですか?

エピック氏の失敗

PILを使用してローカルで画像をぼかす次の答えを見つけました:PIL、pythonを使用して画像の一部をフィルタリングします。提案された回答は、画像の一部を切り取り、ぼかして、元の画像にコピーして戻します。これにより、ぼやけた部分と元の画像の間に鋭いエッジが作成されます(以下の例を参照)。

画像

この影響を避けたい。

エピック氏の失敗

この問題を回避するには、次の手順を使用できます。

  • 与えられた画像とマスク(0から1の間の値)
  • 入力画像全体とマスクをぼかす
  • ぼやけたマスクで元の画像に重みを付ける
  • ぼやけた画像を反転したぼやけたマスクで重み付けします
  • 加重画像の追加

scipyを使用したいくつかのサンプルコードの下:

import numpy as np
import matplotlib.pyplot as plt
from scipy import misc
import scipy.ndimage


def gaussian_blur(sharp_image, sigma):
    # Filter channels individually to avoid gray scale images
    blurred_image_r = scipy.ndimage.filters.gaussian_filter(sharp_image[:, :, 0], sigma=sigma)
    blurred_image_g = scipy.ndimage.filters.gaussian_filter(sharp_image[:, :, 1], sigma=sigma)
    blurred_image_b = scipy.ndimage.filters.gaussian_filter(sharp_image[:, :, 2], sigma=sigma)
    blurred_image = np.dstack((blurred_image_r, blurred_image_g, blurred_image_b))
    return blurred_image


def uniform_blur(sharp_image, uniform_filter_size):
    # The multidimensional filter is required to avoid gray scale images
    multidim_filter_size = (uniform_filter_size, uniform_filter_size, 1)
    blurred_image = scipy.ndimage.filters.uniform_filter(sharp_image, size=multidim_filter_size)
    return blurred_image


def blur_image_locally(sharp_image, mask, use_gaussian_blur, gaussian_sigma, uniform_filter_size):

    one_values_f32 = np.full(sharp_image.shape, fill_value=1.0, dtype=np.float32)
    sharp_image_f32 = sharp_image.astype(dtype=np.float32)
    sharp_mask_f32 = mask.astype(dtype=np.float32)

    if use_gaussian_blur:
        blurred_image_f32 = gaussian_blur(sharp_image_f32, sigma=gaussian_sigma)
        blurred_mask_f32 = gaussian_blur(sharp_mask_f32, sigma=gaussian_sigma)

    else:
        blurred_image_f32 = uniform_blur(sharp_image_f32, uniform_filter_size)
        blurred_mask_f32 = uniform_blur(sharp_mask_f32, uniform_filter_size)

    blurred_mask_inverted_f32 = one_values_f32 - blurred_mask_f32
    weighted_sharp_image = np.multiply(sharp_image_f32, blurred_mask_f32)
    weighted_blurred_image = np.multiply(blurred_image_f32, blurred_mask_inverted_f32)
    locally_blurred_image_f32 = weighted_sharp_image + weighted_blurred_image

    locally_blurred_image = locally_blurred_image_f32.astype(dtype=np.uint8)

    return locally_blurred_image


if __name__ == '__main__':

    sharp_image = misc.face()
    height, width, channels = sharp_image.shape
    sharp_mask = np.full((height, width, channels), fill_value=1)
    sharp_mask[int(height / 4): int(3 * height / 4), int(width / 4): int(3 * width / 4), :] = 0

    result = blur_image_locally(
        sharp_image,
        sharp_mask,
        use_gaussian_blur=True,
        gaussian_sigma=31,
        uniform_filter_size=201)
    plt.imshow(result)
    plt.show()

結果: ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

TOP 一覧

  1. 1

    sql-ORA-00937:単一グループのグループ関数ではありません

  2. 2

    Powershellを使用して管理者として実行ショートカットを作成する方法

  3. 3

    GolangがHTTPリクエストFormFileをAmazon S3にアップロードする

  4. 4

    AWS S3 SDK-スレッドプールサイズを設定するにはどうすればよいですか?

  5. 5

    Reactでclsxを使用する方法

  6. 6

    Ansibleで複数行のシェルスクリプトを実行する方法

  7. 7

    SwiftでURLが有効かどうかを確認するにはどうすればよいですか?

  8. 8

    DatabaseError:ORA-00928:SELECTキーワードがありません

  9. 9

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  10. 10

    Azure Logic Apps:PowershellスクリプトまたはAzure CLIを実行する方法は?

  11. 11

    Eclipseをアンインストールする方法?

  12. 12

    React:Rootクラスの条件付きレンダリングが機能しませんでした

  13. 13

    レンダリング後のdivの動的幅の取得

  14. 14

    Microsoft Edge WebブラウザでJavaを有効にするにはどうすればよいですか?

  15. 15

    TestInitメソッドでHttpContext.Currentをモックします

  16. 16

    SeleniumとPythonを使用してdiv内の値を見つける方法

  17. 17

    シェープファイルからTopojsonへの変換

  18. 18

    std :: binary_functionの置き換え

  19. 19

    Open Weather Map APIによって提供されるJSON天気予報を明確にする方法は?

  20. 20

    マルチレベルのグループ化でHTMLテーブルにデータを表示する

  21. 21

    「java.library.pathにocijdbc11がありません」SQLDeveloperエラーの対処方法

ホットタグ

アーカイブ