
Вот сегментированное изображение после применения сегментации Фельценшвалба со значением параметра масштаб = 200 и сигма = 0,8, где каждый цвет изображения представляет сегмент.

Вот бинарное изображение после применения некоторого порога для извлечения бинарного силуэта, где я введите некоторые значения, чтобы исключить сегменты, интенсивность которых меньше порогового значения, а высота, ширина и площадь превышают пороговое значение:

Наконец, вот двоичное изображение после применения морфологической эрозии на итерации 1:

Как видите, эти сегменты стать частью бинарных силуэтов, которые не принадлежат ни одному из двух людей. Даже после операций морфологической эрозии эти сегменты не удаляются должным образом. Я пробовал операции морфологической эрозии с разными итерациями и разными значениями параметров для алгоритма сегментации, где он может либо отдавать приоритет созданию больших сегментов, игнорируя небольшие изменения между пикселями, либо создавать небольшие сегменты, где он отдает приоритет даже самым маленьким изменениям в зависимости от значения параметра. Сегментация и извлечение бинарного силуэта хорошо работают для некоторых изображений, но мне приходится менять параметры в алгоритме сегментации, пороговые значения при извлечении двоичного силуэта и итерации морфологической эрозии для многих изображений. Я хочу автоматизировать этот процесс, но просто не могу найти метод, который бы правильно работал для всех изображений в наборе данных. Что я могу сделать?
Вот код:
Код: Выделить всё
import numpy as np
import cv2
import skimage.segmentation as seg
from skimage.color import rgb2gray
from skimage.measure import regionprops
def morphological_erosion(binary_silhouette):
# Create a structuring element (consider different shapes)
kernel = np.ones((3, 3), np.uint8) # Basic 3x3 square
binary_silhouette = cv2.erode(binary_silhouette, kernel, iterations= 1)
return binary_silhouette
def felzenszwalb_segmentation(rgb_image):
# Perform segmentation using Felzenszwalb's method
segments = seg.felzenszwalb(rgb_image, scale=200, sigma=0.8, min_size = 50)
# Generate random colors for each segment
num_segments = len(np.unique(segments))
colors = np.random.randint(0, 256, size=(num_segments, 3), dtype=np.uint8)
# Create a blank RGB image of the same size as the input image
segmented_image = np.zeros_like(rgb_image)
# Assign random colors to each segment
for segment_id in np.unique(segments):
mask = (segments == segment_id)
segmented_image[mask] = colors[segment_id]
# display the segmented image
cv2.imshow("segmented Image", segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
return segments
def create_binary_silhoutte(image_segments, image):
# Convert the image to grayscale
gray_image = rgb2gray(image)
# Create an empty binary image
binary_image = np.zeros_like(gray_image)
# Calculate the mean intensity of each segment
for region in regionprops(image_segments, intensity_image=gray_image):
# Get the mean intensity of the segment
mean_intensity = region.mean_intensity
area = region.area
# Get bounding box coordinates
min_row, min_col, max_row, max_col = region.bbox
# Calculate height and width
height = max_row - min_row
width = max_col - min_col
# If the mean intensity is greater than the threshold, mark the region in the binary image
if mean_intensity > 0.5 and area < 50000 and height < 500 and width < 500:
for coordinates in region.coords:
binary_image[coordinates[0], coordinates[1]] = 255
return binary_image
if __name__ == "__main__":
# # Example usage
image_path = # path to image
image = cv2.imread(image_path)
# Apply Felzenszwalb segmentation to get the silhouette
segments = felzenszwalb_segmentation(image)
binary_silhouette = create_binary_silhoutte(segments, image)
cv2.imshow("binary Silhouette", binary_silhouette)
cv2.waitKey(0)
cv2.destroyAllWindows()
binary_silhouette = morphological_erosion(binary_silhouette)
cv2.imshow("binary Silhouette", binary_silhouette)
cv2.waitKey(0)
cv2.destroyAllWindows()
Подробнее здесь: https://stackoverflow.com/questions/787 ... lzenszwalb