在Matlab中将直方图拆分到不同的区域

时间:2017-08-10 17:16:03

标签: matlab histogram

我有一个使用imhist的图像直方图,它包含3个不同的区域,如附图所示,我想获得边框或直方图最大连续区域的间隔,在这种情况下,第二个区域是我正在寻找的区域,边界将是43和225

the image histogram

2 个答案:

答案 0 :(得分:1)

您可以像这样找到每个地区的开始和结束箱

[counts,binLocations] = imhist(I);
der = diff([false; counts>0; false]);
upedge = find(der == 1);
downedge = find(der == -1) - 1;
regions = [binLocations(upedge) binLocations(downedge)];

如果值不完全为零,但非常接近于零,那么您可以在上面的代码中将0替换为某个阈值。

实施例

im = uint8(zeros(300,400));
im(1:100,:) = uint8(randi([0,40],[100,400]));
im(101:200,:) = uint8(randi([90,100],[100,400]));
im(201:300,:) = uint8(randi([140,240],[100,400]));

[counts,binLocations] = imhist(im);
der = diff([false; counts>0; false]);
upedge = find(der == 1);
downedge = find(der == -1) - 1;
regions = [binLocations(upedge) binLocations(downedge)];

结果

regions =

     0    40
    90   100
   140   240

答案 1 :(得分:0)

我将使用此question的答案来查找数组中连续非零元素的区域。

假设我们有这个数组(直方图):

h = [0,0,0,1,2,3,44,77,5,656,0,0,0,0,0,0,2,99,7,34];

现在我们想知道每个区域的连续非零元素的开始和结束,在这个例子中我们想要

startIndex = [4,17]
endIndex   = [10,20]
lengths    = [7,4]

为了得到这个结果,我们使用问题中的代码如下:

dsig = diff([1,h(:)'==0,1]);
startIndex = find(dsig < 0);
endIndex = find(dsig > 0)-1;
duration = endIndex-startIndex+1;

并获得最长的区域使用:

[~,maxLengthIndex] = max(lengths);
maxStartIndex = startIndex(maxLengthIndex);
maxEndIndex = endIndex(maxLengthIndex);