skimage.measure.regionprops labels' corresponding measurements?

Using scikit library I was analysing the defects' area and mean diameter. Here is the code and the respective segmented regions.

import cv2 import numpy as np from matplotlib import pyplot as plt from skimage import measure, io, img_as_ubyte from skimage.color import label2rgb, rgb2gray img = cv2.imread("F:\py_image_pro\pore.jpg", 0) scale = 0.086 #1 pixel in microns from skimage.filters import threshold_otsu threshold = threshold_otsu(img) thresholded_img = img < threshold #plt.imshow(thresholded_img, cmap='gray') #plt.show() from skimage.segmentation import clear_border edge_touching_removed = clear_border(thresholded_img) label_image = measure.label(edge_touching_removed, connectivity=img.ndim) #plt.imshow(label_image) #plt.show() image_label_overlay = label2rgb(label_image, image=img) plt.imshow(image_label_overlay) plt.show() props = measure.regionprops_table(label_image, img, properties=['label', 'area', 'equivalent_diameter', 'mean_intensity', 'solidity']) import pandas as pd df = pd.DataFrame(props) df = df[df['area'] > 20] df['area_in_microns'] = df['area'] * (scale**2) df['equivalent_diameter_microns'] = df['equivalent_diameter'] * (scale) print(df.head()) 

Used regionprops to measure the segmented regions. Segmented image I would like to know if there is any way to display the labels in the output image so that segmented labels' corresponding measurements can be known?

1 Answer

Are you asking whether you can display a colormapped version of the measurements on top of the image? If so, the answer is yes! You can use skimage.util.map_array for this.

import matplotlib.pyplot as plt import numpy as np import pandas as pd from skimage import ( color, data, filters, measure, morphology, segmentation, util ) # grab the image coins = data.coins() # segment the image; from: # edges = filters.farid(coins) markers = np.zeros_like(coins) markers[coins < 30] = 1 markers[coins > 150] = 2 watershed = segmentation.watershed(edges, markers) segmented_raw = measure.label(watershed == 2) # remove tiny background objects due to noise segmented = morphology.remove_small_objects(segmented_raw, 64) # measure regionprops table = pd.DataFrame(measure.regionprops_table( segmented, coins, properties=('label', 'area') )) # map the labels to measured properties colored_by_area = util.map_array( segmented, np.asarray(table['label']), np.asarray(table['area']).astype(float), ) # set 0 to nan, so it appears as transparent in pyplot.imshow colored_by_area[colored_by_area==0] = np.nan # display the results fig, axes = plt.subplots(1, 2, sharex=True, sharey=True) colored_by_label = color.label2rgb(segmented, image=coins, bg_label=0) axes[0].imshow(colored_by_label) axes[0].set_axis_off() axes[0].set_title('segmentation') axes[1].imshow(coins, cmap='gray') axim = axes[1].imshow(colored_by_area, cmap='viridis') axes[1].set_axis_off() axes[1].set_title('segment area') plt.colorbar(axim, ax=axes[1], fraction=0.05, label='area (px)') plt.show() 

plot result

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like