如何使用 impixelinfo 测量 LAB 值
How to measure LAB values with impixelinfo
我正在尝试使用 impixelinfo 以 LAB 颜色 space 测量图像的特定部分。我希望输出参数在屏幕底部以 [L* A* B*] 值显示值。
我之前在 RGB 和 HSV 颜色 spaces 中尝试过类似的东西,但是用 LAB 图像尝试这个函数给我带来了奇怪的结果,如下(链接)所示。
当我将鼠标悬停在图像上时,该函数确实为我提供了值,但它们是 RGB 格式,每个分量只会给我 1.00 或 0.00。我期待这样的事情:
像素信息:(1947,563) [55.28 28.45 -65.62] 之类的。
我做错了什么???
rgbImage = imread(file);
% Convert image from RGB colorspace to lab color space.
cform = makecform('srgb2lab');
lab_Image = applycform(im2double(rgbImage),cform);
figure, imshow(lab_Image);
impixelinfo;
图片Linkhttp://postimg.org/image/y5u83mvxf/
缩放。奇怪的形象?空白图像?全为零或全为一的值?答案总是缩放。
im2double
将在 0 和 1 之间缩放输入图像,这是 MATLAB 中 double 类型图像所需的范围(至少,如果您希望任何东西都像您期望的那样工作)。但是,在转换为 LAB 后,值不再在此范围内。
imshow
不知道如何处理包含超出正常范围的双打的(假定)RGB 图像。因此,它会执行 MATLAB 图像函数在这些情况下始终执行的操作 - 它会在没有任何错误或警告的情况下裁剪数据。任何小于零的都变成零,任何大于一的都变成一。您在图像中看到的调色板非常有限,而不是二进制黑白图像,因为您的图像是 n x m x 3 而不仅仅是 2D。
你能做什么取决于你想做什么(你为什么使用 impixelinfo
),但如果你只是想稍微探索一下你的图像,那么一个选择是分别绘制三个图层 - impixelinfo
在这些情况下工作正常,您会看到它 return 确切的数字:
figure
% use [] to force proper display scaling, too
subplot(2,2,1); imshow(lab_image(:,:,1),[]);
subplot(2,2,2); imshow(lab_image(:,:,2),[]);
subplot(2,2,3); imshow(lab_image(:,:,3),[]);
impixelinfo;
不过,显然,这有点尴尬。
另一种选择是根本不使用 impixelinfo
,因为无论如何您都无法 imshow
正确显示您的 LAB 图像。使用原始 RGB 图像进行显示,然后使用某种交互式 ROI 方法,例如 imfreehand
到 select 感兴趣的区域。使用它作为掩码来告诉您等效的 LAB 值是多少。
如果您以前没有在 MATLAB 中使用过 ROI 方法,请从这里开始:
http://uk.mathworks.com/help/images/roi-based-processing.html
我正在尝试使用 impixelinfo 以 LAB 颜色 space 测量图像的特定部分。我希望输出参数在屏幕底部以 [L* A* B*] 值显示值。
我之前在 RGB 和 HSV 颜色 spaces 中尝试过类似的东西,但是用 LAB 图像尝试这个函数给我带来了奇怪的结果,如下(链接)所示。
当我将鼠标悬停在图像上时,该函数确实为我提供了值,但它们是 RGB 格式,每个分量只会给我 1.00 或 0.00。我期待这样的事情:
像素信息:(1947,563) [55.28 28.45 -65.62] 之类的。
我做错了什么???
rgbImage = imread(file);
% Convert image from RGB colorspace to lab color space.
cform = makecform('srgb2lab');
lab_Image = applycform(im2double(rgbImage),cform);
figure, imshow(lab_Image);
impixelinfo;
图片Linkhttp://postimg.org/image/y5u83mvxf/
缩放。奇怪的形象?空白图像?全为零或全为一的值?答案总是缩放。
im2double
将在 0 和 1 之间缩放输入图像,这是 MATLAB 中 double 类型图像所需的范围(至少,如果您希望任何东西都像您期望的那样工作)。但是,在转换为 LAB 后,值不再在此范围内。
imshow
不知道如何处理包含超出正常范围的双打的(假定)RGB 图像。因此,它会执行 MATLAB 图像函数在这些情况下始终执行的操作 - 它会在没有任何错误或警告的情况下裁剪数据。任何小于零的都变成零,任何大于一的都变成一。您在图像中看到的调色板非常有限,而不是二进制黑白图像,因为您的图像是 n x m x 3 而不仅仅是 2D。
你能做什么取决于你想做什么(你为什么使用 impixelinfo
),但如果你只是想稍微探索一下你的图像,那么一个选择是分别绘制三个图层 - impixelinfo
在这些情况下工作正常,您会看到它 return 确切的数字:
figure
% use [] to force proper display scaling, too
subplot(2,2,1); imshow(lab_image(:,:,1),[]);
subplot(2,2,2); imshow(lab_image(:,:,2),[]);
subplot(2,2,3); imshow(lab_image(:,:,3),[]);
impixelinfo;
不过,显然,这有点尴尬。
另一种选择是根本不使用 impixelinfo
,因为无论如何您都无法 imshow
正确显示您的 LAB 图像。使用原始 RGB 图像进行显示,然后使用某种交互式 ROI 方法,例如 imfreehand
到 select 感兴趣的区域。使用它作为掩码来告诉您等效的 LAB 值是多少。
如果您以前没有在 MATLAB 中使用过 ROI 方法,请从这里开始: http://uk.mathworks.com/help/images/roi-based-processing.html