微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

矩阵数组到多维RGB图像数组并使用imresize来重塑图像

如何解决矩阵数组到多维RGB图像数组并使用imresize来重塑图像

我正在使用 Octave 5.2 并且可以使用 meshgridreshape 从一组 RGB 值创建一个 640 x 480 x 3 的图像,但有没有更好的方法这样做? (代码在下面)我尝试使用 catimresize with nearest 但数组是 640x480 而不是 640x480x3 并且由于数组不是 640x480x3 格式,它会创建黑色方块可以解决这个问题以获得彩色条形图像吗?。

f(:,:,1)=[255;0;0;0;0];
f(:,2)=[0;255;0;0;255];
f(:,3)=[0;0;255;0;2];

num_of_colors=numel(f(:,1));
img_resize_height=640
img_resize_height_tmp=round(img_resize_height/num_of_colors); %create the height wanted

%1) create size of array wanted 
[r_im_tmp_x r_im_tmp_y]=meshgrid((f(:,1)),1:img_resize_height_tmp)
[g_im_tmp_x g_im_tmp_y]=meshgrid((f(:,2)),1:img_resize_height_tmp);
[b_im_tmp_x b_im_tmp_y]=meshgrid((f(:,3)),1:img_resize_height_tmp);

%2) reshape grid to evenly space out colors (in one column)
r_resize_tmp=reshape(r_im_tmp_x,[1,numel(r_im_tmp_x)])';
g_resize_tmp=reshape(g_im_tmp_x,numel(g_im_tmp_x)])';
b_resize_tmp=reshape(b_im_tmp_x,numel(b_im_tmp_x)])';

%3 make array size wanted 480
img_resize_len=480;
r_resize_tmp2=repmat(r_resize_tmp,([1,img_resize_len]));
g_resize_tmp2=repmat(g_resize_tmp,img_resize_len]));
b_resize_tmp2=repmat(b_resize_tmp,img_resize_len]));

img_resize_rgb(:,1)=r_resize_tmp2;
img_resize_rgb(:,2)=g_resize_tmp2;
img_resize_rgb(:,3)=b_resize_tmp2;

figure(1);
imshow(img_resize_rgb);

它创建的图像正确似乎有一种更简单/更好的编码方式。

img1

我尝试使用 imresize 命令来做同样的事情来改进代码。 (见下面的代码)。

pkg load image

f(:,3)=[0;0;255;0;2];

height_wanted=640;
width_wanted=480;

repmat_rgb=cat(2,f,f); %add another column to array to get imresize to work
reshaped_output = imresize(repmat_rgb,[height_wanted,width_wanted],'nearest'); %reshape swatch to large output
imshow(reshaped_output);

创建的图像不正确和黑白(很可能是由于阵列是 640x480 而不是 640x480x3(我该如何解决这个问题?)

img2

解决方法

它看起来像是 Octave 图像包的 imresize 实现中的一个错误(在 MATLAB 中代码正在运行)。

imresize的输入是RGB(3D矩阵)时,输出也应该是RGB(3D矩阵)。
在您的示例中,输出是灰度(2D 矩阵而不是 3D 矩阵)。
这是 imresize 实现中的一个错误


该功能是“开源的”,我们可以使用调试器对其进行调试。
逐步执行代码(步入 imresize)让我们得到以下代码:

  elseif (strcmpi (method,"nearest") && all ([int_row_scale int_col_scale]))
    ## we are matlab incompatible here on purpose. We can the stuff here in 2
    ## ways. With interp2 or by clever indexing. Indexing is much much faster
    ## than interp2 but they return different results (the way we are doing it
    ## at least). Matlab does the same as we are doing if the both columns and
    ## rows go the same direction but if they increase one and decrease the
    ## other,then they return the same as if we were using interp2. We are
    ## smarter and use indexing even in that case but then the results differ
    if (int_row_scale == 1)
      row_idx = (1:rows (im))(ones (1,scale_rows),:);
    elseif (int_row_scale == -1)
      row_idx = ceil (linspace (floor (1/(scale_rows * 2)) + 1,inRows,outRows));
    endif
    if (int_col_scale == 1)
      col_idx = (1:columns (im))(ones (scale_cols,1),:);
    elseif (int_col_scale == -1)
      col_idx = ceil (linspace (floor (1/(scale_cols * 2)) + 1,inCols,outCols));
    endif
    im = im(row_idx,col_idx);

错误在上部分的最后一行。

应该是:

im = im(row_idx,col_idx);

如果您不想编辑“image package”代码,您可以使用以下解决方法:
调整每个颜色通道的大小并连接调整大小的通道。

im = im(row_idx,col_idx,:); 替换为:

reshaped_output = imresize(repmat_rgb,[height_wanted,width_wanted],'nearest');

注意:
out_r = imresize(repmat_rgb(:,:,'nearest'); out_g = imresize(repmat_rgb(:,2),'nearest'); out_b = imresize(repmat_rgb(:,3),'nearest'); reshaped_output = cat(3,out_r,out_g,out_b); 的类是 f,取值范围应该是 [0,1]。
使用 double 时,所有高于 1 的值都被剪裁为 1

您可以将 imshow 初始化为:

f

或投射到f(:,1)=[1;0;0;0;0]; f(:,2)=[0;1;0;0;1]; f(:,3)=[0;0;1;0;1];

uint8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。