Adobe Photoshop-style posterization and OpenCV

前端 未结 3 1513
南笙
南笙 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...

    0 讨论(0)
  • 2020-12-09 05:33

    We can do this quite neatly using numpy, without having to worry about the channels at all!

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

    output:

    enter image description here

    input:

    enter image description here

    0 讨论(0)
  • 2020-12-09 05:43

    The coolest "posterization" I have seen uses Mean Shift Segmentation. I used the code from the author's GitHub repo to create the following image (you need to uncomment line 27 of Maincpp.cpp to perform the segmentation step).

    0 讨论(0)
提交回复
热议问题