2015-03-25 2 views
2

Я хочу преобразовать RGB-изображение в YUV и восстановить его. Но когда я вычислил в MATLAB, я нашел изображение не совсем верно для оригинала. вот моя операция в Matlab! вот мой код:как преобразовать RGB в YUV в interger, а затем восстановить

%M file 
clear all; 
clc; 
RGB = imread('11111.bmp'); 
figure;imshow(RGB); 

R = RGB(:,:,1); 
G = RGB(:,:,2); 
B = RGB(:,:,3); 

Y0= 0.256788*R + 0.504129*G + 0.097906*B + 16; 
U0=-0.148223*R - 0.290993*G + 0.439216*B + 128; 
V0= 0.439216*R - 0.367788*G - 0.071427*B + 128; 
Y= uint8(min(255,max(0,Y0)));% i want 8 bit YUV 
U= uint8(min(255,max(0,U0))); 
V= uint8(min(255,max(0,V0))); 
RGB1R=Y+1.14 *V; 
RGB1G=Y-0.39 *U-0.58*V; 
RGB1B=Y+2.03*U; 
RGB1=cat(3, RGB1R, RGB1G, RGB1B); 
figure; imshow(RGB1); 
%M file 

следует отметить, что изображение капсульной эндоскопии image.you может получить его в wwww.gastrolab.net .i хотите, чтобы YUV 8 бит interger, может кто-нибудь мне помочь? ?

+0

Я предполагаю, что вы хотите сделать это вручную, не используя встроенные функции MATLAB, правильно? – hbaderts

+0

Вы имеете в виду, что я понимаю этот метод с реальными оптическими датчиками CMOS ??? –

+0

Нет, вопрос в том, может ли решение содержать команды MATLAB, такие как 'rgb2ycbcr()', или вы хотите сделать это, используя формулы, такие как 'Y0 = 0.256788 * R + 0.504129 * G + 0.097906 * B + 16;'? – hbaderts

ответ

0

Для преобразования между RGB и YCbCr MATLAB предлагает функции rgb2ycbcr и ycbcr2rgb. YCbCr и YUV затем связаны

Y = Y 
U = 0.872021 Cb 
V = 1.229951 Cr 

Для преобразования RGB изображения в формате YUV, вы можете таким образом использовать

RGB = imread('11111.bmp'); 
YCBCR = rgb2ycbcr(RGB); 
YUV(:,:,1) = YCBCR(:,:,1);    % Y -> Y 
YUV(:,:,2) = 0.872021 * YCBCR(:,:,2); % Cb -> U 
YUV(:,:,3) = 1.229951 * YCBCR(:,:,3); % Cr -> V 

и преобразовать его обратно, используйте

YCBCR1(:,:,1) = YUV(:,:,1);    % Y -> Y 
YCBCR1(:,:,2) = YUV(:,:,2)/0.872021; % U -> Cb 
YCBCR1(:,:,3) = YUV(:,:,3)/1.229951; % V -> Cr 
RGB1 = ycbcr2rgb(YCBCR1); 

Обратите внимание, что если вы используете uint8 как тип для RGB, тогда YCBCR и YUV будет uint8 тоже, и конверсия будет убыточной. Для testimage шахты, максимальная разница между RGB и RGB1 был

max(abs(RGB(:)-RGB1(:))) 
ans = 
    4 

Чтобы иметь преобразование без потерь, вы должны использовать double тип данных. Обратите внимание, что MATLAB предполагает, что для изображений uint8 значения находятся между 0 и 255, тогда как для изображений double значения находятся между 0 и 1, поэтому их необходимо масштабировать.

+0

Спасибо, ваш ответ - это то, что я хочу, еще раз спасибо –

+0

, вот и все, я запустил его в Matlab, теперь все в порядке. –

+0

Хорошо, отлично. Если этот (или любой) ответ разрешил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Хотя, конечно, нет никаких обязательств для этого. – hbaderts

Смежные вопросы