por - Usando python PIL para convertir una imagen RGB en una imagen pura en blanco y negro
convertir imagen a matriz python (6)
A juzgar por los resultados obtenidos por unutbu , concluyo que el imsave de imsave
no comprende imágenes monocromáticas (modo 1).
Estoy usando Python Imaging Library para una manipulación de imágenes muy simple, sin embargo, estoy teniendo problemas para convertir una imagen en escala de grises en una imagen monocromática (blanco y negro). Si guardo después de cambiar la imagen a escala de grises (convertir (''L'')), la imagen se renderiza como era de esperar. Sin embargo, si convierto la imagen en monocromática, de banda única, solo me da ruido, como puede ver en las imágenes a continuación. ¿Hay una forma simple de tomar una imagen png de color a una imagen pura en blanco y negro usando PIL / python?
from PIL import Image
import ImageEnhance
import ImageFilter
from scipy.misc import imsave
image_file = Image.open("convert_image.png") # open colour image
image_file= image_file.convert(''L'') # convert image to monochrome - this works
image_file= image_file.convert(''1'') # convert image to black and white
imsave(''result_col.png'', image_file)
Como dijo Martin Thoma, normalmente debe aplicar umbrales. Pero puedes hacer esto usando una vectorización simple que se ejecutará mucho más rápido que el bucle for que se usa en esa respuesta.
El siguiente código convierte los píxeles de una imagen en 0 (negro) y 1 (blanco).
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
#Pixels higher than this will be 1. Otherwise 0.
THRESHOLD_VALUE = 200
#Load image and convert to greyscale
img = Image.open("photo.png")
img = img.convert("L")
imgData = np.asarray(img)
thresholdedData = (imgData > THRESHOLD_VALUE) * 1.0
plt.imshow(thresholdedData)
plt.show()
Otra opción (que es útil, por ejemplo, para fines científicos cuando se necesita trabajar con máscaras de segmentación) es simplemente aplicar un umbral:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Binarize (make it black and white) an image with Python."""
from PIL import Image
from scipy.misc import imsave
import numpy
def binarize_image(img_path, target_path, threshold):
"""Binarize an image."""
image_file = Image.open(img_path)
image = image_file.convert(''L'') # convert image to monochrome
image = numpy.array(image)
image = binarize_array(image, threshold)
imsave(target_path, image)
def binarize_array(numpy_array, threshold=200):
"""Binarize a numpy array."""
for i in range(len(numpy_array)):
for j in range(len(numpy_array[0])):
if numpy_array[i][j] > threshold:
numpy_array[i][j] = 255
else:
numpy_array[i][j] = 0
return numpy_array
def get_parser():
"""Get parser object for script xy.py."""
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
parser = ArgumentParser(description=__doc__,
formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument("-i", "--input",
dest="input",
help="read this file",
metavar="FILE",
required=True)
parser.add_argument("-o", "--output",
dest="output",
help="write binarized file hre",
metavar="FILE",
required=True)
parser.add_argument("--threshold",
dest="threshold",
default=200,
type=int,
help="Threshold when to show white")
return parser
if __name__ == "__main__":
args = get_parser().parse_args()
binarize_image(args.input, args.output, args.threshold)
Se ve así para ./binarize.py -i convert_image.png -o result_bin.png --threshold 200
:
Porque a partir de la convert("1")
PIL convert("1")
devuelve el valor "Verdadero" o "Falso". Intenta imprimirlo, se mostrará: [False, False, True]
con un solo paréntesis.
Mientras que la matriz numpy usa doble corchete como este [[False, False, True]]
o [[0, 0, 1]]
, ¿verdad?
Una solución solo PIL para crear una imagen de dos niveles (blanco y negro) con un umbral personalizado:
from PIL import Image
img = Image.open(''mB96s.png'')
thresh = 200
fn = lambda x : 255 if x > thresh else 0
r = img.convert(''L'').point(fn, mode=''1'')
r.save(''foo.png'')
Con solo
r = img.convert(''1'')
r.save(''foo.png'')
obtienes una imagen difuminada.
from PIL import Image
image_file = Image.open("convert_image.png") # open colour image
image_file = image_file.convert(''1'') # convert image to black and white
image_file.save(''result.png'')
rendimientos