1

我有一张图像,如下图,我正在尝试将其转换为灰度。但是,我不希望将标准转换为灰度。

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

例如:我想使用“喷射”渐变将下面的图像转换为灰度

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

4

1 回答 1

2

背景

这是Matlab 的内置方法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 秒。这很慢,有两个原因。首先,我们对每个像素进行非线性搜索(而不是应用线性变换)。其次,插值是分散的(而不是统一定义的),这进一步减慢了速度。

输入

输入图像

颜色图分辨率 = 64 的输出

颜色图分辨率 = 64 的输出

颜色图分辨率 = 512 的输出

颜色图分辨率 = 512 的输出

于 2013-07-05T17:38:36.987 回答