2017-05-24 6 views
1

楽しいプロジェクトでは、いくつかの画像、特にどの色(色相)が他の色よりも見やすいものを分析したい。色の「可視性」を考慮するには、ピクセルの色相を数えるだけでは不十分です(たとえば、完全な黒は、その色相が0°になると赤としてカウントされます)。私は私のプロジェクトに十分なIMOという数式を思いついた。画像の彩度と値に関する色相値から色の可視性を計算するnumpy配列

  • はOpenCVので画像を読み取る、各画素についてHSV
  • に画像を変換(その色相の可視性を計算
  • (BGRのnumpyのアレイ内の結果):

    は現在、私は次の手順を実行し彩度と値から)を計算し、それを色相の表記で合計します。

式は​​です。したがって、完全赤色のRGB=255,0,0; HSV=0,1,1は、1となります。明るい赤色のRGB=255,128,128; HSV=0,0.5,10.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と直接ですか?

答えて

1

それはビンとしてh値を使用して、ループの多いバージョンにかなりストレート前方翻訳としてあなたが探しているの魔法は、np.bincountである - 結果の配列は要素がゼロを持っているかもしれないことを

H,S,V = pixels.T 
d_arr = np.bincount(H, ((S/255.0) * (V/255.0))**0.5) 

注意

+0

ありがとうございます、私はnumpyに新しいです、何を検索するのか分からなかったです。大変感謝しています:) – sphere

+0

@sphere 'bincount'はすばらしいです。だから、吹き飛ばす準備をしてください:) – Divakar

+0

確かに、numpyとすべてのものとして。 'bincount'のためのドキュメントを読んだ後でさえ、私はこのように使うことができるとは知らなかったでしょう... – sphere

関連する問題