Conversions d'espace colorimétrique

Voir sur TensorFlow.org Exécuter dans Google Colab Voir la source sur GitHub Télécharger le cahier

Aperçu

En vision par ordinateur, l'espace colorimétrique sélectionné pourrait avoir un impact significatif sur les performances du modèle. Bien que RGB est le plus grand espace de couleur commun, dans des situations Manay le modèle fonctionne mieux lors du passage à des espaces de couleurs alternatives telles que YUV , YCbCr , XYZ (CIE) , etc.

Le tensorflow-io package fournit une liste des conversions d'espace couleur API qui peuvent être utilisés pour préparer et compléter les données d'image.

Installer

Installez les packages requis et redémarrez le runtime

pip install -q tensorflow-io

Télécharger l'exemple d'image

L'exemple d'image utilisé dans ce tutoriel est un chat dans la neige , mais il pourrait être remplacé par des images JPEG.

Ce qui suit télécharger l'image et l' enregistrer sur le disque local sample.jpg :

curl -o sample.jpg -L https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg

ls -ls sample.jpg
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17858  100 17858    0     0   235k      0 --:--:-- --:--:-- --:--:--  235k
20 -rw-rw-r-- 1 kbuilder kokoro 17858 Oct 27 16:33 sample.jpg

Usage

Lire le fichier image

Lire et décoder l'image en une uint8 Tenseur de forme (213, 320, 3)

import tensorflow as tf
import tensorflow_io as tfio

image = tf.image.decode_jpeg(tf.io.read_file('sample.jpg'))

print(image.shape, image.dtype)
(213, 320, 3) <dtype: 'uint8'>

L'image peut être affichée par :

import matplotlib.pyplot as plt

plt.figure()
plt.imshow(image)
plt.axis('off')
plt.show()

png

Convertir RVB en niveaux de gris

Un RGB image peut être convertie en Grayscale de tfio.experimental.color.rgb_to_grayscale Grayscale afin de réduire le canal de 3 à 1 avec tfio.experimental.color.rgb_to_grayscale :

grayscale = tfio.experimental.color.rgb_to_grayscale(image)

print(grayscale.shape, grayscale.dtype)

# use tf.squeeze to remove last channel for plt.imshow to display:
plt.figure()
plt.imshow(tf.squeeze(grayscale, axis=-1), cmap='gray')
plt.axis('off')
plt.show()
(213, 320, 1) <dtype: 'uint8'>

png

Convertir RVB en BGR

Certains logiciels d'image et de la caméra manufacturors pourraient préférer BGR , qui peut être obtenu par tfio.experimental.color.rgb_to_bgr :

bgr = tfio.experimental.color.rgb_to_bgr(image)

print(bgr.shape, bgr.dtype)

plt.figure()
plt.imshow(bgr)
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

Convertir RVB en CIE XYZ

CIE XYZ (ou CIE 1931 XYZ est un espace de couleur commun utilisé dans de nombreux programmes de traitement d'image. Ce qui suit est la conversion de RVB à CIE XYZ par tfio.experimental.color.rgb_to_xyz . Remarque tfio.experimental.color.rgb_to_xyz suppose l' entrée en virgule flottante dans la plage de [0, 1] afin de pré-traitement supplémentaire est nécessaire:

# convert to float32
image_float32 = tf.cast(image, tf.float32) / 255.0

xyz_float32 = tfio.experimental.color.rgb_to_xyz(image_float32)

# convert back uint8
xyz = tf.cast(xyz_float32 * 255.0, tf.uint8)

print(xyz.shape, xyz.dtype)

plt.figure()
plt.imshow(xyz)
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

Convertir RVB en YCbCr

Enfin, YCbCr est l'espace de couleurs par défaut dans de nombreux systèmes vidéo. La conversion en YCbCr pourrait se faire par tfio.experimental.color.rgb_to_ycbcr :

ycbcr = tfio.experimental.color.rgb_to_ycbcr(image)

print(ycbcr.shape, ycbcr.dtype)

plt.figure()
plt.imshow(ycbcr, cmap='gray')
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

Ce qui est plus intéressant, cependant, est que YCbCr pourrait être décomposé en Y' (Luma), Cb (de chroma bleu différence), et Cr composants (de chroma rouge de différence) avec chaque carry composante information perceptive significative:

y, cb, cr = ycbcr[:,:,0], ycbcr[:,:,1], ycbcr[:,:,2]

# Y' component
plt.figure()
plt.imshow(y, cmap='gray')
plt.axis('off')
plt.show()

# Cb component
plt.figure()
plt.imshow(cb, cmap='gray')
plt.axis('off')
plt.show()

# Cr component
plt.figure()
plt.imshow(cr, cmap='gray')
plt.axis('off')
plt.show()

png

png

png