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
Convert RGB to black OR white
提问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:
原来的:
Result:
结果:
Pure Pillow implementation
纯枕头实现
Install pillow
if 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.
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:
原来的:
Converted:
转换:
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:
原来的:
Converted:
转换:
回答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 数组。