Image 将rgb图像转换为双精度图像并在matlab中保存
我有一个图像,我想把这个图像导入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 在第二幅图中,您
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秒