Постеризация в стиле Adobe Photoshop и OpenCV

Кажется, Adobe Photoshop выполняет постеризацию путем квантования каждого цветового канала отдельно, исходя из количества указанных уровней. Так, например, если вы укажете 2 уровня, тогда оно примет значение R и установит его на 0, если ваше значение R меньше 128 или 255, если ваше значение >= 128. Оно будет делать то же самое для G и B.

Есть ли эффективный способ сделать это в python с OpenCV, кроме повторения через каждый пиксель, и сделать это сравнение и установить значение отдельно? Поскольку изображение в OpenCV 2.4 является NumPy ndarray, возможно ли эффективный способ сделать этот расчет строго через NumPy?

Ответ 1

Мы можем сделать это довольно аккуратно, используя 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

Ответ 2

В вашем вопросе, по-видимому, задается вопрос о уровне 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, который очень быстро, чем итерация через пиксели. Вы можете найти более подробную информацию о том, как его можно использовать для ускорения кода здесь: Манипуляция с быстрым массивом в Numpy

Ниже приведены результаты, полученные мной для разных уровней:

Исходное изображение:

enter image description here

Уровень 2:

enter image description here

Уровень 4:

enter image description here

Уровень 8:

enter image description here

И так далее...