在掌握了RGB与HSB颜色空间转换后,我们可以指定任意颜色作为伪彩。
我们知道一个成像数据可能有多个通道,但是一个通道如果使用最简单的单色伪彩来表示,通常就是选择 RGB 中一个或者两个通道来进行线性映射:
- R:红色伪彩
- G:绿色伪彩
- B:蓝色伪彩
- RG:黄色伪彩
- RB:粉色伪彩(Magenta)
- GB:青色伪彩(Cyan)
如果我们做多色成像时,通道数量超过 6,其它通道也想使用单色伪彩来表示,该怎么办呢?这个时候可以通过指定 HSB 中任意一个色度,然后把信号的强度,映射为颜色的亮度或者对比度。
首先可以利用 HSB颜色空间来绘制一个 colormap,看看颜色的线性分布情况:
这里我们其实按照 Hue、Saturation、Brightness 三个分量,分别线性采样,看看颜色的分布。图像从左到右横轴是 Hue 从 0 到 360,可以很明显地看到颜色0的分区。从上到下是 Brightness,亮度从0-255;然后不同的 slice 从前往后,对应的色彩饱和度不断增大。其主体逻辑代码如下:
newImage("map","RGB white",360,255,10);
for(k=0;k<10;k++){
setSlice(k+1);
sat=(k+1)/10;
for(i=0;i<360;i++){
hue=i;
for(j=0;j<255;j++){
bri=j;
hsb = newArray(hue,sat,bri);
rgb = HSB2RGB(hsb); // 具体函数代码见下方
setColor(rgb[0],rgb[1],rgb[2]);
fillRect(i,j,1,1);
}
}
}
然后我们找一个单通道荧光图像,尝试使用任意颜色:
接下来放上主要逻辑代码:
imgtype = bitDepth();
if (imgtype!=24){
exit("Error: Input is not RGB image.");
}
hues = newArray(30, 80, 130, 180, 230, 280, 330);
n = lengthOf(hues);
for (i = 0; i < n; i++) {
hue = hues[i];
main(hue);
}
/* --- 自定义函数 --- */
function main(hue){
w = getWidth();
h = getHeight();
for (i = 0; i < h; i++) {
for (j = 0; j < w; j++) {
hsb = getHSB(i,j);
v = hsb[2]; // 提取原图像亮度
if (v>0){
hsb = newArray(hue, 1, v);
// 保持原图像亮度,固定饱和度,修改色度
rgb = HSB2RGB(hsb);
setColor(rgb[0], rgb[1], rgb[2]);
fillRect(i, j, 1, 1);
}
}
}
}
这里整理一下RGB和HSB颜色空间互换和取值的函数:
该部分仅登录用户可见
另外加上一段网上收集的输入波长输出颜色的转换 ImageJ Macro代码:
该部分仅登录用户可见
此处评论已关闭