def enhance_contrast(rgb): """A preprocessing step that enhances the local contrast of each color channel""" s = rgb.shape d = disk(s[0] / 5) for i in range(3): rgb[:, :, i] = percentile_autolevel(rgb[:, :, i], d, p0=.1, p1=.9) return rgb
def test_compare_autolevels_16bit(): # compare autolevel(16-bit) and percentile autolevel(16-bit) with p0=0.0 and # p1=1.0 should returns the same arrays image = data.camera().astype(np.uint16) * 4 selem = disk(20) loc_autolevel = rank.autolevel(image, selem=selem) loc_perc_autolevel = rank.percentile_autolevel(image, selem=selem, p0=.0, p1=1.) assert_array_equal(loc_autolevel, loc_perc_autolevel)
def test_compare_autolevels(): # compare autolevel and percentile autolevel with p0=0.0 and p1=1.0 # should returns the same arrays image = data.camera() selem = disk(20) loc_autolevel = rank.autolevel(image, selem=selem) loc_perc_autolevel = rank.percentile_autolevel(image, selem=selem, p0=.0, p1=1.) assert_array_equal(loc_autolevel, loc_perc_autolevel)
def test_compare_autolevels_16bit(): # compare autolevel(16-bit) and percentile autolevel(16-bit) with p0=0.0 and # p1=1.0 should returns the same arrays image = data.camera().astype(np.uint16) * 4 selem = disk(20) loc_autolevel = rank.autolevel(image, selem=selem) loc_perc_autolevel = rank.percentile_autolevel(image, selem=selem, p0=.0, p1=1.) assert_array_equal(loc_autolevel, loc_perc_autolevel)
def test_compare_autolevels(): # compare autolevel and percentile autolevel with p0=0.0 and p1=1.0 # should returns the same arrays image = util.img_as_ubyte(data.camera()) selem = disk(20) loc_autolevel = rank.autolevel(image, selem=selem) loc_perc_autolevel = rank.percentile_autolevel(image, selem=selem, p0=.0, p1=1.) assert_array_equal(loc_autolevel, loc_perc_autolevel)
This filter is very sensitive to local outlayers, see the little white spot in the sky left part. This is due to a local maximum which is very high comparing to the rest of the neighborhood. One can moderate this using the percentile version of the autolevel filter which uses given percentiles (one inferior, one superior) in place of local minimum and maximum. The example below illustrates how the percentile parameters influence the local autolevel result. """ from skimage.filter.rank import percentile_autolevel image = data.camera() selem = disk(20) loc_autolevel = autolevel(image, selem=selem) loc_perc_autolevel0 = percentile_autolevel(image, selem=selem, p0=.00, p1=1.0) loc_perc_autolevel1 = percentile_autolevel(image, selem=selem, p0=.01, p1=.99) loc_perc_autolevel2 = percentile_autolevel(image, selem=selem, p0=.05, p1=.95) loc_perc_autolevel3 = percentile_autolevel(image, selem=selem, p0=.1, p1=.9) fig, axes = plt.subplots(nrows=3, figsize=(7, 8)) ax0, ax1, ax2 = axes plt.gray() ax0.imshow(np.hstack((image, loc_autolevel))) ax0.set_title('original / autolevel') ax1.imshow(np.hstack((loc_perc_autolevel0, loc_perc_autolevel1)), vmin=0, vmax=255) ax1.set_title('percentile autolevel 0%,1%')
This filter is very sensitive to local outlayers, see the little white spot in the sky left part. This is due to a local maximum which is very high comparing to the rest of the neighborhood. One can moderate this using the percentile version of the autolevel filter which uses given percentiles (one inferior, one superior) in place of local minimum and maximum. The example below illustrates how the percentile parameters influence the local autolevel result. """ from skimage.filter.rank import percentile_autolevel image = data.camera() selem = disk(20) loc_autolevel = autolevel(image, selem=selem) loc_perc_autolevel0 = percentile_autolevel(image, selem=selem, p0=.00, p1=1.0) loc_perc_autolevel1 = percentile_autolevel(image, selem=selem, p0=.01, p1=.99) loc_perc_autolevel2 = percentile_autolevel(image, selem=selem, p0=.05, p1=.95) loc_perc_autolevel3 = percentile_autolevel(image, selem=selem, p0=.1, p1=.9) fig, axes = plt.subplots(nrows=3, figsize=(7, 8)) ax0, ax1, ax2 = axes plt.gray() ax0.imshow(np.hstack((image, loc_autolevel))) ax0.set_title('original / autolevel') ax1.imshow( np.hstack((loc_perc_autolevel0, loc_perc_autolevel1)), vmin=0, vmax=255) ax1.set_title('percentile autolevel 0%,1%') ax2.imshow(