ML Community Day คือวันที่ 9 พฤศจิกายน! ร่วมกับเราสำหรับการปรับปรุงจาก TensorFlow, JAX และอื่น ๆ เรียนรู้เพิ่มเติม

การแปลงพื้นที่สี

ดูใน TensorFlow.org เรียกใช้ใน Google Colab ดูแหล่งที่มาบน GitHub ดาวน์โหลดสมุดบันทึก

ภาพรวม

ในการมองเห็นด้วยคอมพิวเตอร์พื้นที่สีที่เลือกอาจมีผลอย่างมากต่อประสิทธิภาพของโมเดล ในขณะที่ RGB เป็นพื้นที่สีที่พบมากที่สุดในสถานการณ์ manay โมเดลจะทำงานได้ดีกว่าเมื่อเปลี่ยนไปใช้ช่องว่างสีอื่นเช่น YUV , YCbCr , XYZ (CIE) เป็นต้น

แพ็กเกจ tensorflow-io มีรายการ API การแปลงพื้นที่สีที่สามารถใช้เพื่อเตรียมและเพิ่มข้อมูลรูปภาพ

ติดตั้ง

ติดตั้งแพ็กเกจที่ต้องการและรีสตาร์ทรันไทม์

pip install -q tensorflow-io

ดาวน์โหลดภาพตัวอย่าง

ตัวอย่างรูปภาพที่ใช้ในบทช่วยสอนนี้คือ แมวในหิมะ แม้ว่าจะสามารถแทนที่ด้วยภาพ JPEG ได้ก็ตาม

สิ่งต่อไปนี้จะดาวน์โหลดอิมเมจและบันทึกลงในโลคัลดิสก์เป็น 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

การใช้งาน

อ่านไฟล์รูปภาพ

อ่านและถอดรหัสภาพเป็นเทนเซอร์ของรูปร่าง uint8 (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'>

สามารถแสดงภาพได้โดย:

import matplotlib.pyplot as plt

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

png

แปลง RGB เป็น Grayscale

ภาพ RGB สามารถแปลงเป็น Grayscale เพื่อลดช่องสัญญาณจาก 3 เป็น 1 ด้วย 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

แปลง RGB เป็น BGR

ซอฟต์แวร์ภาพและผู้ผลิตกล้องบางรายอาจชอบ BGR ซึ่งสามารถรับได้จาก 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

แปลง RGB เป็น CIE XYZ

CIE XYZ (หรือ CIE 1931 XYZ เป็นพื้นที่สีทั่วไปที่ใช้ในโปรแกรมประมวลผลภาพจำนวนมากต่อไปนี้คือการแปลงจาก RGB เป็น CIE XYZ ผ่าน tfio.experimental.color.rgb_to_xyz หมายเหตุ tfio.experimental.color.rgb_to_xyz จะถือว่าอินพุตจุดลอยตัว ในช่วง [0, 1] ดังนั้นจึงจำเป็นต้องมีการประมวลผลล่วงหน้าเพิ่มเติม:

# 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

แปลง RGB เป็น YCbCr

สุดท้าย YCbCr เป็นพื้นที่สีเริ่มต้นในระบบวิดีโอจำนวนมาก การแปลงเป็น YCbCr สามารถทำได้ผ่าน 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

สิ่งที่น่าสนใจกว่าคือ YCbCr สามารถย่อยสลายเป็น Y' (luma), Cb (blue-difference chroma) และส่วนประกอบ Cr (red-difference 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