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

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

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

 Abid Rahman K17 июн. 2012 г., 17:49
Привет, добавил обобщенный ответ для всех уровней.

Ответы на вопрос(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()

Этот код использует метод под названиемpalette method in Numpy что действительно быстрее, чем перебирать пиксели. Вы можете найти более подробную информацию о том, как это можно использовать для ускорения кода здесь:Fast Array Manipulation in Numpy

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

Original Image :

enter image description here

Level 2 :

enter image description here

Level 4 :

enter image description here

Level 8 :

enter image description here

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

 31 мар. 2014 г., 16:36
сначала вы найдете число между уровнями. Например, если 2 уровня, возьмите 127, чтобы разделить цвета. Тогда все цвета станут 0 и 1. Если 3 уровня, взять около 85 и так далее. Тогда деление даст 0,1,2. Затем вы расширяете их до 0,127, 255 и т. Д.
 31 мар. 2014 г., 14:23
Я пытаюсь преобразовать это в C ++, как я могу квантовать цвета
Решение Вопроса

используя 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

 steve891816 июн. 2012 г., 18:45
вау потрясающе, спасибо! Я полный новичок с NumPy, я не понимал, что это был такой мощный, мне придется углубиться в это! Еще раз спасибо!

Ваш ответ на вопрос