JeromePerleth / Bicubic-Interpolation

1 stars 0 forks source link

Parameter Scale #4

Open Madave94 opened 2 years ago

Madave94 commented 2 years ago

Der Parameter Scale in der upscale Funktion sollte Folgendermassen funktionieren:

  1. Prüfe ob der Parameter >1 ist. Wenn nicht breche das Programm mit einer Fehlermeldung ab, diese kann zum Beispiel so aussehen:
      if scale < 1:
        raise Exception("Invalid scale parameter {} is smaller then 1.".format(scale))
  2. Finde die neue Größe des Bilder raus. Hier bist du schon nahe dran. ein wert von 1.1 sollte bedeuten 110% der ursprünglichen Größe also +10%. Damit sollte es eigentlich sein newRows = rows * scale .
  3. Eventuell paddings des Ursprungsbildes mit den Werten von außen. Damit quasi beim bestimmen der ROI immer noch Pixel gefunden werden.

Die Zeile 12 in der upscale Funktion new[0:newRows : 2, 0:newColumns : 2] = gray2[0:rows, 0:columns] funktioniert glaube ich auhc nicht so. Hier sollte kein fester Wert enthalten sein, sondern Werte werden in Abhängigkeit der Skalierung gewählt.

JeromePerleth commented 2 years ago
  1. Das mit der Fehlermeldung verstehe ich voll und ganz und ich habe es auch geändert. Sonst würde man das Bild ja nicht vergrößern sondern verkleinern und somit würde mein Programm nicht wie gewollt funktionieren.

  2. Ja das stimmt, jedoch habe ich die Funktion lediglich für einen scale von 2 aufgebaut, weil mir das vieles an Komplexität bezüglich der Pixel an den Seiten erspart hätte. So wie du es vorschlägst, kenn ich keine Lösung für das Problem mit einzelnen Pixeln am Rand.

  3. Bei diesem Punkt verstehe ich nicht ganz was du meinst, eine Erklärung beim nächsten Treffen wäre super.

  4. Ja wie bereits erwähnt ist die Funktion eher für das verdoppeln der Bildgröße ausgelegt, da ich so dem Problem mit leeren Pixeln an den Rändern und der Problematik wie viele Pixel mit dem Wert 0 zwischen den Pixeln mit konkreten Werten liegen aus dem Weg gegangen bin. Außerdem wusste ich nicht wie ich die Werte berechnen soll. Mit einem scale von 2 hat man den 4x4 Bereich als ROI mit dem man relativ leicht in einem 8x8 Bereich arbeiten kann, also in dem mit 2 hochskalierten Bereich. Meine ganze Funktion würde so nunmal noch komplizierter werden und wenn sie ohnehin nicht funktioniert habe ich das nicht als sinnvoll erachtet. Mein Ziel war erstmal die Funktionalität für ein scale von 2.

Madave94 commented 2 years ago

Zu 3.: Also die Auswahl der ROI schaut gut aus. Kannst du mir nochmal schreiben welche Formel du hier genutzt hast um die Pixelwerte zu berechnen? Die Summe der Multiplikatoren muss eigentlich immer 1.0 sein, ansonsten passt irgendwas nicht.

Also z.B., interpoliere Punkt 1 aus den vier Werten 50, 55, 75, 75, alle im gleichen Abstand: 0.25 * 50 + 0.25 * 55 + 0.25 * 75 + 0.25 * 75 Die vier mal 0.25 wären in Summe 1.0 . Bei deiner Rechnung hier zum Beispiel: (roi[roi_x,roi_y] + roi[roi_x + 1,roi_y ] + roi[roi_x+ 2,roi_y] + roi[roi_x + 3,roi_y]) * 2/7 rechnest du vier Pixel zusammen und diese werden insgesamt mit 2/7 gewichtet. Dadurch würde ein Punkt dunkler werden, da der Multiplikator <1, wenn er >1 dann heller. Aber eigentlich willst du ja die Werte eher Mitteln ;)

Ich würde dir empfehlen mal etwas zum Padding zu lesen. Du kannst zum Beispiel https://numpy.org/doc/stable/reference/generated/numpy.pad.html mit pad_width=2 und mode='edges' nutzen. Dadurch wird dein Bild an den Rändern um zwei Pixel ergänzt. Das musst du dann nurnoch dazurechnen wenn du über die Pixel iterierst. Damit kannst du dann alles Pixel ordentlich berechnen.