Python 将 RGB 转换为黑色或白色

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18777873/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 11:49:21  来源:igfitidea点击:

Convert RGB to black OR white

pythonopencvnumpypython-imaging-library

提问by Tom

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

我如何在 Python 中获取 RGB 图像并将其转换为黑色或白色?不是灰度,我希望每个像素要么全黑(0、0、0)要么全白(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?

在流行的 Python 图像处理库中是否有任何内置功能?如果不是,最好的方法是循环遍历每个像素,如果它更接近白色将其设置为白色,如果它更接近黑色将其设置为黑色?

采纳答案by Kyle Kelley

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 pillowif you haven't already:

pillow如果您还没有安装,请安装:

$ pip install pillow

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

Pillow(或 PIL)可以帮助您有效地处理图像。

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 Pillowwith numpy.

或者,您可以将Pillownumpy一起使用。

Pillow + Numpy Bitmasks Approach

Pillow + Numpy 位掩码方法

You'll need to install numpy:

你需要安装numpy:

$ pip install numpy

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

Numpy 需要一个数组的副本来操作,但结果是一样的。

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

使用 Pillow 的黑色和白色,带有抖动

Using pillowyou 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

使用 Pillow 的黑白,无抖动

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

回答by askewchan

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)

回答by Kyle Kelley

Pillow, with dithering

枕头,抖动

Using pillowyou 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

喵喵黑白猫

回答by monkut

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

您可以使用colorsys(在标准库中)将 rgb 转换为hls并使用亮度值来确定黑/白:

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)

回答by shawon

Using opencv You can easily convert rgb to binary image

使用 opencv 可以轻松地将 rgb 转换为二进制图像

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)

回答by monti

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)

回答by Maifee Ul Asad

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

这是使用 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)

回答by Gabriel123

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

如果您不想使用 cv 方法进行分割并了解您在做什么,请将 RGB 图像视为矩阵。

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 和 255 数组。