code: def test_edges_of_objects():
      r = numpy.random.RandomState()
      r.seed(36)
      i, j = numpy.mgrid[-20:21, -20:21]
      labels = ((i > -19) & (i < 19) & (j > -19) & (j < 19)).astype(int)
      centers = numpy.zeros(labels.shape, int)
      centers[(i > -5) * (i < 5) & (j > -5) & (j < 5)] = 1
      image = r.uniform(size=labels.shape)
      m = run_module(
          image,
          labels,
          center_labels=centers,
          center_choice=cellprofiler.modules.measureobjectintensitydistribution.C_EDGES_OF_OTHER,
          bin_count=4,
          maximum_radius=8,
          wants_scaled=False,
      )
  
      _, d_from_center = centrosome.propagate.propagate(
          numpy.zeros(labels.shape), centers, (labels > 0), 1
      )
      good_mask = (labels > 0) & (centers == 0)
      d_from_center = d_from_center[good_mask]
      bins = (d_from_center / 2).astype(int)
      bins[bins > 4] = 4
      bin_counts = numpy.bincount(bins)
      image_sums = numpy.bincount(bins, image[good_mask])
      frac_at_d = image_sums / numpy.sum(image_sums)
      for i in range(1, 6):
          data = m.get_current_measurement(
              OBJECT_NAME, feature_frac_at_d(i, 4)
          )
          assert len(data) == 1
          assert round(abs(data[0] - frac_at_d[i - 1]), 7) == 0
  
imports: import io
  import centrosome.propagate
  import numpy
  import scipy.stats
  import cellprofiler_core.image
  import cellprofiler_core.measurement
  import cellprofiler_core.module
  from cellprofiler_core.constants.measurement import COLTYPE_FLOAT
  import cellprofiler.modules.measureobjectintensitydistribution
  import cellprofiler_core.object
  import cellprofiler_core.pipeline
  import cellprofiler_core.preferences
  import cellprofiler_core.setting
  import cellprofiler_core.workspace
  import tests.frontend.modules
label_desc: Use image node_id 21 for calling a global function with example usage: test_edges_of_objects() without return types