【问题标题】:get cutting points of histogram equalization - matlab获取直方图均衡的切割点 - matlab
【发布时间】:2013-08-15 11:25:31
【问题描述】:

我正在尝试获取用于创建直方图均衡化的切割点(通过histeq 或以其他方式),即获取用于确定每个 bin 边缘的原始像素值。

为了简化下面的例子,我将使用一维矩阵:

如果原图是:[ 0.2 , 0.25 , 0.34 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ]

直方图均衡后的图像(到3个bin)是:[ 0.2 , 0.2 , 0.2 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 ]

如何获得 3 个 bin 的边缘?

即如何获得以下向量(代表切割点):[0.37 0.5]

非常感谢!!!

附:得到向量[0.34 0.4][0.4 0.6](分别是histeq 之后的特定bin 中包含的最小值和最大值)也很令人满意。

【问题讨论】:

  • 欢迎来到 Stack Overflow!你可以在这里发布你已经拥有的代码的相关部分(如果有的话)吗?
  • 谢谢!相关代码很简单:img_after_histeq = histeq(img,3);

标签: matlab image-processing histogram


【解决方案1】:

(如果我的问题是正确的)我可以想象做如下的事情:

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;

【讨论】:

  • 感谢您的回答!
  • 但我认为我的示例不够通用。另一个例子: [0.6 , 0.1 , 0.3 , 0.34 , 0.5 , 0.12] ---- histeq (3 bin) ---> [0.6 , 0.1 , 0.35 , 0.35 , 0.6 , 0.1] ----得到切割点 - --> [0.21 , 0.42] BTW,得到切割点 [0.12 , 0.34] 或 [0.3 , 0.5] 也足够了
  • @sob 我不太了解你。在您的示例中,我应该从哪里知道它基于0.21 而不是我所期望的(0.1+0.35)/2 = 0.225
  • 它基于 0.21(而不是 0.225),因为:(0.12+0.3)/2 = 0.21。请注意,0.12 是映射到第 1 级(第 1 级=0.1)的最大原始值,0.3 是映射到第 2 级(第 2 级=0.35)的最小原始值。请看我编辑的原始问题:)
【解决方案2】:

这是一个适用于向量和矩阵(已排序或未排序)的解决方案。它使用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]'

【讨论】:

  • 感谢您的详细回答,但我想我应该更清楚:
  • 我想知道一个像素(在原始图像中)应该包含的值的范围是多少,所以它会在直方图均衡后映射到某个 bin。如果我们查看我的原始示例,我的目标是知道如果原始图像中的像素值在 [0 , 0.37) 范围内,那么它将被映射到第一个 bin。如果原始图像中的像素值在 [0.37, 0.5) 范围内,则它被映射到第二个 bin。如果原始图像中的像素值在 [0.5 , 0.6] 范围内,则将其映射到第 3 个 bin。
  • 请查看我的编辑。您将在 Ju 中拥有唯一的 bin 值,在 cutting_index 中拥有中间 bin 值,在 assign_index 中拥有 bin 分配。
  • 哇,太好了!但是为什么你在 assign_index 中有 4 个(而不是 3 个)垃圾箱?
  • 顺便说一句,你能告诉我如何在评论中将这个灰色背景添加到变量名中吗?我是新来的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多