Adobe Photoshop-style posterization and OpenCV

前端 未结 3 1530
南笙
南笙 2020-12-09 04:47

It seems Adobe Photoshop does posterization by quantizing each color channel separately, based on the number of levels specified. So for example, if you specify 2 levels, t

3条回答
  •  离开以前
    2020-12-09 05:28

    Your question specifically seems to be asking about a level of 2. But what about levels more than 2. So i have added a code below which can posterize for any level of color.

    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()
    

    This code uses a method called palette method in Numpy which is really fast than iterating through the pixels. You can find more details how it can be used to speed up code here : Fast Array Manipulation in Numpy

    Below are the results I obtained for different levels:

    Original Image :

    enter image description here

    Level 2 :

    enter image description here

    Level 4 :

    enter image description here

    Level 8 :

    enter image description here

    And so on...

提交回复
热议问题