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)
输出:
输入: