Libvips: Ist es möglich, Padding hinzuzufügen und das Seitenverhältnis 1 zu 1 beizubehalten?

Erstellt am 30. Okt. 2017  ·  5Kommentare  ·  Quelle: libvips/libvips

Hi,

Ich habe gerade erst mit der Verwendung dieser Codebasis begonnen und möchte feststellen, dass sie bisher großartig funktioniert! Vielen Dank.

Ich würde gerne sehen, ob es bereits möglich ist oder in Arbeit ist, einem Bild Padding hinzuzufügen und das Seitenverhältnis beizubehalten. Wir verwenden ein Tool, das dies tut, aber dazu neigt, sehr, sehr langsam zu sein. Wie Sie im zweiten Bild sehen können, fügt es die Auffüllung hinzu und findet die am stärksten gewichtete Farbe.

Zum Beispiel:
Original Bild:
cobain1

Aufgefülltes Bild mit 1 zu 1 Seitenverhältnis:

cobain2

Danke und hoffe das macht alles Sinn :)

question

Hilfreichster Kommentar

Ich habe dir ein kleines Pyvips-Programm gemacht, um dies zu tun:

import sys
import pyvips

im = pyvips.Image.new_from_file(sys.argv[1])

# the margin of pixel we extract to get the average edge
margin = 10 

# paste black over the centre, take the histogram of the whole image
square = pyvips.Image.black(im.width - 2 * margin, im.height - 2 * margin)
hist = im.insert(square, margin, margin).hist_find()

# zap the 0 column to remove the black square
onepx = pyvips.Image.black(1, 1)
hist = hist.insert(onepx, 0, 0) 

# then the histogram peak is the most common value in each band
bg = [x.maxpos()[1] for x in hist.gaussblur(1).bandsplit()]

# extend image out with that background
size = max(im.width, im.height)
im = im.embed((size - im.width) / 2, (size - im.height) / 2, size, size,
              extend='background', background=bg)

im.write_to_file(sys.argv[2])

Führen Sie es so aus:

john<strong i="9">@kiwi</strong>:~/try$ python extend_avg.py ~/pics/greybg.png x.png

Für dein Testbild erhalte ich:

x

Alle 5 Kommentare

Es wäre nicht schwer in so etwas wie pyvips / ruby-vips / etc.

Ich nehme an, ich würde die Kanten abschneiden, ein 3D-Histogramm erstellen, den Peak finden (der die häufigste Farbe in den Kantenbereichen wäre) und dann diese Farbe verwenden, um das Original zu erweitern.

@jcupitt Danke für deine schnelle Antwort!

Würde ich zu viel verlangen, um dies zufällig als Feature hinzuzufügen? Ich werde mich umsehen, um zu sehen, was ich finden / erreichen kann. Ich kann nicht sagen, dass ich ein Experte bin, aber ich werde es versuchen!

Ich habe dir ein kleines Pyvips-Programm gemacht, um dies zu tun:

import sys
import pyvips

im = pyvips.Image.new_from_file(sys.argv[1])

# the margin of pixel we extract to get the average edge
margin = 10 

# paste black over the centre, take the histogram of the whole image
square = pyvips.Image.black(im.width - 2 * margin, im.height - 2 * margin)
hist = im.insert(square, margin, margin).hist_find()

# zap the 0 column to remove the black square
onepx = pyvips.Image.black(1, 1)
hist = hist.insert(onepx, 0, 0) 

# then the histogram peak is the most common value in each band
bg = [x.maxpos()[1] for x in hist.gaussblur(1).bandsplit()]

# extend image out with that background
size = max(im.width, im.height)
im = im.embed((size - im.width) / 2, (size - im.height) / 2, size, size,
              extend='background', background=bg)

im.write_to_file(sys.argv[2])

Führen Sie es so aus:

john<strong i="9">@kiwi</strong>:~/try$ python extend_avg.py ~/pics/greybg.png x.png

Für dein Testbild erhalte ich:

x

@jcupitt du bist der Mann, vielen Dank dafür! +1 +1 +1

Kein Problem, ich schließe.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen