RGB 到 YIQ 转换

RGB to YIQ conversion

我为 rgb 写了代码到 yiq conversion.I 得到了结果,但我不知道这是否正确。

%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 矩阵 input.I 使用数字 300 因为图片是 300x300 pixels.I 我将在我的项目中将图片分成块所以不要注意到 300 号,因为我要更改它,我只是举个例子。

谢谢。

你的所作所为完全没有必要。如果您查阅 the documentation on rgb2ntsc,它也 接受 RGB 图像 。因此,当您输入 RGB 图像时,输出将是一个 3 通道图像,其中第一个通道是亮度,或 Y 分量,第二个和第三个通道是色调和饱和度信息(IQ)。您不需要将图像分解为 M x 3 矩阵。

因此,只需执行:

YIQ = rgb2ntsc(ImageRGB);

确保 ImageRGB 是第一个通道为红色、第二个通道为绿色、第三个通道为蓝色的 RGB 图像。


编辑

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

colorRGB = reshape(permute(ImageRGB, [3 1 2]), 3, []).';, 

之后,执行YIQ = rgb2ntsc(colorRGB);colorRGB 已经是一个 M x 3 矩阵,因此您正在做的列索引是多余的。

上面使用了reshapepermute,就没有必要使用循环了。事实上,我认为 for 循环代码更慢。坚持使用上面的代码可以快速完成这项工作。一旦你有了这种方式的矩阵,那么我想代码正在做你想做的事......但是,我个人只是对图像本身进行转换,然后将它分成块或任何你想要的事后去做。