[PYTHON] Nahtschnitzen (Bildbeschneiden) habe ich versucht

seam carving? japan.gif

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]

Versuchen

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))

Was für ein Algorithmus ist das Schnitzen von Nähten?

"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") image

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.

Galerie

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)

Taj Mahal

taj.gif Ich drücke die Lücke gut.

Kowloon Schloss

kuron.gif 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)

Verweise

[^ 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

Nahtschnitzen (Bildbeschneiden) habe ich versucht
Ich habe die Bildklassifizierung von AutoGluon ausprobiert
Ich habe versucht, 100 Bildverarbeitung anzuklopfen (Q1 ~ Q10)
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert
Ich habe AutoKeras ausprobiert
Ich habe es mit Papiermühle versucht
Ich habe versucht, Django-Slack
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Pymc auszuführen
Ich habe ARP-Spoofing ausprobiert
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe Python> autopep8 ausprobiert
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe PyCaret2.0 (pycaret-nightly) ausprobiert.
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, tief zu lernen
Ich habe AWS CDK ausprobiert!
Ich habe versucht, Ipython zu verwenden
Ich habe versucht zu debuggen.
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe Kivys Kartenansicht ausprobiert
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, EfficientDet zu verschieben
Ich habe versucht, Shell zu programmieren
Ich habe versucht, doctest zu verwenden
Ich habe Python> Decorator ausprobiert
Ich habe versucht, TensorFlow auszuführen