我想实现以下Matlab函数:
function hist = binnedRgbHist(im, numChannelBins)
如果图片为im
且数字介于1到256 numChannelBins
之间,则应创建一个大小为(numChannelBins)^3
的直方图。
例如,如果numChannelBins
2 ,则应生成以下8个大小的直方图:
R < 128, G < 128, B < 128
R < 128, G < 128, B >= 128
R < 128, G >= 128, B < 128
R < 128, G >= 128, B >= 128
R > 128, G < 128, B < 128
R > 128, G < 128, B >= 128
R > 128, G >= 128, B < 128
R > 128, G >= 128, B >= 128
就像创建一个立方体,其中每个轴代表(R,G和B)之一,其中每个轴被分成2个bin =&gt;最后,立方体中有8个箱子。
我的问题:
答案 0 :(得分:1)
accumarray
非常适合这一点。让
im
:输入图片; N
:每个颜色分量的分档数。然后
result = accumarray(reshape(permute(ceil(im/255*N), [3 1 2]), 3, []).', 1, [N N N]);
工作原理
ceil(im/255*N)
将每种颜色值量化为1
,2
,...,N
。reshape(permute(..., [3 1 2]), 3, []).'
将量化图像转换为三列矩阵,其中每行是一个像素,每列是(量化的)颜色分量。accumarray(..., 1, [N N N])
将该矩阵的每一行视为3D索引,并计算每个索引出现的次数,并给出不带0
的填充索引。示例1
数据:
>> N = 2;
>> im = randi(256,4,5,3)
im(:,:,1) =
113 152 157 65 229
138 71 215 39 41
13 108 230 160 153
142 128 125 220 214
im(:,:,2) =
208 215 182 27 230
205 161 8 95 180
225 53 73 129 31
103 97 160 83 255
im(:,:,3) =
242 29 185 89 55
202 225 156 174 96
160 197 35 87 113
244 176 146 85 120
结果:
result(:,:,1) =
1 1
3 4
result(:,:,2) =
2 4
3 2
例如,可以检查只有1个像素,所有R,G,B小于128.
示例2
数据:
>> im = repmat(150,20,30,3);
>> N = 4;
结果:
result(:,:,1) =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
result(:,:,2) =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
result(:,:,3) =
0 0 0 0
0 0 0 0
0 0 600 0
0 0 0 0
result(:,:,4) =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
在这种情况下,所有像素都属于同一个3D-bin:
答案 1 :(得分:1)
我看到@Luis Mendo在写这篇文章的过程中提供了一个很好的单行解决方案。如果它提供了更深刻的直觉,我的解决方案使用histcounts
和accumarray
:
im = randi([1 255],[10,5,3]); %// A random 10-by-5 "image"
numChannelBins = 2;
[~,~,binR]=histcounts(im(:,:,1),[1 ceil((1:numChannelBins)*(255/numChannelBins))]);
[~,~,binG]=histcounts(im(:,:,2),[1 ceil((1:numChannelBins)*(255/numChannelBins))]);
[~,~,binB]=histcounts(im(:,:,3),[1 ceil((1:numChannelBins)*(255/numChannelBins))]);
hist=accumarray([binR(:) binG(:) binB(:)],1,[numChannelBins,numChannelBins,numChannelBins])
<强>解释强>
histcounts
分别将红色,绿色,蓝色像素分开 - [~,~,binX]
的第三个输出histcounts
为每个像素提供了bin索引accumarray
累积所有唯一索引三元组