Ich habe gehört, dass Facebook das Segmentierungsframework Open Source gemacht hat, und ich brauchte nur Segmentierung, also habe ich es nachgeschlagen.
Segmenting and refining images with SharpMask
Ich wollte dieses Mal einen Kandidatenbereich ohne Lehrer bekommen, weil es unvermeidlich war, Lua oder Torch zu sein, aber dieser Rahmen schien einen Lehrer zu haben, also gab ich es auf und suchte nach etwas anderem .. Dann hatte OpenCV eine solche Funktion, also habe ich es versucht.
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)
Parameter | |
---|---|
sigma | Randglätte (kleiner Wert für komplexe Ränder, großer Wert für glatte Ränder) |
k | Vielleicht, wie viel die Kandidatenbereiche zu integrieren sind (kleinere Werte teilen sich in viele kleinere Bereiche, größere Werte teilen sich in weniger große Bereiche?) |
min_size | Minimale Bereichsgröße (wahrscheinlich die Anzahl der Pixel im Bereich) |
Es war schwierig, nur den Kandidatenbereich auszuschneiden. Es scheint eine andere Möglichkeit zu geben, OpenCVs BoundingRect zu verwenden, als dies mit Numpy zu tun.
Nachtrag: Der Wert kann mit segmentator.setSigma (Wert), segmentator.setK (Wert), segmentator.setMinSize (Wert) geändert werden.
Anwendungsergebnis auf Lenas Ganzkörperbild, das nicht so platziert werden kann, wie es ist (Sigma = 0,7, k = 1200, min_size = 5000)
Recommended Posts