OpenCV Interpolation funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
quanux
User
Beiträge: 12
Registriert: Freitag 24. Februar 2017, 12:59

Hallo zusammen,
ich habe folgendes Problem, ich würde gerne mittels OpenCV die Größe eines Filmes ändern.
Das funktioniert gut, allerdings werden durch die Umrechnung die dargestellten Linien stufige, was ziemlich scheiße ausschaut.
OpenCV bieten ja eigentlich über den Zusatz „interpolation= z.B.: cv2.INTER_NEAREST“ die Option an diese Kanten zu glätten, allerdings ist es bei mir so, dass egal welche Interpolation ich wähle, es überhaupt keinen Einfluss auf das Endergebnis hat.

Das gleiche Problem hab ich auch, wenn ich bei cv2.warpPerspective eine Interpolation versuche.

Ich verwende Python27 auf Windows 10.
Der Code schaut etwa so aus:

Code: Alles auswählen

import cv2

cap = cv2.VideoCapture('videoIN.mp4')
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
ret, frame = cap.read()
out = cv2.VideoWriter('videoOUT.avi', fourcc, 30.0, (1280, 720))

while (cap.isOpened()):
	ret, frame = cap.read()
	
	if ret:
	        
            img = cv2.resize(frame, (1280, 720), interpolation=cv2.INTER_NEAREST)
            out.write(img)
            
       else:
            break
            
cap.release()
out.release()

  	
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@quanux: Also `cv2.INTER_NEAREST` ist gerade die Option die *nicht* glättet sondern einfach das nächstliegende Pixel aus dem Ausgangsbild nimmt ohne etwas an den Pixelwerten zu verändern. Wenn die Standardeinstellung (lineare Interpolation) nicht gut aussieht, dann bleiben noch `cv2.INTER_CUBIC` und `cv2.INTER_LANCZOS4` wenn das Bild vergrössert wird. Und falls Dir davon kein Ergebnis gefällt, ist die Frage ob das überhaupt möglich ist allgemein das Bild so zu vergrössern, dass Linien nicht stufig aussehen, denn letztlich muss der Rechner beim Vergrössern Pixel/Details ”erfinden” die im Original nun mal einfach nicht vorhanden sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
quanux
User
Beiträge: 12
Registriert: Freitag 24. Februar 2017, 12:59

Hi BlackJack,
vielen Dank für die schnelle Antwort.
Das war jetzt von mir im Beispiel vielleicht etwas ungünstig gewählt, ich habe tatsächlich alle Interpolationen ausprobiert und miteinander verglichen. Das Ergebnis war immer exakt das gleiche.
Und ich will das Bild nicht vergrößern sondern verkleinern.
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@quanux: Exakt das gleiche im Sinne von ``new_image == old_image`` mag ich jetzt irgendwie nicht glauben. Für's verkleinern empfiehlt die Dokumentation ja `cv2.INTER_AREA`. Hast Du mal ein Beispielbild zur Hand?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
quanux
User
Beiträge: 12
Registriert: Freitag 24. Februar 2017, 12:59

Oh Mann :oops:,
also es schaut tatsächlich mit Nearest, linear, cubic und lanczos4 exact gleich aus.
Aber mit Area funktioniert es, das kannte ich noch nicht.

Hast du auch so einen guten Tip für cv2.warpPerspective?
Da funktioniert es mit Area leider nicht.

Vielen Dank für die super schnelle Hilfe.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

warpPerspective kennt doch den gleichen Parameter. Tut der nicht?

https://docs.opencv.org/2.4/modules/img ... rderValue)
quanux
User
Beiträge: 12
Registriert: Freitag 24. Februar 2017, 12:59

Ja, eigentlich schon, nur scheint der an meinem Endergebnis nichts zu ändern.
Antworten