Convert RGB to black OR white

匿名 (未验证) 提交于 2019-12-03 02:13:02

问题:

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

Is there any built-in functionality for this in the popular Python image processing libraries? If not, would the best way be just to loop through each pixel, if it's closer to white set it to white, if it's closer to black set it to black?

回答1:

Scaling to Black and White

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

Original:

Result:

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:

Converted:

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


回答2:

I would suggest converting to grayscale, then simply applying a threshold (halfway, or mean or meadian, if you so choose) to it.

from PIL import Image  col = Image.open('myimage.jpg') gry = col.convert('L') grarray = np.asarray(gry) bw = (grarray > grarray.mean())*255 imshow(bw) 


回答3:

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:

Converted:



回答4:

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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!