PythonとOpenCVを使用して画像のヒストグラムを作成する方法を紹介します。ヒストグラムは、画像の画素値の分布を視覚化するためのツールであり、画像処理において重要な役割を果たします。
OpenCVのcalcHist関数
OpenCVのcalcHist
関数を使用すると、画像から指定したチャンネルのヒストグラムを計算することができます。以下にその基本的な使用方法を示します。
hist = cv2.calcHist(images, channels, mask, histSize, ranges)
ここで、
– images
: 処理対象の画像のリスト
– channels
: ヒストグラムを計算するチャンネルのリスト
– mask
: マスクのリスト
– histSize
: 各チャンネルのビン数
– ranges
: 各チャンネルのヒストグラムの範囲
となります。
グレースケール画像のヒストグラム
グレースケール画像のヒストグラムを作成する場合、channels=[0]
、histSize=[ビンの数]
、ranges=[下限, 上限]
と指定します。
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 画像をグレースケール形式で読み込む。
img = cv2.imread("sample.jpg", cv2.IMREAD_GRAYSCALE)
# 1次元ヒストグラムを作成する。
n_bins = 100 # ビンの数
hist_range = [0, 256] # 集計範囲
hist = cv2.calcHist([img], channels=[0], mask=None, histSize=[n_bins], ranges=hist_range)
hist = hist.squeeze(axis=-1) # (n_bins, 1) -> (n_bins,)
# 描画する。
def plot_hist(bins, hist, color):
centers = (bins[:-1] + bins[1:]) / 2
widths = np.diff(bins)
ax.bar(centers, hist, width=widths, color=color)
bins = np.linspace(*hist_range, n_bins + 1)
fig, ax = plt.subplots()
ax.set_xticks([0, 256])
ax.set_xlim([0, 256])
ax.set_xlabel("Pixel Value")
plot_hist(bins, hist, color="k")
plt.show()
このコードは、指定した画像のヒストグラムを計算し、それを表示します。
カラー画像のヒストグラム
カラー画像のヒストグラムを作成する場合も、同様にchannels=[チャンネル]
、histSize=[ビンの数]
、ranges=[下限, 上限]
と指定します。例えば、BGR画像の場合、0がblue、1がgreen、2がredになります。
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("sample.jpg")
n_bins = 256
hist_range = [0, 256]
hists = []
channels = {0: "blue", 1: "green", 2: "red"}
for ch in channels:
hist = cv2.calcHist([img], channels=[ch], mask=None, histSize=[n_bins], ranges=hist_range)
hist = hist.squeeze(axis=-1)
hists.append(hist)
def plot_hist(bins, hist, color):
centers = (bins[:-1] + bins[1:]) / 2
widths = np.diff(bins)
ax.bar(centers, hist, width=widths, color=color)
bins = np.linspace(*hist_range, n_bins + 1)
fig, ax = plt.subplots()
ax.set_xticks([0, 256])
ax.set_xlim([0, 256])
ax.set_xlabel("Pixel Value")
for hist, color in zip(hists, channels.values()):
plot_hist(bins, hist, color)
plt.show()
このコードは、指定したカラー画像の各チャンネルのヒストグラムを計算し、それを表示します。
以上がPythonとOpenCVを使用して画像のヒストグラムを作成する基本的な方法です。ヒストグラムは画像の特性を理解し、画像処理の各種タスクに役立てることができます。