是否有可能重新映射,它使用的是HSV RGB图像(RxCx3)颜色表(未格式化!)使用气流颜色表的RGB图像?换句话说,Matlab中的HSV和JET色图之间是否存在"映射"?
我没有想过这么难,但这是一个快速而肮脏的尝试:
function J = remap( I ) n = 256; X = hsv(n); Y = jet(n); t = linspace(0,1,n)'; [r,c,~] = size(I); I = reshape( I, r*c, 3 ); u = interp3( X(:,1), X(:,2), X(:,3), t, I(:,1), I(:,2), I(:,3) ); J = I; for k = 1:3 J(:,k) = interp1( t, Y(:,k), u ); end J = reshape( J, r, c, 3 ); end
不幸的是,这会interp3
在行上引发错误,称" 网格向量必须包含唯一的点 ".我不确定我的代码是正确的做法(我基本上试图将一维嵌入坐标适合HSV色图),但是这size(unique(hsv(256),'rows'),1)==256
是真的所以我不太清楚为什么会出现这个错误.
注意:它可能会让一些人感到困惑,但这个问题与HSV格式无关 ; 这里的所有彩色图像都以RGB格式存储.我问的是彩色地图之间的映射.
最简单的方法是使用源颜色映射将图像转换为索引图像(使用rgb2ind
),然后使用目标颜色映射将此索引图像转换回RGB图像(使用ind2rgb
)
indexed = rgb2ind(img, source_colormap); output = ind2rgb(indexed, destination_colormap);