web-dev-qa-db-fra.com

Convertir RVB en noir OR blanc

Comment puis-je prendre une image RVB en Python et la convertir en noir OR blanc? Pas de niveaux de gris, je veux que chaque pixel soit entièrement noir (0, 0, 0) ou entièrement blanc (255, 255, 255).

Existe-t-il une fonctionnalité intégrée pour cela dans les bibliothèques de traitement d’images Python les plus répandues? Sinon, le meilleur moyen serait-il de simplement parcourir chaque pixel, s'il est plus proche du blanc, définissez-le sur blanc, s'il est plus proche du noir, définissez-le sur noir?

35
Tom

Mise à l'échelle en noir et blanc

Convertissez en niveaux de gris, puis redimensionnez en blanc ou en noir (selon ce qui est le plus proche).

Original:

meow meow tied up cat

Résultat:

Black and white Cat, Pure

Implémentation Pure Pillow

Installez pillow si vous n'avez pas déjà:

$ pip install pillow

Pillow (ou PIL) peut vous aider à travailler efficacement avec des images.

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

Alternativement, vous pouvez utiliser Pillow with numpy

Oreiller + Numpy Bitmasks Approach

Vous aurez besoin d'installer numpy:

$ pip install numpy

Numpy a besoin d'une copie du tableau pour fonctionner, mais le résultat est le même.

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

Noir et Blanc avec Oreiller, avec tramage

En utilisant pillow , vous pouvez le convertir directement en noir et blanc. On dirait qu'il a des nuances de gris mais votre cerveau vous trompe! (Le noir et le blanc rapprochés ressemblent au 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:

meow meow color cat

Converti:

meow meow black and white cat

Noir et Blanc avec Oreiller, sans tramage

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')
77
Kyle Kelley

Je suggérerais de convertir en niveaux de gris, puis d’appliquer simplement un seuil (à mi-chemin, moyen ou moyen, si vous le souhaitez).

from PIL import Image

col = Image.open('myimage.jpg')
gry = col.convert('L')
grarray = np.asarray(gry)
bw = (grarray > grarray.mean())*255
imshow(bw)
4
askewchan

Et vous pouvez utiliser colorsys (dans la bibliothèque standard) pour convertir rgb en hls et utiliser la valeur de luminosité pour déterminer le noir/blanc:

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)
1
monkut

Oreiller, avec tramage

En utilisant pillow , vous pouvez le convertir directement en noir et blanc. On dirait qu'il a des nuances de gris mais votre cerveau vous trompe! (Le noir et le blanc rapprochés ressemblent au 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:

meow meow color cat

Converti:

meow meow black and white cat

1
Kyle Kelley
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)
0
Nfekih

Utiliser opencv Vous pouvez facilement convertir RGB en image binaire

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)
0
shawon