2016-04-28 7 views
1

Ich habe die folgende Gleichung, die ich versuche zu implementieren. Die anstehende Frage nicht unbedingt zu dieser Gleichung ist, sondern ganz allgemein auf, wie man mit einer Division durch Null in der Bildverarbeitung zu tun:Handle "Division durch Null" in der Bildverarbeitung (oder PRNU Schätzung)

enter image description here

Hier I ein Bild ist, W ist der Unterschied zwischen dem Bild und seine denoised-Version (so, W drückt das Rauschen in dem Bild aus) und K ist ein geschätzter Fingerabdruck, der aus d Bilder der gleichen Kamera gewonnen wurde. Alle Berechnungen erfolgen pixelweise; also die Gleichungen nicht beinhalten eine Matrixmultiplikation. Für mehr über die Idee der Schätzung digitaler Fingerabdrücke konsultieren Sie entsprechende Literatur wie die allgemeinen wikipedia article oder scientificpapers.

Mein Problem tritt jedoch auf, wenn ein Bild ein Pixel mit dem Wert Null hat, z. perfektes Schwarz (nehmen wir an, wir haben nur ein Bild, k=1, so wird die Zero nicht zufällig durch den Pixelwert des nächsten Bildes überschrieben, wenn der nächste Pixelwert ungleich Null ist). Dann habe ich eine Division durch Null, die anscheinend nicht definiert ist.

Wie kann ich dieses Problem lösen? Eine Option, die ich mir ausgedacht habe, war das Hinzufügen von +1 zu allen Pixeln, kurz bevor ich mit den Berechnungen beginne. Dies verschiebt jedoch den Bereich der Pixelwerte von [0|255] zu [1|256], was es dann unmöglich macht, mit dem Datentyp uint8 zu arbeiten.

Andere Autoren in den Arbeiten, die ich zu diesem Thema gelesen habe, berücksichtigen oft nicht, dass Werte die Bereichsgrenzen schließen. Zum Beispiel berechnen sie nur die Gleichung für Pixelwerte [5|250]. Sie begründen dies, nicht wegen des numerischen Problems, aber sie sagen, wenn ein Bild vollständig gesättigt oder völlig schwarz ist, kann der Fingerabdruck in diesem Bereich nicht einmal richtig geschätzt werden.

Aber wieder, mein Hauptanliegen ist nicht, wie dieser Algorithmus am besten funktioniert, sondern eher im Allgemeinen: Wie mit Divisionen durch 0 in der Bildverarbeitung umzugehen?

+0

Kannst du bitte klarstellen, was meinst du mit "I_k ist ein Bild"? Was ist das mathematische Modell eines Bildes? – Matsmath

+0

Es ist eine 2D Matrix. Z.B. jeder Eintrag in der Matrix entspricht einem Pixel im Bild; also sind die Matrix-Dimensionen gleich der Auflösung des Bildes. Bedenken Sie jedoch, dass die Mathematik nicht den regulären "Matrix-Berechnungsregeln" folgt, da alle Operationen elementweise ausgeführt werden (nehmen Sie ein Pixel von I_k (x, y) und multiplizieren Sie es mit W_k (x, y) im Zähler) zum Beispiel) – muuh

+0

So wie ich dachte. Was meinst du mit * dividieren * durch die Summe der Matrizen 'I_k^2'? – Matsmath

Antwort

0

Eine Lösung besteht darin, Subtraktion statt Division zu verwenden; Subtraktion ist jedoch nicht skaleninvariant, sondern ist translationsinvariant.

[z.B. das Verhältnis wird immer ein normalisierter Wert zwischen 0 und 1 sein; und wenn es 1 überschreitet, kannst du es umkehren; Sie können die gleiche Normalisierung in der Subtraktion haben, aber Sie müssen die maximalen Werte finden, die durch die Variablen erreicht werden]

Eventuell müssen Sie sich mit der Division befassen. Das Teilen eines schwarzen Bildes mit sich selbst ist ein richtiges Thema - Sie können die Werte in einen anderen Bereich übersetzen und dann zurück transformieren.

Allerdings ist 5/8 nicht dasselbe wie 55/58. Sie können das also nur auf eine relativistische Art und Weise tun. Wenn Sie die genauen Verhältnisse kennen möchten, bleiben Sie besser beim ursprünglichen Intervall - und behandeln Sie diese als Sonderfälle. B. wenn der == 0 etwas damit machen soll; Wenn num == 0 und der == 0 0/0, dann haben wir eine Identität - es ist genau so, als hätten wir 1/1.

0

In PRNU und Fingerabdruck-Schätzung, wenn Sie die Matlab-Implementierung in Jessica Fridrich Website überprüfen, erstellen sie im Grunde eine Maske, um gesättigte und Low-Intensity-Pixel loszuwerden, wie Sie erwähnt. Dann wandeln sie die Bildmatrix in eine einzelne (I) um, was das Bild zu einem 32-Bit-Gleitkomma macht. Füge 1 zum Bild hinzu und teile es.

Zu Ihrer allgemeinen Frage, in der Bildverarbeitung, ich mag es, Maske zu erstellen und eins zu nur Nullwert Pixelwerte hinzuzufügen.

img=imread('my gray img'); 
a_mat=rand(size(img)); 

mask=uint8(img==0); 
div= a_mat/(img+mask); 

Dies wird Division durch Null Fehler verhindern. (Nicht getestet, aber es sollte funktionieren)