我正在尝试获取用于创建直方图均衡的切割点(通过histeq
或以其他方式),即获取用于确定每个边缘边缘的原始像素值。
为了简化以下示例,我将使用1D矩阵:
如果原始图片是:[ 0.2 , 0.25 , 0.34 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ]
和直方图均衡后的图像(到3个分箱)是:[ 0.2 , 0.2 , 0.2 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ]
如何获得3个箱的边缘?
即。如何获得以下向量(代表切割点):[0.37 0.5]
?
非常感谢!!!
P.S。获取向量[0.34 0.4]
或[0.4 0.6]
(分别在histeq之后包含在特定bin中的最小值和最大值)也令人满意。
答案 0 :(得分:0)
(如果我的问题是对的)我可以想象做以下事情:
dVec = diff(eqdata);
fVec = find(dVec);
cuttingPoints = eqdata(fVec) + dVec(fVec)/2;
示例:
eqdata = [ 0.2 , 0.2 , 0.2 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ];
输出:
0.3000 0.5000
编辑:如果数据未分类:
dVec = diff(sort(unique(eqdata)));
fVec = find(dVec);
cuttingPoints = eqdata(fVec) + dVec(fVec)/2;
答案 1 :(得分:0)
这是一个适用于矢量和矩阵(排序或未排序)的解决方案。它使用unique
和median
函数。
您将在bin值之间使用中间值(此处使用median
)。您还将拥有分配每个图像元素的bin索引。
以下代码
%data
A = [ 0.2 , 0.25 , 0.34 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ]; % vector
%A = rand(5,5); % matrix (other possible input)
bin_number = 3;
%histogram
J = histeq(A,bin_number); %histogram equalization
[Ju, ia, ic] = unique(J(:)); %uniquing
%values of in-between bins (here using median)
cutting_index = median([Ju(1:end-1) Ju(2:end)]');
%get the assignment
assign_index = reshape(ic,size(A));
将产生
cutting_index = [0.2500 0.7500]
assign_index = [1 1 1 2 2 2 3 3 3]'