Alternative Segmentation Techniques Other Than Watershed For Soil Particles In Images
Answer :
You could try using Connected Components with Stats already implemented as cv2.connectedComponentsWithStats
to perform component labeling. Using your binary image as input, here's the false-color image:
The centroid of each object can be found in centroid
parameter and other information such as area can be found in the status
variable returned from cv2.connectedComponentsWithStats
. Here's the image labeled with the area of each polygon. You could filter using a minimum threshold area to only keep larger polygons
Code
import cv2 import numpy as np # Load image, Gaussian blur, grayscale, Otsu's threshold image = cv2.imread('2.jpg') blur = cv2.GaussianBlur(image, (3,3), 0) gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # Perform connected component labeling n_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=4) # Create false color image and color background black colors = np.random.randint(0, 255, size=(n_labels, 3), dtype=np.uint8) colors[0] = [0, 0, 0] # for cosmetic reason we want the background black false_colors = colors[labels] # Label area of each polygon false_colors_area = false_colors.copy() for i, centroid in enumerate(centroids[1:], start=1): area = stats[i, 4] cv2.putText(false_colors_area, str(area), (int(centroid[0]), int(centroid[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1) cv2.imshow('thresh', thresh) cv2.imshow('false_colors', false_colors) cv2.imshow('false_colors_area', false_colors_area) cv2.waitKey()
I used U-Net
for another application, and your case is very similar to what U-Net
do. You can find more information here. But generally, it is a convolutional neural network for medical image segmentation.
To start using U-Net, you can find a pre-trained model and apply it on your images and see the result.
Comments
Post a Comment