2016-06-02 4 views
3

Я не могу найти удобную в использовании функцию в любой библиотеке Python (желательно PIL) для преобразования из RGB в YUV. Поскольку мне нужно преобразовать много изображений, я не хочу его реализовывать сам (было бы дорого без LUT и т. Д.).Нет преобразования из RGB в YUV

Когда я интуитивное:

from PIL import Image 
img = Image.open('test.jpeg') 
img_yuv = img.convert('YUV') 

Я получаю сообщение об ошибке:

ValueError: conversion from RGB to YUV not supported 

Вы знаете, почему это так? Есть ли какая-либо эффективная реализация этого в python и, возможно, даже PIL?

Я не эксперт компьютерного зрения, но я думал, что это ocnversion является стандартом в большинстве библиотек ...

Спасибо,

римского

ответ

2

Вы можете попробовать 'YCbCr' вместо 'YUV', то есть

from PIL import Image 
img = Image.open('test.jpeg') 
img_yuv = img.convert('YCbCr') 
+0

Это то, что я наконец сделал. Бит до сих пор, похоже, нет реального решения. Спасибо – romeasy

+0

Я считаю, что 'YUV' на самом деле является термином, исходящим из старых добрых аналоговых раз и не имеет значения для цифровых пиксельных данных. Люди обычно на самом деле означают «YCbCr», когда говорят «YUV», потому что этот термин часто используется неправильно. См. Http://wolfcrow.com/blog/whats-the-difference-between-yuv-yiq-ypbpr-and-ycbcr/ – jlh

+0

Спасибо @jih за комментарий. Это то, что я узнал с тех пор, как пытался. На моих курсах CS люди использовали YUV, но я понимаю, почему это то же самое, что и YCbCr. Спасибо за это. – romeasy

4

Вы можете попробовать это:

import cv2 
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) 
+0

Но для этого требуется совершенно новый пакет (opencv), который я не хочу устанавливать только для преобразования. Однако проект уже завершен. – romeasy

+0

Установка OpenCV только для доступа к преобразованию YUV занимает слишком много времени. – rayryeng

1

Я знаю, что это может быть поздно, но scikit-image имеет функцию rgb2yuv

from PIL import Image 
from skimage.color import rgb2yuv 

img = Image.open('test.jpeg') 
img_yuv = rgb2yuv(img)  
1

Если вы не хотите, чтобы установить какой-то пакет, вы можете просто взглянуть на skimage source code. Следующий фрагмент взят с этой страницы github с некоторыми незначительными изменениями:

# Conversion matrix from rgb to yuv, transpose matrix is used to convert from yuv to rgb 
yuv_from_rgb = np.array([[ 0.299  , 0.587  , 0.114  ], 
        [-0.14714119, -0.28886916, 0.43601035 ], 
        [ 0.61497538, -0.51496512, -0.10001026 ]]) 

# Optional. The next two line can be ignored if the image is already in normalized numpy array. 
# convert image array to numpy array and normalize it from 0-255 to 0-1 range 
new_img = np.asanyarray(your_img) 
new_img = dtype.img_as_float(new_img) 

# do conversion 
yuv_img = new_img.dot(yuv_from_rgb.T.copy()) 
Смежные вопросы