【问题标题】:Basic FreeMat/MATLAB syntax - dimension error基本 FreeMat/MATLAB 语法 - 尺寸错误
【发布时间】:2018-03-22 07:23:10
【问题描述】:

我正在使用FreeMat,我有一张RGB 图片,它是一个 3D 矩阵,包含图片的列和行以及每个像素的 RGB 值。

由于没有将RGB图片转换为YIQ的内在函数,我已经实现了一个。我想出了这段代码:

假设我有一个 3D 数组,image_rgb

matrix = [0.299 0.587 0.114;
0.596 -0.274 -0.322;
0.211 -0.523 0.312];
row = 1:length(image_rgb(:,1,1));
col = 1:length(image_rgb(1,:,1));
p = image_rgb(row,col,:);

%Here I have the problem
mage_yiq(row,col,:) = matrix*image_rgb(row,col,:);

max_y = max (max(image_yiq(:,:,1)));
max_i = max (max(image_yiq(:,:,2)));
max_q = max (max(image_yiq(:,:,3)));

%Renormalize the image again after the multipication
% to [0,1].
image_yiq(:,:,1) = image_yiq(:,:,1)/max_y;
image_yiq(:,:,2) = image_yiq(:,:,2)/max_i;
image_yiq(:,:,3) = image_yiq(:,:,3)/max_q;

我不明白为什么矩阵乘法会失败。我希望代码很好,而不仅仅是手动乘以矩阵...

【问题讨论】:

  • 你了解矩阵乘法的原理吗?您如何解释收到的错误消息?在您必须解决的问题中,您实际上是在尝试将矩阵和 3D 数组相乘。顺便说一句:您可以使用 size(mat,n) 来获取 mat 沿维度 n 的大小,而不是 length(mat(:,1,1)) 或 length(mat(1,:,1))。并且 mat(1:size(mat,1),mat(1:size(mat,2),:) 与 mat(:,:,:) 相同,即与 mat 相同,即您的 p 相同作为 image_rgb。

标签: matlab image-processing freemat


【解决方案1】:

您尝试将 3D 数组与您创建的 matrix 相乘,这不是正确的矩阵乘法。您应该将图像数据展开为 3×m*n 矩阵,并将其与自定义矩阵相乘。

这是一种将自定义色彩空间转换应用于 RGB 图像的解决方案。我使用了您提供的矩阵并将其与内置的 YIQ 变换进行了比较。

%# Define the conversion matrix
matrix = [0.299  0.587  0.114;
          0.596 -0.274 -0.322;
          0.211 -0.523  0.312];

%# Read your image here
rgb = im2double(imread('peppers.png'));
subplot(1,3,1), imshow(rgb)
title('RGB')


%# Convert using unfolding and folding
[m n k] = size(rgb);

%# Unfold the 3D array to 3-by-m*n matrix
A = permute(rgb, [3 1 2]);
A = reshape(A, [k m*n]);

%# Apply the transform
yiq = matrix * A;

%# Ensure the bounds
yiq(yiq > 1) = 1;
yiq(yiq < 0) = 0;

%# Fold the matrix to a 3D array
yiq = reshape(yiq, [k m n]);
yiq = permute(yiq, [2 3 1]);

subplot(1,3,2), imshow(yiq)
title('YIQ (with custom matrix)')


%# Convert using the rgb2ntsc method
yiq2 = rgb2ntsc(rgb);
subplot(1,3,3), imshow(yiq2)
title('YIQ (built-in)')

请注意,对于 RGB 图像,k 将为 3。在每个语句之后查看矩阵的大小。并且不要忘记将您的图片转换为double

【讨论】:

    【解决方案2】:

    可以通过 Imagemagick 使用相同的矩阵和 -color-matrix 函数来做到这一点:

    输入:

    convert peppers_tiny.png -color-matrix \
    " \
    0.299 0.587 0.114 \
    0.596 -0.274 -0.322 \
    0.211 -0.523 0.312 \
    " \
    peppers_tiny_yiq.png
    

    但这并不是真正的 sRGB 到 YIQ 的转换。

    这是一个 sRGB 到 YIQ 的转换,将 YIQ 显示为 RGB:

    convert peppers_tiny.png -colorspace YIQ -separate \
    -set colorspace sRGB -combine peppers_tiny_yiq2.png
    

    这里是相同的,但交换了前两个频道:

    convert peppers_tiny.png -colorspace YIQ -separate \
    -swap 0,1 -set colorspace sRGB -combine peppers_tiny_yiq3.png
    

    【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多