
function histogram(data, range_min, range_max, bin){
      	
    /*
    Creates histogram on data.

    Args:
        data (tuple, array, ArrayList or Array): input  data can be multi-dimensional or nested.
        range_min (int, optional): minimum histogram value. Default is floor(min(data))
        range_max (int, optional): maximul histogram value. Default is ceil(max(data))
        bin(int or float, optional): if int means number of bins. If float means bin size. Default = 1.0.
    Returns:
        tuple: (ydata, xdata)

    */
    flat = flatten(data)
    if (!is_defined(range_min))    range_max = null
    if (!is_defined(range_max))    range_max = null
    if (!is_defined(bin))    bin = 1.0    
    if (range_min == null) range_min = Math.floor(Math.min.apply(null,flat))
    if (range_max == null) range_max = Math.ceil(Math.max.apply(null,flat))
    
    print("Min "+ range_min)
    print("Max "+ range_max)
    if (is_float(bin)){
    	
        bin_size = bin
        n_bin =  Math.ceil((range_max - range_min)/bin_size)
        print(bin_size)
        print( n_bin)
    }
    else{    	
        n_bin = bin
        bin_size = (range_max - range_min)/bin
    }

    print("n_bin" + n_bin)//
    print("bin_size" + bin_size)
    
    result = []; size=n_bin; while(size--) result.push(0)    
    
    for  (d in flat){
        b = Math.floor( (flat[d] - range_min) / bin_size)
        if ((b >=0) && (b < n_bin)){
          result[b] = result[b] + 1
        }
    }

    result_x = []; size=result.length; p=range_min; while(size--) {result_x.push(p); p+=bin_size }
    
    return [result,result_x]
}
 
        
        h = histogram(data=im1.read(), undefined, undefined, bin=0.1)     
        hd=h[0]; xd = h[1]
        /*
        image = Utils.grayscale(src1.getOutput())   
        data = Convert.toUnsigned(image.getData().getDataBuffer().getData())
        h = histogram(data, range_min=0, range_max=255)     
        hi=h[0]; xi = h[1]
    
        if (plots == null){
            plots = plot((hd,hi), ("Data", "Image"), (xd, xi), title = "Histo")
        } else{
            plots[0].getSeries(0).setData(xd,hd)
            plots[1].getSeries(0).setData(xi,hi)    
        }
        if (plots[0].displayable == false){
            abort()
        }
        
        ov_cross.update(new Point((ov_cross.position.x+1) % size.width ,(ov_cross.position.y+1) % size.height))
        
        sleep(0.1)
*/

print (hd.length)
print (xd.length)