J'ai entendu dire que Facebook avait rendu le cadre de segmentation open source, et j'avais juste besoin de segmentation, alors j'ai cherché.
Segmenting and refining images with SharpMask
Je voulais avoir un espace candidat sans professeur cette fois-ci car il était inévitable d'être Lua ou Torch, mais ce cadre semblait avoir un enseignant, alors j'ai renoncé à l'utiliser et en ai cherché un autre .. Ensuite, OpenCV avait une telle fonction, alors je l'ai essayé.
graph_segmentation.py
import cv2
import numpy as np
segmentator = cv2.ximgproc.segmentation.createGraphSegmentation(sigma=0.5, k=300, min_size=1000)
src = cv2.imread('image.jpg')
segment = segmentator.processImage(src)
mask = segment.reshape(list(segment.shape) + [1]).repeat(3, axis=2)
masked = np.ma.masked_array(src, fill_value=0)
for i in range(np.max(segment)):
masked.mask = mask != i
y, x = np.where(segment == i)
top, bottom, left, right = min(y), max(y), min(x), max(x)
dst = masked.filled()[top : bottom + 1, left : right + 1]
cv2.imwrite('segment_{num}.jpg'.format(num=i), dst)
Paramètres | |
---|---|
sigma | Lissage de la bordure (petite valeur pour les bordures complexes, grande valeur pour les bordures lisses) |
k | Peut-être combien il faut intégrer les zones candidates (des valeurs plus petites se divisent en plusieurs zones plus petites, des valeurs plus élevées se divisent en moins de grandes zones?) |
min_size | Taille minimale de la zone (probablement le nombre de pixels de la zone) |
Il était difficile de ne supprimer que la zone candidate. Il semble y avoir un moyen d'utiliser le boundingRect d'OpenCV autre que de le faire avec Numpy.
Post-scriptum: La valeur peut être modifiée avec segmentator.setSigma (valeur), segmentator.setK (valeur), segmentator.setMinSize (valeur).
Résultat de l'application à l'image du corps entier de Lena qui ne peut pas être placé tel quel (sigma = 0.7, k = 1200, min_size = 5000)
Recommended Posts