首页 > 解决方案 > 如何更改 Matlab 代码以便 imshow() 函数显示正确的颜色?

问题描述

我编写了一个简单的 Matlab 代码,它加载图像并在 x 轴和 y 轴上进行平移。如果图像应该在 x 轴上平移 10 个像素,我用 0 填充前 10 列,将所有列向右移动 10 个单位,并将图片的右侧切割 10 个像素。当我输入正 x 值时,加载的图片不再显示正确的颜色(它显示负值),尽管当我将 RGB 值打印到屏幕上时它们是正确的!

我已经在互联网上读到, imshow() 做了某种缩放,但这并没有真正帮助我。

所以这里是代码:

clear;
clc;

picture_in = imread('landscape.jpg');    %load picture
[P,Q,RGB]=size(picture_in);              %obtain size of dimension

%Translation
tx=2;
ty=0;

k=0;
j=0;
h=0;
while k<Q
    j=0;
    while j<P
        h=0;
        while h<RGB
            if (round(k+1-tx)>0)&&(round(k+1-tx)<=Q)&&(round(j+1+ty)>0)&&(round(j+1+ty)<=P) 
                picture_out(j+1,k+1,h+1)=picture_in(round(j+1+ty),round(k+1-tx),h+1);
            else
                picture_out(j+1,k+1,h+1)=0;
            end

            h=h+1;
        end
        j=j+1;
    end
    k=k+1;
end
picture_out;
imagesc(picture_out);

我真的很感激这里的一些帮助。正如我已经提到的: - 如果翻译是负的,那么颜色是正确的 - 当我查看一个小图像(例如,10x10)的张量时,它被移动了 2 个像素,那么我可以看到前两个列是 0以下列包含它们应包含的值。所以我猜这是 imshow() 的问题

编辑(附加评论):输出图片的 RGB 值只有 0 或 255 值,但两者之间没有。

标签: matlabimage-processingimshow

解决方案


所以我玩了一会儿代码,发现如果我不手动0将子句放入else子句,而是像这样从图片张量中取出它:

else
                picture_out(j+1,k+1,h+1)=picture_in(1,1,1);

然后一切正常。深入挖掘我发现我可以手动输入值,但我需要将它们作为uint8()变量放入。

最后,如果我像这样更改else子句,代码将起作用:

else
                picture_out(j+1,k+1,h+1)=uint8(0);

推荐阅读