【Python初心者】画像のシャープネスの強化

写真や画像を撮影・加工する際に、シャープネスの強化は重要な要素の一つです

シャープネスとは、画像内のエッジや細部の鮮明さを強調することで、よりクリアで魅力的な写真を作成するための技術です

一眼レフカメラやデジタルカメラで撮影された写真は、撮影時のレンズやセンサーの性能、または撮影条件によって、軽度なぼけやぼんやりした印象が生じることがあります

シャープネスの強化を行うことで、写真の品質を向上させ、よりクリアで詳細な表現を実現できます

ここでは、シャープネスの強化について初心者にも理解しやすく解説します

まず、シャープネスの概念と重要性について説明し、その後、Pythonを使ってシャープネスを強化する方法についていくつかの手法を紹介します

Pythonを用いたシャープネスの強化に興味がある方は、ぜひ読み進めてみてください

シャープネスを強化する方法

シャープネスを強化する方法には、主に以下の2つの手法があります

  • ラプラシアンフィルタ(Laplacian Filter)を使用したシャープネス強化
  • アンシャープマスク(Unsharp Masking)を使用したシャープネス強化

それぞれの手法について、どのようにシャープネスを強化するかを解説します

ラプラシアンフィルタ

ラプラシアンフィルタは、画像処理においてエッジを強調するのに使用されるフィルタです

シャープネスの強化にも有用な手法の一つです

ラプラシアンフィルタを用いると、エッジ部分の輝度変化を強調し、画像全体の鮮明さを向上させることができます

ラプラシアンフィルタによるシャープネスの強化は以下の手順で行います

  1. グレースケール化 : カラー画像をグレースケールに変換します。これは、シャープネスを強化するために、画像の輝度情報に焦点を当てるためです。
  2. ラプラシアンフィルタの適用 : グレースケール画像に対してラプラシアンフィルタを適用します。ラプラシアンフィルタは、各ピクセルの値を周囲のピクセルとの差分で置き換えることでエッジを強調します。
  3. シャープネスの強化 : 元の画像とラプラシアンフィルタを適用した画像を組み合わせることで、シャープネスを強化します。具体的には、元の画像に対してラプラシアンフィルタを適用した画像を重ね合わせ、エッジ情報を強調します。

アンシャープマスク

アンシャープマスクは、画像処理において一般的に用いられるシャープネス強化の手法です

元の画像からブラー(ぼかし)をかけた画像を差し引くことで、エッジを強調する効果を得ます

アンシャープマスクを用いることで、写真の鮮明さを向上させることができます

アンシャープマスクによるシャープネスの強化は以下の手順で行います

  1. ブラー画像の作成 : 元の画像に対してガウシアンフィルタなどのぼかし処理を適用し、ブラー画像を作成します。
  2. マスク画像の作成 : ブラー画像を元の画像から差し引くことで、マスク画像を作成します。このマスク画像には、元の画像との差分が強調されたエッジ情報が含まれます。
  3. シャープネスの強化 : マスク画像を元の画像に加算することで、シャープネスを強化します。マスク画像によってエッジが強調され、写真の鮮明さが向上します。

Pythonを使用してシャープネスを強化する方法

Pythonの画像処理ライブラリであるOpenCVを使用して、シャープネスを強化する方法を紹介します

ラプラシアンフィルタを使用したシャープネス強化

import cv2
import numpy as np

# 画像の読み込み
image = cv2.imread("input.jpg")
'''
cv2.imread()関数を使って、"input.jpg"という名前の画像ファイルを読
み込みます
読み込んだ画像はimageという変数に格納されます。
'''

# グレースケールに変換
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
'''
グレースケールに変換することで、画像の輝度情報に焦点を当てることができます
cv2.cvtColor()関数を使用してカラー画像をグレースケールに変換し、gray
という変数に格納します。
'''

# ラプラシアンフィルタを適用
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
'''
ラプラシアンフィルタは画像処理においてエッジを強調するのに使用されるフィルタで、
エッジ部分の輝度変化を強調します
cv2.Laplacian()関数を使って、グレースケール画像grayに対してラプラシアン
フィルタを適用し、結果をlaplacianという変数に格納します
'''

# シャープネスの強化
sharpened = np.uint8(np.clip(gray - 0.5*laplacian, 0, 255))
'''
ラプラシアンフィルタの適用結果laplacianを元のグレースケール画像grayから減算し、
その結果を0から255の範囲にクリッピングしてシャープネスを強化します
シャープネスが強化された画像はsharpenedという変数に格納されます
'''

# 結果の表示
cv2.imshow("Sharpened Image", sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()

アンシャープマスクを使用したシャープネス強化

import cv2

# 画像の読み込み
image = cv2.imread("input.jpg")
'''
cv2.imread()関数を使って、"input.jpg"という名前の画像ファイルを読
み込みます
読み込んだ画像はimageという変数に格納されます
'''

# ガウシアンフィルタを適用してブラー画像を作成
blurred = cv2.GaussianBlur(image, (0, 0), 3)
'''
cv2.GaussianBlur()関数を使って、imageに対してガウシアンフィルタを
適用してブラー画像を作成します
ガウシアンフィルタは、画像をぼかす処理を行うフィルタで、画像内のノイズ
を軽減するために使われます
第三引数の(0, 0)はカーネルサイズを指定しており、ここでは3x3のカーネル
を使用してぼかし処理を行います
'''

# マスク画像の作成
mask = cv2.addWeighted(image, 1.5, blurred, -0.5, 0)
'''
cv2.addWeighted()関数を使って、元の画像imageとブラー画像blurredを
組み合わせてマスク画像maskを作成します
このマスク画像には、元の画像との差分が強調されたエッジ情報が含まれます
第二引数の1.5と第四引数の-0.5はそれぞれ元の画像とブラー画像の重みを調整
するパラメータで、エッジの強調度を制御します
'''

# シャープネスの強化
sharpened = cv2.addWeighted(image, 1.5, mask, 0.5, 0)
'''
最後に、元の画像imageとマスク画像maskを組み合わせて、シャープネスを強化
した画像sharpenedを作成します
これにより、元の画像にエッジが強調された画像が重ね合わされます
第二引数の1.5と第四引数の0.5は、元の画像とマスク画像の重みを調整するパラ
メータです
'''

# 結果の表示
cv2.imshow("Sharpened Image", sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()

上記のコードでは、それぞれラプラシアンフィルタとアンシャープマスクを使用してシャープネスを強化しています

画像処理の結果を確認するために、元の画像と強化された画像を比較してみてください

シャープネスの強化は、写真や画像の魅力を高めるために非常に重要な処理です

写真によっては、シャープネスの強化が不要な場合もありますが、撮影時のミスや画像の品質向上を目指す際には、適切にシャープネスを強化することで、より魅力的な写真を作成することができます

ぜひ、Pythonを使用してシャープネスの強化を試してみてください

おつー