mainvisual

今回のゼミでは、「ヒストグラム平坦化による、コントラスト強調」の実装を行いました。 前回は、C++を使いましたが、 ゼミでの目的は「処理の内容を理解する」ということで、内容を理解していればいいので、 一番書き方が簡単なPythonを採用することにしました。

OpenCVのインストール方法は以下を見てください

Homebrewを使ってOpenCV3、Python2,3をMacにインストールする

ソースコード

もう、初めからソースコードです。

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

import cv2
import numpy as np

src = cv2.imread("./lenna_512x512.bmp", -1)
dst = np.zeros_like(src)

# print(src.dtype)

histo = [0] * 256

row_len, cal_len = src.shape

# ヒストグラムを求める
for x in range(row_len):
    for y in range(cal_len):
        histo[src[x][y]] = histo[src[x][y]] + 1

# 累積ヒストグラムに変更
for i in range(len(histo) - 1):
    histo[i+1] = histo[i] + histo[i+1]

# ヒストグラムを平坦化
histo = np.array(histo)
histo = (histo / histo.max() * 255).astype("uint8")

# ヒストグラムの表示
print(histo)

# ヒストグラム平坦化
for x in range(row_len):
    for y in range(cal_len):
        dst[x][y] = histo[src[x][y]]


cv2.imshow("result", dst)
cv2.waitKey(0)

内容の解説をちょこっと

histoという配列にマップテーブルを作ります。 もし、あるピクセルの値が214だったら、histo[214]をインクリメントして、 出現回数を調べます。

そして、それを 0~255までの値に正規化をします。 つまり、0~65025(255 * 255)を0~255に圧縮するということです。

そして、その情報を元に、画像を再構成します。

まとめ

今回のゼミでは、ソースコードを書くのは案外簡単なのですが、 その内容を理解するのが大変でした。

実際に出来たけれども、それをイメージできていないというか、 なぜそうなるのかしっくりとした感じがありません。

まだまだ修行不足ということですなぁ。