Adobe Photoshop风格的海报化和OpenCV

ste*_*918 14 python opencv numpy

似乎Adobe Photoshop通过根据指定的级别数量分别量化每个颜色通道来进行分色.因此,例如,如果指定2个级别,则它将采用R值,如果R值小于128则将其设置为0或者如果值> = 128则将其设置为255.对于G和B,它将执行相同的操作.

有没有一种有效的方法在使用OpenCV的python中执行此操作,除了迭代每个像素并进行比较并单独设置值?由于OpenCV 2.4中的图像是NumPy ndarray,有没有一种有效的方法可以通过NumPy严格执行此计算?

Abi*_*n K 15

你的问题似乎特别是询问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()
Run Code Online (Sandbox Code Playgroud)

这段代码在Numpy中使用了一个名为palette方法的方法,它比迭代像素要快.您可以在此处找到有关如何使用它来加速代码的更多详细信息:Numpy中的快速数组操作

以下是我获得的不同级别的结果:

原始图片:

在此输入图像描述

2级:

在此输入图像描述

4级:

在此输入图像描述

8级:

在此输入图像描述

等等...


fra*_*xel 10

我们可以非常巧妙地使用numpy,而不必担心频道!

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

输出:

在此输入图像描述

输入:

在此输入图像描述