RGB到YIQ转换

时间:2015-03-24 03:35:18

标签: matlab image-processing

我为rgb转换为yiq转换的代码。我得到了结果,但我不知道这是否正确。

%extract the red green blue elements 
ImageGridRed = double(ImageRGB(:,:,1))';
ImageGridGreen = double(ImageRGB(:,:,2))';
ImageGridBlue = double(ImageRGB(:,:,3))';    

%make the 300x300 matrices into 1x90000 matrices
flag = 1;

for i =1:1:300
for j = 1:1:300

imageGR(flag) = ImageGridRed(j,i);
imageGG(flag) = ImageGridGreen(j,i);
imageGB(flag) = ImageGridBlue(j,i);

flag = flag+1;

end
end

%put the 3 matrices into 1 matrix 90000x3
for j=1:1:300*300

colorRGB(j,1) = imageGR(j);
colorRGB(j,2) = imageGG(j);
colorRGB(j,3) = imageGB(j);

end

YIQ = rgb2ntsc([colorRGB(:,1) colorRGB(:,2) colorRGB(:,3)]);

我写这个是因为rgb2ntsc函数需要mx3矩阵进行输入。我使用数字300因为图片是300x300像素。我要在我的项目中分隔块中的图片所以不要注意300号码因为我我要改变这一点,我把它作为一个例子。

谢谢。

1 个答案:

答案 0 :(得分:1)

您正在做的事情完全没必要。如果您咨询the documentation on rgb2ntsc,则也会接受RGB图像。因此,当您输入RGB图像时,输出将是3通道图像,其中第一个通道是亮度,或Y组件,第二个和第三个通道是色调和饱和度信息({{1分别是}和I。您不需要将图像分解为Q矩阵。

因此,只需:

M x 3

确保YIQ = rgb2ntsc(ImageRGB); 是RGB图像,其中第一个通道为红色,第二个为绿色,第三个为蓝色。


修改

根据您的评论,您需要获取所有像素并将其放入ImageRGB矩阵,其中M x 3是像素总数。您可以将其用作M的输入。该函数接受RGB值的rgb2ntsc矩阵,其中每行是RGB元组。在这种情况下的输出将是另一个M x 3矩阵,其中每一行是其YIQ对应物。您的代码确实按照您希望的方式执行,但我建议您取消M x 3循环并将其替换为:

for

之后,做colorRGB = reshape(permute(ImageRGB, [3 1 2]), 3, []).';, YIQ = rgb2ntsc(colorRGB);已经是M x 3矩阵,因此您正在进行的列索引是多余的。

使用colorRGBreshape进行上述操作时,使用循环非常不必要。事实上,我认为permute循环代码较慢。坚持使用上面的代码来快速完成这项工作。一旦你以这种方式获得矩阵,那么我认为代码正在做你想要它做的事情....但是,我个人只是对图像本身进行转换,然后将其拆分成块或任何你想要的在事后做。