获得直方图均衡的切割点 - matlab

时间:2013-08-15 11:25:31

标签: matlab image-processing histogram

我正在尝试获取用于创建直方图均衡的切割点(通过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中的最小值和最大值)也令人满意。

2 个答案:

答案 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)

这是一个适用于矢量和矩阵(排序或未排序)的解决方案。它使用uniquemedian函数。

您将在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]'