1 はじめに
画像処理シリーズの継続へようこそ。ホワイト バランスの主要なテクニックを探ります。くすんだ写真、色あせた写真、または不自然な色の写真を撮影したことがある場合は、この機会にホワイト バランス テクニックの重要性を学びましょう。この記事では、ホワイト バランスの概念を詳しく説明し、画像の品質を向上させるためのさまざまなアルゴリズムを検討します。
さっそく始めましょう!
2. 定義
ホワイトバランスは、さまざまな照明条件によって生じる画像の色補正を補正するために使用される技術です。これは、白が白く見え、黒が黒に見えるように、画像の色のコントラストを調整するプロセスです。これは、画像の色が正確で、人間の目に自然に見えるようにするために非常に重要です。
3. サンプル画像の読み込み
いつものように、最初に必要な Python ライブラリを次のようにインポートします。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage import io, img_as_ubyte
from skimage.io import imread, imshow
from matplotlib.patches import Rectangle
次に、次のコードを使用してサンプル画像をロードします。コードは次のとおりです。
from skimage import io
import matplotlib.pyplot as plt
image = io.imread('qmark.png')
plt.figure(figsize=(10,10))
plt.title('Original Image')
plt.imshow(image)
plt.show()
結果は次のとおりです。
4. 統計データの分析
画像内の統計を分析するには、次の関数を使用してみましょう。
def calc_color_overcast(image):
# Calculate color overcast for each channel
red_channel = image[:, :, 0]
green_channel = image[:, :, 1]
blue_channel = image[:, :, 2]
# Create a dataframe to store the results
channel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median', 'P_80', 'P_90', 'P_99', 'Max'])
# Compute and store the statistics for each color channel
for channel, name in zip([red_channel, green_channel, blue_channel], ['Red', 'Green', 'Blue']):
mean = np.mean(channel)
std = np.std(channel)
minimum = np.min(channel)
median = np.median(channel)
p_80 = np.percentile(channel, 80)
p_90 = np.percentile(channel, 90)
p_99 = np.percentile(channel, 99)
maximum = np.max(channel)
channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]
return channel_stats
得られた結果は次のとおりです。
上記のデータ フレームの結果から、画像に青いアーチファクトが現れていることが明らかです。慎重に分析すると、各パーセンタイルの平均値が最も高く、青チャネルの中央値が最大になります。
5. ホワイトパッチアルゴリズム
ホワイト パッチ アルゴリズムは、画像処理で最も一般的に使用されるカラー バランシング方法の 1 つで、各チャネルの最も明るいピクセルが白になるようにカラー チャネルをスケーリングすることで画像内の色かぶりを補正することを目的としています。これは、画像内の最も明るいピクセルが白であると仮定することによって実現されます。
対応するコードは次のように実装されます。
def white_patch(image, percentile=100):
"""
Returns a plot comparison of original and corrected/white balanced image
using the White Patch algorithm.
Parameters
----------
image : numpy array
Image to process using white patch algorithm
percentile : integer, optional
Percentile value to consider as channel maximum
"""
white_patch_image = img_as_ubyte(
(image * 1.0 / np.percentile(image,
percentile,
axis=(0, 1))).clip(0, 1))
# Plot the comparison between the original and white patch corrected images
fig, ax = plt.subplots(1, 2, figsize=(10, 10))
ax[0].imshow(image)
ax[0].set_title('Original Image')
ax[0].axis('off')
ax[1].imshow(white_patch_image, cmap='gray')
ax[1].set_title('White Patch Corrected Image')
ax[1].axis('off')
plt.show()
# Read the input image
image = imread('qmark.png')
# Call the function to implement white patch algorithm
white_patch(image, 100)
結果は次のとおりです。画像の RGB 最大値が 255 であるため、
デフォルトのパラメータを使用しても画像は大幅に改善されません。前の章の統計を観察すると、最大値と 99 パーセンタイルが次のとおりであることがわかります。どちらも255。percentile=100
[255255255]
上記の問題を解決するには、絶対最大値ではなく、ピクセル値の下位パーセンタイルを最大値として扱うことができます。それでは、85 パーセンタイルを試してみましょう。
white_patch(image, 85)
結果は次のとおりです。
85 パーセンタイルを正しく使用すると、画像の色が改善されます。ご覧のとおり、次の色が正しく割り当てられています。
クエスチョン マーク ブロック: 黄色
マリオの帽子: 赤
バックパック: 茶色
靴: 黒と白
壁: さまざまな青の色合い
6. メリットとデメリットの分析
次に、上記のアルゴリズムの長所と短所を分析します。これは次のように要約できます。
- シンプルで使いやすい。
- 主に白い領域またはニュートラル グレーの領域を持つ画像のホワイト バランスの問題を効果的に補正します。
- 画像内に明確な明るい領域がある場合に効果的です。
その欠点は次のように要約できます。
- 画像内で最も明るい色は白であると想定されていますが、これが常に真実であるとは限りません。
- この仮定が当てはまらない場合、過剰補正が行われ、不自然な色やアーチファクトが生じる可能性があります。
- 画像の特定の領域で色のずれやアーチファクトが発生する場合があります。
7. まとめ
この記事では、White Patch Algorithm
画質を向上させるためにホワイト バランスに使用されるアルゴリズムの詳細に焦点を当て、アルゴリズムの長所と短所を要約し、対応するコード例を示します。
あなたは駄目ですか?