自定义转换为灰度MATLAB

时间:2013-07-05 16:44:53

标签: matlab grayscale

我有一个像下面的图像,我试图转换为灰度。但是,我不希望标准转换为灰度。

理想情况下,我想定义一些自定义颜色贴图,它会根据贴图中的值将图像转换为灰度。

例如:我想使用

中的“jet”渐变将下面的图像转换为灰度

访问http://b.vimeocdn.com/ts/121/673/121673915_640.jpg

1 个答案:

答案 0 :(得分:2)

<强>背景

以下是algorithm used by Matlab's built-in method rgb2gray()

  

rgb2gray()通过形成R,G和B分量的加权和,将RGB值转换为灰度值:

     

0.2989 * R + 0.5870 * G + 0.1140 * B

     

请注意,这些与 rgb2ntsc 函数用于计算Y分量的权重相同。

请注意,每个颜色通道都有一个乘数,这样可以轻松实现生活。

解决方案

逆映射是一个非线性问题 - 没有一组RGB权重可以将颜色带回灰色。您也无法保证jet色彩图包含图像中使用的所有颜色。

这是一种尽力而为的解决方法,它将颜色映射到色彩映射中最接近的颜色:

%% Define the transformation as a non-uniform 3D interpolation
resolution = 512;
cmap = jet(resolution);
x = cmap(:,1);
y = cmap(:,2);
z = cmap(:,3);
intensity = gray(resolution);
intensity = intensity(:,1);
fx = TriScatteredInterp(x,y,z,intensity,'nearest');

%% Load our image, then interpolate from RGB to Grayscale intensity
img = double(imread('image.jpeg'))/255.0;
imgOut = fx(img(:,:,1),img(:,:,2),img(:,:,3)); 
imshow(imgOut)

运行时是色彩分辨率的函数,分辨率= 512 大约需要一分钟,分辨率= 64 大约需要5秒。由于两个原因,这很慢。首先,我们对每个像素进行非线性搜索(而不是应用线性变换)。其次,插值是分散的(而不是统一定义的),这进一步减慢了事情。

<强>输入

Input image

使用colormap resolution = 64

输出

Output with colormap resolution = 64

使用colormap resolution = 512

输出

Output with colormap resolution = 512