LoginSignup
8
12

More than 3 years have passed since last update.

OpenCVでトラックバーを利用して画像の閾値調整

Posted at

はじめに

OpenCVのトラックバーを使用して、
画像処理時のパラメータを調整するためのテストプログラム。
今回は、ガンマ補正した画像に対して二値化を行う。

テスト用画像の読み込み

カメラから取得した画像を使用する。
取得した画像をグレースケールに変換して画素値の最大を取得(ガンマ補正用)

import cv2
import sys

cameraId = 0

capCam = cv2.VideoCapture(cameraId)
if not capCam.isOpened():
    sys.exit()

ret, frame = capCam.read()

gray = cv2.cvtColor(frame, cv2.COLOR_RGBA2GRAY)
grayMax = gray.max()

トラックバーを生成する

ガンマ補正値(gamma)と閾値(threshold1)を調整するためのトラックバーを生成する

gamma = 0.5
threshold = 28

def nothing(x):
    pass

cv2.namedWindow('window')

cv2.createTrackbar('gamma','window', int(gamma*10) , 50, nothing)
cv2.createTrackbar('threshold1','window', threshold , 255, nothing)

引数は以下のようになっている
CreateTrackbar(trackbarName, windowName, value, count, onChange)
- trackbarname : 作成されるトラックバーの名前
- windowName : 作成されるトラックバーの親として用いられるウィンドウの名前(事前に生成しておく)
- value : 作成時のスライダー位置
- count : スライダーの最大値(最小値は0固定)
- onChange : スライダーの位置変更時のコールバック

gammaには0.1刻みの値を適用したいため、
トラックバー上は10倍した値としている。

トラックバーと画像の表示

トラックバーから値を取得して画像に適用する

import numpy as np

delay = 1
ESC_KEY = 27

while True:
    # ESCキーを入力したら終了
    if cv2.waitKey(delay) == ESC_KEY:
        break

    # トラックバーから値を取得
    gamma = cv2.getTrackbarPos('gamma','window')
    threshold = cv2.getTrackbarPos('threshold1','window')

    if gamma > 0:
        gamma /= 10
    else:
        gamma = 0.1

    # ガンマ補正
    lut = np.zeros((256, 1), dtype='uint8')
    for i in range(256):
        lut[i][0] = grayMax * pow(float(i)/grayMax, 1.0/gamma)
    gray_gamma = cv2.LUT(gray, lut)

    # 二値化
    ret, threshold = cv2.threshold(gray_gamma, threshold, 255, cv2.THRESH_BINARY)

    # 描画
    cv2.imshow("window", threshold)

gammaは1/10にした値を使用する。
0は許容できない(div/0で落ちる)ため、0.1に補正する。

表示させると以下のようなイメージとなる。
スライダーでパラメータを変更すると適用された値で描画される。

2020-07-20-165504_1920x1080_scrot.png

8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12