首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改Matlab代码,使imshow()函数显示正确的颜色?

如何修改Matlab代码,使imshow()函数显示正确的颜色?
EN

Stack Overflow用户
提问于 2019-04-20 04:46:45
回答 2查看 134关注 0票数 0

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

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

下面是代码:

代码语言:javascript
复制
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,下面的列包含它们应该包含的值。所以我想这是个不显眼的问题。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-20 05:22:09

你的代码对我很适用。

有一个问题是,您没有预先分配picture_out。当您第一次给它赋值时,就会创建它,并且每次向它分配另一个值时都会扩展它。分配给它的第一个值决定它的类型。如果您分配0 (一个double),它将成为一个double数组。如果在picture_in (一个uint8)之外赋值,它将成为一个uint8数组。这取决于你改变你的形象的方向,其中一个或另一个会发生。

uint8图像的值为0-255。这些是您的输入值。double图像可以存储任意大小的值,但是MATLAB总是假设这样的图像值在0-1范围内。因为您将取值范围0-255放入一个double数组中,所以MATLAB将在调用imagesc时假设任何大于1的值都是1,因此将显示一幅全白图像。

因此,当您向左移动图像时,您将得到一个uint8输出图像,它将正确显示。当您将图像右移时,您将得到一个double输出图像,它将显示所有白色。

解决方案是在循环之前正确分配数组:

代码语言:javascript
复制
picture_out = zeros(size(picture_in),'uint8');

这将进一步加快您的代码。

主动征求意见:

您应该学会使用for循环,它们比while循环容易得多。而不是:

代码语言:javascript
复制
k=0;
while k<Q
    % do something
    k=k+1;
end

你会得到

代码语言:javascript
复制
for k = 1:Q
    % do something
end

另外,在MATLAB中,不再是从k=0k<Q循环,而是更自然地从k=1k<=Q循环,就像在上面的for循环中一样。

但是,在许多情况下,您实际上根本不需要循环。您的代码可以被更有效地重写为

代码语言:javascript
复制
picture_out = zeros(size(picture_in),'uint8');
picture_out(:,1+tx:end,:) = picture_in(:,1:end-tx,:);

(对于tx>0的情况,您可以更改索引以换一种方式。)

或者,使用circshift

代码语言:javascript
复制
picture_out = circshift(picture_in,tx,2);

在这里,tx也可以是负的。

票数 0
EN

Stack Overflow用户

发布于 2019-04-20 05:20:13

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

代码语言:javascript
复制
else
                picture_out(j+1,k+1,h+1)=picture_in(1,1,1);

那一切都很好。更深入地研究,我发现我可以手动输入值,但我需要将它们作为一个uint8()变量放入。

最后,如果我像这样更改else子句,代码就会工作:

代码语言:javascript
复制
else
                picture_out(j+1,k+1,h+1)=uint8(0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55770338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档