Image 将rgb图像转换为双精度图像并在matlab中保存

Image 将rgb图像转换为双精度图像并在matlab中保存,image,matlab,image-processing,computer-vision,Image,Matlab,Image Processing,Computer Vision,我有一个图像,我想把这个图像导入matlab。我正在使用以下代码。我的问题是,当我将图像转换为灰度时,一切都会改变,转换后的图像与原始图像不相似。换句话说,我希望保持值(或者说图像)与原始图像中的值相同。有没有办法做到这一点 I = imread('myimage.png'); figure, imagesc(I), axis equal tight xy I2 = rgb2gray(I); figure, imagesc(I2), axis equal tight xy 在第二幅图中,您

我有一个图像,我想把这个图像导入matlab。我正在使用以下代码。我的问题是,当我将图像转换为灰度时,一切都会改变,转换后的图像与原始图像不相似。换句话说,我希望保持值(或者说图像)与原始图像中的值相同。有没有办法做到这一点

I = imread('myimage.png');
figure, imagesc(I), axis equal tight xy

I2 = rgb2gray(I);
figure, imagesc(I2), axis equal tight xy


在第二幅图中,您使用的是默认设置,即
jet
。如果需要灰度,请尝试使用
colormap(gray)

您的原始图像已经在使用
jet
colormap。问题是,当你把它转换成灰度时,你会丢失一些重要的信息。见下图

在原始图像中,您有一个热图。蓝色区域通常表示“低值”,而红色区域表示“高值”。但当转换为灰度时,这两个区域都指示较低的值,因为它们是一个较暗的像素(参见箭头)

一种可能的解决办法是:

您对图像的每一个像素进行拍摄,找到最近的(最近的) 在
jet
colormap中使用颜色值,并将其索引用作灰度值

我将首先向您展示最终的代码和结果。解释如下:

I = im2double(imread('myimage.png'));

map = jet(256);
Irgb = reshape(I, size(I, 1) * size(I, 2), 3);
Igray = zeros(size(I, 1), size(I, 2), 'uint8');
for ii = 1:size(Irgb, 1)
    [~, idx] = min(sum((bsxfun(@minus, Irgb(ii, :), map)) .^ 2, 2));
    Igray(ii) = idx - 1;
end
clear Irgb;

subplot(2,1,1), imagesc(I), axis equal tight xy
subplot(2,1,2), imagesc(Igray), axis equal tight xy
结果:

>> whos I Igray
  Name         Size                Bytes  Class     Attributes

  I          110x339x3            894960  double              
  Igray      110x339               37290  uint8  

说明:

首先,您将获得
jet
colormap,如下所示:

map = jet(256);
它将返回一个带有jet调色板上可能颜色的
256x3
colormap,其中每一行是一个RGB像素<代码>地图(1,:)将是一种深蓝色,
地图(256,:)
将是一种深红色,正如预期的那样

然后,您可以这样做:

Irgb = reshape(I, size(I, 1) * size(I, 2), 3);
。。。将
110x339x3
图像转换为
37290x3
矩阵,其中每行为RGB像素

现在,对于每个像素,取该像素到
贴图
像素的欧氏距离。取最近的索引并将其用作灰度值。减1(
-1
)是因为索引在1到256之间,而灰度值在0到255之间

注意:欧几里德距离在末尾取一个平方根,但由于我们只是试图找到最接近的值,因此没有必要这样做

编辑:

下面是代码的一个快10倍的版本:

I = im2double(imread('myimage.png'));
map = jet(256);
[C, ~, IC] = unique(reshape(I, size(I, 1) * size(I, 2), 3), 'rows');
equiv = zeros(size(C, 1), 1, 'uint8');
for ii = 1:numel(equiv)
    [~, idx] = min(sum((bsxfun(@minus, C(ii, :), map)) .^ 2, 2));
    equiv(ii) = idx - 1;
end
Irgb = reshape(equiv(IC), size(I, 1), size(I, 2));
Irgb = Irgb(end:-1:1,:);
clear equiv C IC;
它运行得更快,因为它利用了图像上的颜色仅限于
jet
调色板中的颜色这一事实。然后,它计算
唯一的
颜色,并仅将它们与调色板值匹配。由于要匹配的像素较少,该算法运行速度更快。《纽约时报》如下:

  • 之前:

    运行时间为0.619049秒

  • 之后:

    运行时间为0.061778秒


我需要它的值,因为在转换为灰度后,值会改变,而颜色贴图不会改变颜色image@Sam当前位置那么,不清楚你在问什么。通过转换为灰度,您正在丢弃信息(即色调和饱和度)。你无法恢复该信息。那么我如何才能拥有相同的图像(通过使用其他任何东西)?因为原始图像的值对我来说非常重要,我想把它放在2D矩阵中。@Sam:如果原始RGB图像的值很重要,那么不要转换为灰度!事实上,我想在一个2D矩阵的图像,这就是为什么我转换为灰度!是否有其他方法可以避免转换为灰度并将原始图像保存在2D矩阵中?很高兴提供帮助!我已经编辑了我的答案,将代码的速度提高了10倍。:)非常感谢,这对我来说太多了:)