楽しいプロジェクトでは、いくつかの画像、特にどの色(色相)が他の色よりも見やすいものを分析したい。色の「可視性」を考慮するには、ピクセルの色相を数えるだけでは不十分です(たとえば、完全な黒は、その色相が0°になると赤としてカウントされます)。私は私のプロジェクトに十分なIMOという数式を思いついた。画像の彩度と値に関する色相値から色の可視性を計算するnumpy配列
- はOpenCVので画像を読み取る、各画素についてHSV
- に画像を変換(その色相の可視性を計算
- (BGRのnumpyのアレイ内の結果):
は現在、私は次の手順を実行し彩度と値から)を計算し、それを色相の表記で合計します。
式はです。したがって、完全赤色のRGB=255,0,0; HSV=0,1,1
は、1
となります。明るい赤色のRGB=255,128,128; HSV=0,0.5,1
は0.70
になります。
import urllib
import cv2
import numpy as np
url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Leuchtturm_in_Westerheversand_crop.jpg/299px-Leuchtturm_in_Westerheversand_crop.jpg'
image = np.asarray(bytearray(urllib.urlopen(url).read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
d = {}
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
pixels = hsv.reshape((hsv.shape[0] * hsv.shape[1], 3))
for h,s,v in pixels:
d[h] = d.get(h, 0.) + (s/255. * v/255.) ** 0.5
お察しの通り、画像がより多くのピクセルを持っている場合、コードは本当に遅くなる:ここで
私が使用して(完全に動作)コードがあります。
私の質問は、私はdictとfor-loopなしで私の計算式をどのように計算できますか?たぶんnumpyと直接ですか?
ありがとうございます、私はnumpyに新しいです、何を検索するのか分からなかったです。大変感謝しています:) – sphere
@sphere 'bincount'はすばらしいです。だから、吹き飛ばす準備をしてください:) – Divakar
確かに、numpyとすべてのものとして。 'bincount'のためのドキュメントを読んだ後でさえ、私はこのように使うことができるとは知らなかったでしょう... – sphere