seam carving?
Das Schnitzen von Nähten ist keine * einfache Reduzierung * beim Ändern der Bildgröße Es ist ein Algorithmus, der unnötige Teile des Bildes in einem "guten Gefühl" zerquetscht. Wenn Sie sich [dieses Video] ansehen (https://www.youtube.com/watch?v=qadw0BRKeMk), können Sie leicht verstehen, was passieren wird. Wenn Sie es zum ersten Mal sehen, sieht es aus wie Magie.
Es ist eine in SigGraph2007 vorgeschlagene Methode, also eine langjährige Methode. [^ 1]
Ich habe es mit IPython Notebook versucht, daher denke ich, dass es nur mit Notebook funktioniert
import matplotlib.pyplot as plt
from skimage import transform
from skimage import filters
import cv2
%matplotlib inline
def carve(image, num, mode='vertical'):
"""Funktion zum "Schneiden""""
#Konvertiert das Bild in Graustufen und berechnet die Darstellung der Sobel-Gradientengröße.
#das ist"energy map"Dies sind die Informationen, die für den Nahtschnitzalgorithmus benötigt werden.
#Sie müssen Sobel nicht unbedingt für die Energiekarte verwenden.
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
mag = filters.sobel(gray.astype("float"))
carved = transform.seam_carve(image, mag, mode=mode, num=num) #Ausgeschnitten!
carved = (carved * 255).astype('uint8')
return carved
#Laden Sie das Originalbild
original_image_path = 'images/original/japan.jpg'
# load the image
image = cv2.imread(original_image_path)
# show the original image
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
#Stück für Stück ausschneiden
carved = image
for i in range(21):
carved = carve(carved, num=10, mode='vertical')
plt.imsave('images/carved/japan_v_{}.jpg'.format(10*i), cv2.cvtColor(carved, cv2.COLOR_BGR2RGB))
"Naht" bedeutet "Naht" und "Schnitzen" bedeutet "Schnitzen". Hier bedeutet "Naht" eine Linie, die in Bezug auf das Bild "von oben nach unten" oder "von links nach rechts" gezeichnet ist. Ich werde diese Naht so einstellen, dass sie den Teil "egal" des Bildes kreuzt. (Zum Beispiel ist die rote Linie in der Abbildung unten [^ 2] die "Naht")
Indem Sie das Bild entlang der Nähte zuschneiden und schön überlagern, können Sie die Größe des Bildes wie das GIF am Anfang ändern. Die Naht, Naht, wird berechnet, indem die Linie, die das Bild kreuzt, so berechnet wird, dass die Änderung auf der Energiekarte gering ist [^ 3].
In diesem Beispiel wird es nur in horizontaler Richtung geschrumpft, aber natürlich kann es auch in vertikaler Richtung geschrumpft werden. Neben dem Schrumpfen kann es auch erweitert werden. [^ 4]
Deep Learning? Nahtschnitzen ist kein tiefes Lernen. Einfallsreichtum wie die Verwendung des von Deep Learning extrahierten Interessenbereichs als Energiekarte könnte sich jedoch in Zukunft herausstellen.
Es gibt viele Bilder, die nicht funktionieren. Unten finden Sie ein erfolgreiches Beispiel.
Es ist einfach zu arbeiten, wenn das Teil, auf das Sie achten möchten, verteilt im Bild angezeigt wird. (In Taj Mahal ist der Turm beispielsweise links und rechts gut verteilt, und Sie können den leeren Teil in der Mitte ausschneiden.) Bei einem Bild, bei dem nur ein Teil zu bemerken ist, werden häufig das linke und das rechte Ende der Reihe nach ausgeschnitten, was nicht sehr interessant ist.
Außerdem war ich nicht gut in Bildern, die überhaupt nicht ausgeschnitten werden konnten (zum Beispiel ein Bild einer Katze im Vollbild). (Ich denke, es kann nicht geholfen werden, weil dies überhaupt nicht geschnitten werden kann)
Ich drücke die Lücke gut.
Sie können sehen, dass das gesamte Bild horizontal verkleinert ist, die Buchstaben auf dem roten Schild links jedoch nicht verkleinert sind. (Das Schild selbst schrumpft allmählich)
[^ 1]: Es scheint, dass es vom Forschungsinstitut von Mitsubishi Electric angekündigt wurde. [^ 2]: Quelle: Referenzpapier: Abbildung 1 [^ 3]: Aufgrund fehlender Studien konnte die Liste der verfügbaren Energiekarten nicht erstellt werden. [^ 4]: In Bezug auf die Erweiterung hat scikit-image keine Implementierung, daher müssen Sie diese selbst implementieren.
Recommended Posts