Convert RGB to black OR white

后端 未结 8 1057
我在风中等你
我在风中等你 2020-11-30 23:20

How would I take an RGB image in Python and convert it to black OR white? Not grayscale, I want each pixel to be either fully black (0, 0, 0) or fully white (255, 255, 255).

相关标签:
8条回答
  • 2020-11-30 23:25

    Scaling to Black and White

    Convert to grayscale and then scale to white or black (whichever is closest).

    Original:

    meow meow tied up cat

    Result:

    Black and white Cat, Pure

    Pure Pillow implementation

    Install pillow if you haven't already:

    $ pip install pillow
    

    Pillow (or PIL) can help you work with images effectively.

    from PIL import Image
    
    col = Image.open("cat-tied-icon.png")
    gray = col.convert('L')
    bw = gray.point(lambda x: 0 if x<128 else 255, '1')
    bw.save("result_bw.png")
    

    Alternatively, you can use Pillow with numpy.

    Pillow + Numpy Bitmasks Approach

    You'll need to install numpy:

    $ pip install numpy
    

    Numpy needs a copy of the array to operate on, but the result is the same.

    from PIL import Image
    import numpy as np
    
    col = Image.open("cat-tied-icon.png")
    gray = col.convert('L')
    
    # Let numpy do the heavy lifting for converting pixels to pure black or white
    bw = np.asarray(gray).copy()
    
    # Pixel range is 0...255, 256/2 = 128
    bw[bw < 128] = 0    # Black
    bw[bw >= 128] = 255 # White
    
    # Now we put it back in Pillow/PIL land
    imfile = Image.fromarray(bw)
    imfile.save("result_bw.png")
    

    Black and White using Pillow, with dithering

    Using pillow you can convert it directly to black and white. It will look like it has shades of grey but your brain is tricking you! (Black and white near each other look like grey)

    from PIL import Image 
    image_file = Image.open("cat-tied-icon.png") # open colour image
    image_file = image_file.convert('1') # convert image to black and white
    image_file.save('/tmp/result.png')
    

    Original:

    meow meow color cat

    Converted:

    meow meow black and white cat

    Black and White using Pillow, without dithering

    from PIL import Image 
    image_file = Image.open("cat-tied-icon.png") # open color image
    image_file = image_file.convert('1', dither=Image.NONE) # convert image to black and white
    image_file.save('/tmp/result.png')
    
    0 讨论(0)
  • 2020-11-30 23:27
    img_rgb = cv2.imread('image.jpg')
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    (threshi, img_bw) = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    
    0 讨论(0)
  • 2020-11-30 23:29

    If you don't want to use cv methods for the segmentation and understand what you are doing, treat the RGB image as matrix.

    image = mpimg.imread('image_example.png') # your image
    R,G,B = image[:,:,0], image[:,:,1], image[:,:,2] # the 3 RGB channels
    thresh = [100, 200, 50] # example of triple threshold
    
    # First, create an array of 0's as default value
    binary_output = np.zeros_like(R)
    # then screen all pixels and change the array based on RGB threshold.
    binary_output[(R < thresh[0]) & (G > thresh[1]) & (B < thresh[2])] = 255
    

    The result is an array of 0's and 255's based on a triple condition.

    0 讨论(0)
  • 2020-11-30 23:32

    Here is the code for creating binary image using opencv-python :

    img = cv2.imread('in.jpg',2)
    
    ret, bw_img = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    
    cv2.imshow("Output - Binary Image",bw_img)
    
    0 讨论(0)
  • 2020-11-30 23:35

    Using opencv You can easily convert rgb to binary image

    import cv2
    %matplotlib inline 
    import matplotlib.pyplot as plt
    from skimage import io
    from PIL import Image
    import numpy as np
    
    img = io.imread('http://www.bogotobogo.com/Matlab/images/MATLAB_DEMO_IMAGES/football.jpg')
    img = cv2.cvtColor(img, cv2.IMREAD_COLOR)
    imR=img[:,:,0] #only taking gray channel
    print(img.shape)
    plt.imshow(imR, cmap=plt.get_cmap('gray'))
    
    #Gray Image
    plt.imshow(imR)
    plt.title('my picture')
    plt.show()
    
    #Histogram Analyze
    
    imgg=imR
    hist = cv2.calcHist([imgg],[0],None,[256],[0,256])
    plt.hist(imgg.ravel(),256,[0,256])
    
    # show the plotting graph of an image
    
    plt.show()
    
    #Black And White
    height,width=imgg.shape
    for i in range(0,height):
      for j in range(0,width):
         if(imgg[i][j]>60):
            imgg[i][j]=255
         else:
            imgg[i][j]=0
    
    plt.imshow(imgg)
    
    0 讨论(0)
  • 2020-11-30 23:40

    And you can use colorsys (in the standard library) to convert rgb to hls and use the lightness value to determine black/white:

    import colorsys
    # convert rgb values from 0-255 to %
    r = 120/255.0
    g = 29/255.0
    b = 200/255.0
    h, l, s = colorsys.rgb_to_hls(r, g, b)
    if l >= .5:
        # color is lighter
        result_rgb = (255, 255, 255)
    elif l < .5:
        # color is darker
        result_rgb = (0,0,0)
    
    0 讨论(0)
提交回复
热议问题