Кажется, 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]()
И так далее...
Ответ 3
Самая крутая "постеризация", которую я видел, использует
Сегментация среднего смещения. Я использовал код
от автора репозитория GitHub, чтобы создать следующее изображение (необходимо
раскомментируйте строку 27 из Maincpp.cpp, чтобы выполнить этап сегментации).
![enter image description here]()