Chuyển đổi không gian màu

Xem trên TensorFlow.org Chạy trong Google Colab Xem nguồn trên GitHub Tải xuống sổ ghi chép

Tổng quat

Trong thị giác máy tính, không gian màu đã chọn có thể có hiệu suất đáng kể của mô hình. Trong khi RGB là không gian màu sắc phổ biến nhất, trong những tình huống Manay này thực hiện mô hình tốt hơn khi chuyển sang không gian màu thay thế như YUV , YCbCr , XYZ (CIE) , vv

Các tensorflow-io gói cung cấp một danh sách các màu chuyển đổi không gian API có thể được sử dụng để chuẩn bị và làm tăng thêm các dữ liệu hình ảnh.

Thành lập

Cài đặt các Gói bắt buộc và khởi động lại thời gian chạy

pip install -q tensorflow-io

Tải xuống hình ảnh mẫu

Hình ảnh ví dụ được sử dụng trong hướng dẫn này là một con mèo trong tuyết , mặc dù nó có thể được thay thế bằng bất kỳ hình ảnh JPEG.

Sau đây sẽ tải hình ảnh và lưu vào đĩa địa phương như 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

Cách sử dụng

Đọc tệp hình ảnh

Đọc và giải mã hình ảnh thành một uint8 tensor hình dạng (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'>

Hình ảnh có thể được hiển thị bằng:

import matplotlib.pyplot as plt

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

png

Chuyển đổi RGB sang thang độ xám

Một RGB hình ảnh có thể được chuyển đổi sang Grayscale để giảm kênh 3-1 với 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

Chuyển đổi RGB sang BGR

Một số phần mềm hình ảnh và máy ảnh manufacturors có thể thích BGR , mà có thể thu được thông qua 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

Chuyển đổi RGB sang CIE XYZ

CIE XYZ (hoặc CIE 1931 XYZ là một không gian màu thông thường được sử dụng trong nhiều chương trình xử lý ảnh. Sau đây là việc chuyển đổi từ RGB để CIE XYZ qua tfio.experimental.color.rgb_to_xyz . Lưu ý tfio.experimental.color.rgb_to_xyz giả định đầu vào dấu chấm động trong khoảng [0, 1] để thêm tiền xử lý là cần thiết:

# 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

Chuyển đổi RGB sang YCbCr

Cuối cùng, YCbCr là không gian màu mặc định trong nhiều hệ thống video. Chuyển đổi sang YCbCr có thể được thực hiện thông qua 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

Điều thú vị hơn, mặc dù, là YCbCr có thể được phân tách ra thành Y' (luma), Cb (màu xanh-chênh lệch chroma), và Cr các thành phần với nhau carry thành phần thông tin perceptually ý nghĩa (đỏ-chênh lệch chroma):

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