コンテンツにスキップ

Top

OpenCVで画像の明るさのヒストグラムを均一化する

OpenCVで画像の明るさのヒストグラムを均一化するには2つの方法がある。

一つは equalizeHist を使う方法。

もうひとつは、 createCLAHE を使う方法。

個人的には後者のほうがいい感じだと思う。equalizeHistは大抵の場合明るすぎな感じになる。

グレースケールの画像だとそのままだが、カラーの場合はHSV形式に変換した後、V(明るさ)の要素だけを均一化する必要がある。

equalizeHist で画像のヒストグラムを均一化する

明るさを平坦化する。グレースケールでしか使えないが、カラーの場合はHSV画像に変換後、V(明るさ)部分だけを変換することで均一化が可能。

・グレースケールの場合

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2 

flowers = cv2.imread('flowers_gray.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('flowers', flowers)

flowers_hist = cv2.equalizeHist(flowers)
cv2.imshow('flowers_hist', flowers_hist)

cv2.waitKey(0)

オリジナル画像
flower

均一化後画像
flower

・カラーの場合

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2 

flowers = cv2.imread('flowers.jpg')
cv2.imshow('flowers', flowers)

hsv = cv2.cvtColor(flowers, cv2.COLOR_BGR2HSV)
hsv[:,:,2] = cv2.equalizeHist(hsv[:,:,2])
flowers_hist = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

cv2.imshow('flowers_hist', flowers_hist)

cv2.waitKey(0)

オリジナル画像
flower

均一化後画像
flower

createCLAHE で画像のヒストグラムを均一化する

createCLAHE は 適用的ヒストグラム平坦化 とも言うらしく、tileGridSizeで指定したサイズで分割した領域単位でヒストグラムを均一化する。
equalizeHist よりいい感じの見た目になる場合が多い。

・グレースケールの場合

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2 

flowers = cv2.imread('flowers_gray.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('flowers', flowers)

clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
flowers_clahe = clahe.apply(flowers) 
cv2.imshow('flowers_clahe', flowers_clahe)

cv2.waitKey(0)

オリジナル画像
flower

均一化後画像
flower

・カラーの場合

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2 

flowers = cv2.imread('flowers.jpg')
cv2.imshow('flowers', flowers)

hsv = cv2.cvtColor(flowers, cv2.COLOR_BGR2HSV)
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
hsv[:,:,2] = clahe.apply(hsv[:,:,2]) 
flowers_clahe = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow('flowers_clahe', flowers_clahe)

cv2.waitKey(0)

オリジナル画像
flower

均一化後画像
flower

createCLAHE の引数で指定している clipLimit の意味は知らん。大きいとより明るくなるぐらい。大体2〜4の値をつけるのが良いらしい。
ちなみに10で以下ぐらい違う。不自然な感じだし、2ぐらいでいいと思う。

clipLimit=10の画像
flower

以上!