python - libreria - Convierte RGB a negro O blanco
python image library (5)
¿Cómo tomaría una imagen RGB en Python y la convertiría a negro O blanco? No en escala de grises, quiero que cada píxel sea totalmente negro (0, 0, 0) o completamente blanco (255, 255, 255).
¿Hay alguna funcionalidad incorporada para esto en las populares bibliotecas de procesamiento de imágenes de Python? De lo contrario, ¿la mejor manera sería simplemente recorrer cada píxel, si está más cerca de blanco establecerlo en blanco, si está más cerca de negro, establecerlo en negro?
Almohada, con tramado
Al usar una Pillow puede convertirla directamente a blanco y negro. ¡Parecerá que tiene tonos de gris pero tu cerebro te está engañando! (Blanco y negro cerca uno del otro se ven como gris)
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:
Convertido:
Escala a blanco y negro
Convierta a escala de grises y luego escale a blanco o negro (el que esté más cerca).
Original:
Resultado:
Implementación de Pure Pillow
Instala la pillow
si aún no lo has hecho:
$ pip install pillow
Pillow (o PIL) puede ayudarlo a trabajar con imágenes de manera efectiva.
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")
Alternativamente, puede usar Pillow con numpy .
Pillow + Numpy Bitmasks Enfoque
Necesitarás instalar numpy:
$ pip install numpy
Numpy necesita una copia de la matriz para operar, pero el resultado es el mismo.
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")
Blanco y negro con almohada, con difuminado
Al usar una Pillow puede convertirla directamente a blanco y negro. ¡Parecerá que tiene tonos de gris pero tu cerebro te está engañando! (Blanco y negro cerca uno del otro se ven como gris)
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:
Convertido:
Blanco y negro con almohada, sin difuminado
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'')
Sugeriría convertir a escala de grises, y luego simplemente aplicar un umbral (a la mitad, o medio o meadian, si así lo desea) a él.
from PIL import Image
col = Image.open(''myimage.jpg'')
gry = col.convert(''L'')
grarray = np.asarray(gry)
bw = (grarray > grarray.mean())*255
imshow(bw)
Usando opencv Puedes convertir fácilmente rgb a una imagen binaria
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)
Y puede usar colorsys
(en la biblioteca estándar) para convertir rgb a hls y usar el valor de luminosidad para determinar negro / blanco:
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)