15

Adobe Photoshop は、指定されたレベル数に基づいて、各カラー チャネルを個別に量子化することでポスタリゼーションを行うようです。たとえば、2 つのレベルを指定すると、R 値が取得され、R 値が 128 未満の場合は 0 に設定され、値が 128 以上の場合は 255 に設定されます。G と B についても同じことが行われます。 .

各ピクセルを反復処理し、その比較を行い、値を個別に設定する以外に、OpenCV を使用して Python でこれを行う効率的な方法はありますか? OpenCV 2.4 の画像は NumPy ndarray であるため、厳密に NumPy を使用してこの計算を行う効率的な方法はありますか?

4

5 に答える 5

18

あなたの質問は具体的にはレベル2について尋ねているようです。しかし、レベル2以上についてはどうですか。したがって、任意のレベルの色をポスタライズできるコードを以下に追加しました。

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

以下は、さまざまなレベルで得られた結果です。

元の画像:

ここに画像の説明を入力

レベル2 :

ここに画像の説明を入力

レベル 4 :

ここに画像の説明を入力

レベル 8 :

ここに画像の説明を入力

等々...

于 2012-06-17T15:49:18.387 に答える
11

チャネルをまったく気にすることなく、numpy を使用してこれを非常にきれいに行うことができます。

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

出力:

ここに画像の説明を入力

入力:

ここに画像の説明を入力

于 2012-06-16T16:25:45.097 に答える