如何在MATLAB中更改RGB图像的像素值?

时间:2018-08-31 11:41:58

标签: matlab image-processing

所以我需要做的就是应用

之类的操作
(x(i,j)-min(x)) / max(x(i,j)-min(x))

基本上将每个像素值转换为介于0和1之间的值。

首先,我意识到Matlab使用imread将图像(行*颜色*颜色)保存为3D矩阵,

Image = imread('image.jpg')

因此,对图像进行简单的max运算无法得到像素的最大值,并且我不确定它会返回什么(另一个多维数组?)。所以我尝试使用类似的东西

max_pixel = max(max(max(Image)))

我认为效果很好。同样,我使用了三次。我的逻辑是我获得了所有3个彩色平面上的最小像素值。

执行上述缩放操作后,我得到的图像似乎只有0或1个值,而中间的值似乎不正确。与整数/浮点数舍入有关吗?

image = imread('cat.jpg')
maxI = max(max(max(image)))
minI = min(min(min(image)))
new_image = ((I-minI)./max(I-minI))

这只能输出1和0,这似乎是不正确的。

我正在尝试的另一种方法是像在here一样,分别在所有彩色平面上工作。但这是正确的方法吗?

我也可以遍历所有像素,但我假设这会花费时间。对此非常新,任何帮助都将是巨大的。

2 个答案:

答案 0 :(得分:2)

如果不确定matlab函数返回什么或为什么返回,则应始终首先执行以下一项操作:

在您的情况下,在命令窗口中输入help >functionName<doc >functionName<doc max。这将向您显示该特定功能的必不可少的基本信息,例如需要输入的内容以及输出的内容。

对于max函数,将产生以下结果:

  

M = max(A)返回数组的最大元素。

     

如果A是向量,则max(A)返回A的最大值。

     

如果A是矩阵,则max(A)是包含最大值的行向量   每列的值。

     

如果A是一个多维数组,则max(A)沿着第一个   大小不等于1的数组维,将元素视为   向量。该尺寸的大小变为1,而所有尺寸的大小   其他尺寸保持不变。如果A是一个空数组,其第一个   维的长度为零,则max(A)返回一个空数组,其中   与A大小相同

换句话说,如果在矩阵上使用max(),它将输出一个包含每一列的最大值(第一个非单维)的向量。如果在大小为max()的矩阵A上使用m x n x 3,将导致矩阵为大小为1 x n x 3的最大值。因此,这回答了您的问题:

  

我不太确定它返回什么(另一个多维数组?)

继续前进:

  

我认为效果很好。同样,我使用了三次。我的逻辑是我获得了所有3个彩色平面上的最小像素值。

这是正确的。另外,您可以使用max(A(:))min(A(:)),如果您只是在寻找值,则等价。

  

执行上述操作后,我得到的图像似乎只有0或1个值,而中间的值似乎不正确。与整数/浮点数舍入有关吗?

如果您不发布代码的minimal, complete and verifiable example,我们将无法知道为什么会发生这种情况。可能是因为您的变量属于某种类型,也可能是由于计算错误。

  

我正在尝试的另一种方法是分别在所有彩色平面上进行操作,如此处所述。但这是正确的方法吗?

这取决于预期的最终结果。与一次性标准化所有值(无论如何,在99%的情况下)相比,分别标准化每种颜色(红色,绿色,蓝色)将导致不同的结果。

答案 1 :(得分:1)

您有一个uint8 RGB图像。

只需将其转换为双重图像即可

I=imread('https://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Cat_poster_1.jpg/1920px-Cat_poster_1.jpg')

I=double(I)./255;

或者

I=im2double(I); %does the scaling if needed

Read about image data types


您在做什么错了?

如果要执行的操作是将RGB图像转换为[0-1]范围,则​​不管MATLAB代码的正确性如何,都将严重地困扰您。让我举个例子说明为什么:

假设您有2种颜色的图像。

暗红色(20,0,0):enter image description here

中等蓝色(0,0,128)enter image description here

现在,您希望将其更改为[0-1]。您如何缩放?建议的方法是使值128->120->20/12820->1(不相关)。但是,当您执行此操作时,您正在更改颜色!您将使中等的蓝色变为强烈的蓝色(最大B通道,enter image description here),并使R向变得更强烈(而不是20 / 255、20 / 128,双亮度!enter image description here)。这很不好,因为这是简单的颜色,但是使用组合的RGB值,您甚至可以更改颜色,而不仅仅是强度。因此,转换为[0-1]范围的唯一正确方法是假设您的最小值和最大值为[0,255]。