所以我需要做的就是应用
之类的操作(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一样,分别在所有彩色平面上工作。但这是正确的方法吗?
我也可以遍历所有像素,但我假设这会花费时间。对此非常新,任何帮助都将是巨大的。
答案 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
如果要执行的操作是将RGB图像转换为[0-1]范围,则不管MATLAB代码的正确性如何,都将严重地困扰您。让我举个例子说明为什么:
假设您有2种颜色的图像。
现在,您希望将其更改为[0-1]。您如何缩放?建议的方法是使值128->1
和20->20/128
或20->1
(不相关)。但是,当您执行此操作时,您正在更改颜色!您将使中等的蓝色变为强烈的蓝色(最大B通道,),并使R向变得更强烈(而不是20 / 255、20 / 128,双亮度!)。这很不好,因为这是简单的颜色,但是使用组合的RGB值,您甚至可以更改颜色,而不仅仅是强度。因此,转换为[0-1]范围的唯一正确方法是假设您的最小值和最大值为[0,255]。