こんにちは、タナカです。
この記事では、四角形で囲った範囲の画像の輝度値を確認するアプリケーションの説明をします。
画像の一部分の輝度値をヒストグラムで確認したい
毎回画像の輝度値を確認するためにコードを書き換えている
画像の輝度値を確認するアプリケーションを探している
という方に向けた記事となっています。
私自身、よく画像の解析で輝度値を確認するのですが、そのたびに画像を読み込ませたり、範囲を指定したりと直接コードを書き換えて行っていました。
画像を見て、直感的に操作して輝度値を確認できるアプリケーションが存在するといいなと思っていました。
自分が楽するためであったり、同じように輝度値を簡易的に確認したいというニーズを満たすために、今回アプリケーションを作りましたので共有したいと思います。
- 画像の輝度値をヒストグラムで表示するアプリケーションの紹介
1. アプリケーションのイメージ
アプリケーションのイメージはこのようになります。四角で囲った範囲の画像の輝度値をヒストグラムで表示することができます。
2. 実行環境
実行環境はこのようになっております。
python 3.8.11
PyQt5 5.15.4
matplotlib 3.4.3
numpy 1.21.2
opencv-python 4.5.3.56
3. アプリケーションの説明
ソースコードはgithubに入れましたので、そちらからご確認ください。
四角形を描画する方法は、【描画】画像の範囲外にマウスが来た時の挙動を考えるで詳しく解説していますので参考にしてください。
コードを抜粋して説明します。
初期化する関数が実行されるタイミング(クリックが離れるタイミング)で、選択した範囲のRGB値を取得します。
def getTargetArea(self, points):
self.x = int(min(points[0].x(), points[1].x()))
self.y = int(min(points[0].y(), points[1].y()))
self.w = int(abs(points[0].x() - points[1].x()))
self.h = int(abs(points[0].y() - points[1].y()))
rgbs = []
for w in range(self.w):
for h in range(self.h):
# pixmap -> QImageからQRGB値を取得
qrgb = self.pixmap.toImage().pixel(self.x + w, self.y + h)
rgb = [QtGui.qRed(qrgb), QtGui.qGreen(qrgb), QtGui.qBlue(qrgb)]
rgbs.append(rgb)
# 選択した範囲のrgb情報
self.target_area = np.array(rgbs).reshape(self.h, self.w, 3)
それと同時に初期化する関数の中で、範囲を指定したという信号を送っています。
# 初期化関数
def initialize(self):
self.shapes = [self.current]
self.current = None
# 信号の送信
self.targetAreaSelected.emit()
self.update()
送られてきた信号をMainWindowが受け取ります。
self.canvas.targetAreaSelected.connect(self.createHist)
信号を受け取った後に、ヒストグラムを作成する関数を実行します。
def createHist(self):
self.graph_window.axes.clear()
colors = ['r', 'g', 'b']
for i, color in enumerate(colors):
hist = cv2.calcHist([np.uint8(self.canvas.target_area)], [i], None, [256], [0, 256])
hist = np.sqrt(hist)
self.graph_window.axes.plot(hist, color = color)
self.graph_window.fig.canvas.draw()
その結果、ヒストグラムがグラフに描画されます。
まとめ
PyQt5を使って、四角で囲った範囲の画像の輝度値をヒストグラムで表示するアプリケーションを作りました。
これまで、取得したい画像の範囲を毎回数字を書き換えることで行っていましたが、このように直感的に操作できるアプリケーションを活用することで作業効率を上げることができます。
ぜひ活用してみてください。