image - CIELAB 颜色空间中图像中每个超像素的平均颜色
问题描述
根据 MATLAB 对测量每个超像素的平均颜色的帮助,我将图像分割为 200 个超像素,并尝试将输出图像中每个像素的颜色设置为超像素区域的平均 CIELAB 颜色。输入图像如下所示:
B=imread('H.jpg');
A=rgb2lab(B); // conversion from rgb to lab
[L,N] = superpixels(A,200);
figure
BW = boundarymask(L);
imshow(imoverlay(A,BW,'cyan'),'InitialMagnification',67);
outputImage = zeros(size(A),'like',A);
idx = label2idx(L);
numRows = size(A,1);
numCols = size(A,2);
for labelVal = 1:N
redIdx = idx{labelVal};
greenIdx = idx{labelVal}+numRows*numCols;
blueIdx = idx{labelVal}+2*numRows*numCols;
outputImage(redIdx) = mean(A(redIdx));
outputImage(greenIdx) = mean(A(greenIdx));
outputImage(blueIdx) = mean(A(blueIdx));
end
figure
imshow(outputImage,'InitialMagnification',67);
我不确定此代码的输出是否正确地为我提供了 CIELAB 颜色空间中每个超像素的正确平均颜色。与 RGB 颜色空间相比,图像是否具有如此不同的颜色或代码不正确?在CIELAB颜色空间的通道平均颜色测量中,代码有问题吗?
解决方案
这里的主要问题是,imshow
向您展示的不是数据包含的内容。
imshow
对于double
输入,假设像素值在 [0,1] 范围内。Lab 的第一个通道的范围是 [0,100],我相信其他两个通道的范围是 [-20,20] (可能不一样,但这两个通道是关于 0 对称的,即灰色)。
如果你这样做了,imshow(A,[])
那么数据将被缩放以向你展示一切。因此,所有通道的缩放比例都相同,因此这也不是查看数据的最佳方式,但无论如何,L 通道将显示为红色,a 和 b 通道显示为绿色和蓝色。不要期望这看起来像您的原始图像,即使您仍然拥有恢复原始图像的所有数据。
接下来,(事实证明有一个使用 Lab 输入图像的选项)。superpixels
期望一个 RGB 图像作为输入,考虑传递原始图像B
,而不是 Lab 图像A
。这不会妨碍您计算发现的超像素内的实验室通道的方法。
如果您想测量每个超像素内的平均 Lab 值并将其用于进一步处理,请不要创建outputImage
,而是创建一个包含这些值的表:
data = zeros(N,3);
for labelVal = 1:N
redIdx = idx{labelVal};
greenIdx = idx{labelVal}+numRows*numCols;
blueIdx = idx{labelVal}+2*numRows*numCols;
data(labelVal,1) = mean(A(redIdx));
data(labelVal,2) = mean(A(greenIdx));
data(labelVal,3) = mean(A(blueIdx));
end
现在,data(ii,:)
是超像素数的 Lab 值ii
。L==ii
是属于这个超像素的像素。
推荐阅读
- c# - HttpClient 发布异步调用
- git - VS Code 未激活扩展
- javascript - 提交后如何通过多选表单显示和隐藏Div
- alloy - What is the purpose of abstract signatures with no fields in Alloy?
- javascript - 打字稿构造函数:new vs class vs typeof class
- azure - B2C 内置策略,如何为不同的身份提供者(本地/Azure AD)唱入不同地处理强制参数
- reactjs - 使用自定义 refs 创建组件并稍后访问它
- c# - 无法卸载工具 dotnet
- java - 检索 Firebase 数据并在列表视图中显示
- excel - 如何使用用户表单创建超链接?VBA