Проблема извлечения человеческих силуэтов из сегментированного изображения (felzenszwalb)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблема извлечения человеческих силуэтов из сегментированного изображения (felzenszwalb)

Сообщение Anonymous »

В настоящее время я работаю над извлечением бинарных силуэтов людей на изображении из общедоступного набора данных взаимодействия UT. Я применил к изображению сегментацию Фельценшвалба, чтобы разделить изображение на сегменты в соответствии с интенсивностью и пространственным расположением. Затем мне нужно каким-то образом извлечь бинарный силуэт людей на изображении. Проблема в том, что я не могу правильно извлечь бинарные силуэты людей на изображениях. Вот исходное изображение:
Изображение

Вот сегментированное изображение после применения сегментации Фельценшвалба со значением параметра масштаб = 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»