2012-06-16 40 views
9

指定されたレベルの数に基づいて、各カラーチャンネルを別々に量子化することによってAdobe Photoshopがポスタリゼーションを行うようです。たとえば、2つのレベルを指定すると、R値をとり、R値が128より小さい場合は0に、値が128より大きい場合は255に設定します。これはGとBについても同様です。Adob​​e PhotoshopスタイルのポスタリゼーションとOpenCV

OpenCVを使ってPythonでこれを行う効率的な方法はありますか?各ピクセルを繰り返し処理してその比較を行い、値を別々に設定するのですか? OpenCV 2.4の画像はNumPyのndarrayなので、おそらくNumPyを通してこの計算を行う効率的な方法はありますか?

+1

こんにちは、すべてのレベルのための一般的な答えを追加しました。 –

答えて

7

チャネルをまったく気にすることなく、numpyを使ってこれをきちんと行うことができます!

import cv2 
im = cv2.imread('1_tree_small.jpg') 
im[im >= 128]= 255 
im[im < 128] = 0 
cv2.imwrite('out.jpg', im) 

出力:

enter image description here

入力:

enter image description here

+0

すごいよ、ありがとう!私はぬるぬるしている完全な初心者です、私はそれがこの強力だったことに気づいていませんでした、私はこれを深く見なければなりません!再度、感謝します! – steve8918

7

ご質問は、具体的なレベル2程度のレベルしかし、どのような2以上について尋ねているようです。だから私は任意のレベルの色のposterizeすることができます下のコードを追加しました。

import numpy as np 
import cv2 

im = cv2.imread('messi5.jpg') 

n = 2 # Number of levels of quantization 

indices = np.arange(0,256) # List of all colors 

divider = np.linspace(0,255,n+1)[1] # we get a divider 

quantiz = np.int0(np.linspace(0,255,n)) # we get quantization colors 

color_levels = np.clip(np.int0(indices/divider),0,n-1) # color levels 0,1,2.. 

palette = quantiz[color_levels] # Creating the palette 

im2 = palette[im] # Applying palette on image 

im2 = cv2.convertScaleAbs(im2) # Converting image back to uint8 

cv2.imshow('im2',im2) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

このコードは、ピクセルを反復処理するよりも、本当に速いですnumpyのでパレット法と呼ばれる方法を使用しています。あなたはここにコードをスピードアップするために使用することができる方法の詳細を見つけることができます。

オリジナル画像::Fast Array Manipulation in Numpy以下

は、私はさまざまなレベルで得られた結果である

enter image description here

レベル2:

enter image description here

レベル4:

enter image description here

レベル8:

enter image description here

のように...

+0

これをC++で変換しようとしていますが、どのようにして色を量子化することができますか? – AHF

+1

最初にレベル間の数値を見つけます。たとえば、2つのレベルの場合は、127で色を分割します。それから、すべての色が0と1になります.3つのレベルの場合は、約85をとります。その後、分割すると0,1,2が得られます。その後、それらを0,127,255などに展開します。 –

関連する問題