このチャプターの目次
ヒストグラム
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)
参考