如何将分级彩色地图转换为百分比矩阵(将像素颜色转换为基于调色板的百分比)?

时间:2021-02-16 15:47:32

标签: r matlab matrix mapping color-palette

我想将 this graded colored map 转换成一个矩阵,其中为每个像素分配了一个百分比的橙色。特别是在图像右侧采用橙色调色板。

我想将 100% 分配给顶部最亮的橙色,将 0% 分配给底部的黑色。因此,我想根据单个像素相对于调色板的颜色为每个像素分配一个百分比。

最后,我的目标是平均这些百分比,以获得某种橙色的平均百分比。对于后一步,我应该没有任何问题......但我不知道如何面对前一个问题。

我正在寻找 R、Matlab 或 Mathematica 中的解决方案

1 个答案:

答案 0 :(得分:1)

这是我的一个想法。假设你有一个任意颜色的图像;让我们解决一个转换,通过运行优化器将颜色从 3 维空间减少到单维空间。成本函数是从尝试通过有损颜色变换恢复原始颜色时的误差导出的。

请参阅下图了解我的结果,在最亮的像素处缩放为 100%,在最暗的像素处缩放为 0%。

img = imread('zpiaD.png');
opt = optimset('Display', 'Iter');

itf = fminsearch(@(itf) min_colormap(img, itf) , zeros(1,3), opt);
[~, rimg] = min_colormap(img, itf);

subplot(2,1,1), imshow(rimg), title 'single color dimension'
subplot(2,1,2)
rimg = double(rimg);
imagesc(100 * (rimg - min(min(rimg))) / (max(max(rimg)) - min(min(rimg)))),
colorbar, title 'scaled'

function [res, timg] = min_colormap(img, itf)
  pimg = double(reshape(img, size(img,1)*size(img,2), size(img,3)));
  timg = transpose(itf * pimg');
  res = sum(((timg * itf) - pimg).^2, 'all');
  timg = cast(reshape(timg, size(img,1), size(img,2)), 'uint8');
end

result

相关问题