Matlab - 调整图像的色条比例

3

我如何缩放伪彩色图像的colorbar轴?

我阅读了这篇文章,并复制了代码,但似乎没有正确工作:

MATLAB Colorbar - Same colors, scaled values

请查看下面的两个图像。在第一张图中(未进行缩放),颜色轴范围为

[1 2 3 4 5 6]*10^4 

在第二张图片中,它会继续进行。
[0.005 0.01 0.015 0.02 0.025]

正确的缩放(使用C = 100000)应为:
[0.1 0.2 0.3 0.4 0.5 0.6]

没有缩放 without scaling 错误的缩放 wrong scaling 我希望颜色轴按照 1/C 进行缩放,并且我可以自由选择 C,这样当像素值为 10^4C=10^6 时,刻度应该显示 10^-2
我首先将图像乘以 C 是为了获得更多的小数位数,因为所有小于1的值在没有 C 缩放的情况下都会显示为零。
当我运行代码时,我会得到一个名为 yticks 的工作区变量,其具有以下值:
[500 1000 1500 2000 2500]

我的代码:

RGB = imread('IMG_0043.tif');% Read Image 
info = imfinfo('IMG_0043.CR2'); % get Metadata
C = 1000000; % Constant to adjust image

x = info.DigitalCamera; % get EXIF
t = getfield(x, 'ExposureTime');% save ExposureTime
f = getfield(x, 'FNumber'); % save FNumber
S = getfield(x, 'ISOSpeedRatings');% save ISOSpeedRatings
date = getfield(x,'DateTimeOriginal');
I = rgb2gray(RGB); % convert Image to greyscale
K = 480; % Kamerakonstante(muss experimentel eavaluiert werden) 
% N_s = K*(t*S)/power(f,2))*L 
L = power(f,2)/(K*t*S)*C; %
J = immultiply(I,L); % multiply each value with constant , so the Image is Calibrated to cd/m^2 

hFig = figure('Name','False Color Luminance Map', 'ToolBar','none','MenuBar','none');
% Create/initialize default colormap of jet.
cmap = jet(16); % or 256, 64, 32 or whatever.
% Now make lowest values show up as black.
cmap(1,:) = 0;
% Now make highest values show up as white.
cmap(end,:) = 1;

imshow(J,'Colormap',cmap) % show Image in false color
colorbar % add colorbar

h = colorbar; % define colorbar as variable

y_Scl = (1/C);
yticks = get(gca,'YTick');

set(h,'YTickLabel',sprintfc('%g', [yticks.*y_Scl]))

ylabel(h, 'cd/m^2')% add unit label
title(date); % Show date in image
caxis auto % set axis to auto
datacursormode on % enable datacursor

img = getframe(gcf);
nowstr = datestr(now, 'yyyy-mm-dd_HH_MM_SS');

folder = 'C:\Users\Taiko\Desktop\FalseColor\';
ImageFiles = dir( fullfile(folder, '*.jpg') );
if isempty(ImageFiles)
    next_idx = 1;
else
    lastfile = ImageFiles(end).name;
    [~, basename, ~] = fileparts(lastfile);
    file_number_str = regexp('(?<=.*_)\d+$', basename, 'match' );  
    last_idx = str2double(file_number_str);
    next_idx = last_idx + 1;
end

newfilename = fullfile( folder, sprintf('%s_%04d.jpg', nowstr, next_idx) );

imwrite(img.cdata, newfilename);

1
我在这里上传了测试图像文件:https://www.sendspace.com/file/1v5z48 - Taiko Green
2
@Yvon 点此阅读(和观看):https://bids.github.io/colormap/。简而言之:它是感知非均匀的。相同的数据变化会使颜色从深蓝变成几乎浅蓝,或者在不同的位置从黄到橙再到红。它显示了(对于人眼来说)不在数据中的峰值和数据变化速率。当应用于图像时,它也非常不真实。只需选择“parula”或“hot”,然后绘制相同的数据,看起来更自然。 - Ander Biguri
1
这太棒了。谢谢! - Yvon
1
我将色图更改为parula。 - Taiko Green
1
@TaikoGreen 很好的选择!如果你有兴趣,我把 Python 的颜色映射转换到了 MATLAB 上,你可以在这里找到它们:https://uk.mathworks.com/matlabcentral/fileexchange/51986-perceptually-uniform-colormaps - Ander Biguri
显示剩余4条评论
1个回答

3
问题:
1)您正在获取图形(gca)的YTick,但未获取颜色条。这将给出图形的“像素”坐标,而不是实际值。使用yticks = get(h,'YTick')。
2)caxis auto应该在覆盖YTicks之前设置(并在启用颜色条后设置),否则比例和刻度将不匹配。
3)您的意思是C = 100000吗?
结果:

输入图像描述


C=10^6 对于这张图片来说是合适的,因为它可以让夜空得到清晰分辨(这也是此脚本的主要目的),但它也可以用来测量建筑物外墙的亮度。对于后一种情况,你应该选择一个较小的 C。 - Taiko Green
@TaikoGreen 这将导致不同的刻度值。这符合预期吗? - Yvon
这是正确的,你附上的图片是使用C=10^5,而我附上的图片是使用10^6。经过你的更正,现在显示了正确的刻度值0.01到0.06。 - Taiko Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接