Pythonを使用した画像の強化:ヒストグラム均等化チュートリアル
ぼやけた低品質の画像に失望したことはありますか? その画像を強化して、鮮明な詳細を明らかにし、明確さを改善することを想像してください。 このチュートリアルは、Pythonとヒストグラムの均等化の力を使用してこれを達成する方法を示しています。
ヒストグラムのイコライゼーションは、画像のコントラストを大幅に高める手法です。 これは、画質を向上させるためにほぼすべてのカメラシステムで使用される基本的なプロセスであり、このチュートリアルの終わりまでに、その理由はわかります。
ヒストグラムとヒストグラムの均等化、それらが画像にどのように影響するかを調べてから、Pythonで手法を実装します。始めましょう!画像ヒストグラムの理解
ヒストグラムは、数値データの分布を視覚的に表します。 X軸はデータ範囲(ビン)を示し、y軸は各ビン内の値の頻度を表示します。
画像処理では、各ピクセルには色と強度があります。色は通常、赤、緑、青(RGB)チャネル値で表され、0(色なし)から255(フルカラー)の範囲です。 カラーチャネルのヒストグラムは、そのチャネルの各強度値(0-255)の頻度を示しています。 RGB値はピクセルごとに同一であるため、グレースケール画像には単一のヒストグラムがあります。 狭い強度範囲に濃縮されたヒストグラムを備えた画像は、しばしば明確さと詳細に欠けています。 バランスの取れた画像は、より広く、より均等な強度の分布を示しています。
ヒストグラムの均等化とは?ヒストグラムのイコライゼーションは、画像のヒストグラムを伸ばして、完全な強度範囲を利用します。 これは、強度値を広めて暗い領域と明るい領域の両方を含むことを意味し、その結果、よりコントラストが高くなり、詳細の可視性が向上します。標準的な写真には必ずしも理想的ではありませんが、衛星やサーマルイメージングなどの詳細を強化する必要があるアプリケーションでは非常に貴重です。
例として、グレースケールのモンキー画像(コントラストが減少)を使用します。
ピクセル強度へのアクセス
pythonとopencvを使用してピクセル強度値にアクセスする方法を調べてみましょう:
このコードは画像を読み取り、その寸法を決定し、ピクセル値のサンプルを印刷します。 opencvはBGR(青、緑、赤)の順序を使用するため、
は各チャネルで113の強度を表します。
ヒストグラムのイコライゼーションは、これらのピクセル強度を変更してコントラストを強化します。 これは、ヒストグラムで視覚化できます。各カラーチャネル(またはグレースケール用の単一のヒストグラム)に1つ。 X軸は強度値を示し、y軸はその周波数を示します。
このヒストグラムは、BGRチャネル全体の分布を示しています。ピクセル値コードからのサンプル出力は、チャネル全体の一貫した強度値を示しています。
import cv2, random img = cv2.imread('monkey.jpg') img_shape = img.shape height = img_shape[0] width = img_shape[1] for row in range(width): for column in range(height): if random.randint(0, width) == row and row: print(img[column][row])
強度周波数の分析
このPythonコードは、ピクセル強度の頻度を計算します:
出力は、最も頻繁な強度値とそのカウントを示しており、限られた範囲の濃度を強調しています。 python
<code>[113 113 113] [110 110 110] [106 106 106] ...</code>
opencvの
関数を使用しますが、Grayscale画像でのみ機能します。 したがって、YUVカラースペースに変換し、Yチャネル(輝度)を均等にし、BGRに戻します:
equalizeHist()
完全な例と結果
import cv2 img = cv2.imread('monkey.jpg') img_shape = img.shape height = img_shape[0] width = img_shape[1] frequency = {} for row in range(width): for column in range(height): intensity = img[column][row][0] count = frequency.get(intensity, 0) frequency[intensity] = count + 1 print("Unique Intensities", len(frequency)) most_frequent = dict(sorted(frequency.items(), key=lambda elem: elem[1], reverse=True)) intensity_values = most_frequent.keys() i = 0 for intensity in intensity_values: i += 1 if i <= 5: print(intensity, most_frequent[intensity])
結果の画像(
):
import cv2 import numpy img = cv2.imread('monkey.jpg') img_to_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) img_to_yuv[:, :, 0] = cv2.equalizeHist(img_to_yuv[:, :, 0]) hist_equalization_result = cv2.cvtColor(img_to_yuv, cv2.COLOR_YUV2BGR) cv2.imwrite('result.jpg', hist_equalization_result)
result.jpg
強化された画像は、明確さが著しく改善されたことを示しています。 強化された画像のヒストグラムは平坦で、強度の均等な分布を示しています。 強度周波数分析は、値のより均等な分布も示します。
結論
このチュートリアルは、OpenCVを使用したPythonのヒストグラム均等化を使用して画像のコントラストを強化する方法を示しました。 結果は、画質と詳細な可視性を改善する上で、この手法の有効性を強調しています。 結果として得られるフラットヒストグラムは、ピクセル強度の再分配が成功したことを確認します。
以上がPythonのヒストグラム均等化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。