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
分量,第二个和第三个通道是色调和饱和度信息(I
和 Q
)。您不需要将图像分解为 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 矩阵,因此您正在做的列索引是多余的。
上面使用了reshape
和permute
,就没有必要使用循环了。事实上,我认为 for
循环代码更慢。坚持使用上面的代码可以快速完成这项工作。一旦你有了这种方式的矩阵,那么我想代码正在做你想做的事......但是,我个人只是对图像本身进行转换,然后将它分成块或任何你想要的事后去做。
我为 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
分量,第二个和第三个通道是色调和饱和度信息(I
和 Q
)。您不需要将图像分解为 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 矩阵,因此您正在做的列索引是多余的。
上面使用了reshape
和permute
,就没有必要使用循环了。事实上,我认为 for
循环代码更慢。坚持使用上面的代码可以快速完成这项工作。一旦你有了这种方式的矩阵,那么我想代码正在做你想做的事......但是,我个人只是对图像本身进行转换,然后将它分成块或任何你想要的事后去做。