【问题标题】:Custom conversion to grayscale MATLAB自定义转换为灰度 MATLAB
【发布时间】:2013-07-05 16:44:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以在matlab目录下的jet.m中找到jet的映射函数。或在命令窗口中输入“edit jet”;一旦你有了,你可以应用/编辑映射。

标签: matlab grayscale


【解决方案1】:

背景

这里是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)

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

输入

颜色图分辨率 = 64 的输出

颜色图分辨率 = 512 的输出

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多