Chapter 09

ヒストグラム

Atsushi Asakura
Atsushi Asakura
2024.01.07に更新

ヒストグラム

Script CHOPでcv2.calcHistにより、画像の輝度のヒストグラムを作成します。

import numpy as np
import cv2

def onCook(scriptOp):
	scriptOp.clear()
	frame = op('INPUT').numpyArray(delayed=True)
	if frame is None:
		return
	frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
	frame = (frame * 255.0).astype(np.uint8)
	histogram = cv2.calcHist([frame], [0], None, [256], [0, 256])
	scriptOp.numSamples = histogram.shape[0]
	channel = scriptOp.appendChan('histogram')
	channel.copyNumpyArray(histogram.squeeze())

RGBの各チャネルごとにヒストグラムを作成する場合、以下のようにします。

import numpy as np
import cv2

def onCook(scriptOp):
	scriptOp.clear()

	frame = op('INPUT').numpyArray(delayed=True)
	if frame is None:
		return
	frame = (frame * 255.0).astype(np.uint8)

	red_histogram = cv2.calcHist([frame], [0], None, [256], [0, 256])
	green_histogram = cv2.calcHist([frame], [1], None, [256], [0, 256])
	blue_histogram = cv2.calcHist([frame], [2], None, [256], [0, 256])

	scriptOp.numSamples = red_histogram.shape[0]

	red_channel = scriptOp.appendChan('red')
	red_channel.copyNumpyArray(red_histogram.squeeze())
	green_channel = scriptOp.appendChan('green')
	green_channel.copyNumpyArray(green_histogram.squeeze())
	blue_channel = scriptOp.appendChan('blue')
	blue_channel.copyNumpyArray(blue_histogram.squeeze())

ヒストグラム平坦化

Script TOPでcv2.equalizeHistにより、入力画像のヒストグラム平坦化を行います。cv2.equalizeHistはデータ型がuint8のグレイスケール画像しかサポートしていないので、変換しています。

import numpy as np
import cv2

def onCook(scriptOp):
	frame = scriptOp.inputs[0].numpyArray(delayed=True)
	if frame is None:
		return
	gray_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
	gray_frame = (gray_frame * 255.0).astype(np.uint8)
	equalized_frame = cv2.equalizeHist(gray_frame)
	equalized_frame = np.expand_dims(equalized_frame, axis=2)
	scriptOp.copyNumpyArray(equalized_frame)

適応的ヒストグラム平坦化

Script TOPでcv2.createCLAHEにより、入力画像の局所領域ごとにヒストグラムを求めてヒストグラム平坦化を行います。

import numpy as np
import cv2

def onCook(scriptOp):
	frame = scriptOp.inputs[0].numpyArray(delayed=True)
	if frame is None:
		return
	gray_frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
	gray_frame = (gray_frame * 255.0).astype(np.uint8)
	clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
	equalized_frame = clahe.apply(gray_frame)
	equalized_frame = np.expand_dims(equalized_frame, axis=2)
	scriptOp.copyNumpyArray(equalized_frame)

参考

https://docs.opencv.org/4.8.0/de/db2/tutorial_py_table_of_contents_histograms.html