recorrer por negro matriz imagen convertir blanco python python-imaging-library python-2.7

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