** Dies ist ein Artikel über DeNA 20 New Graduate Adventskalender 2019. ** ** **
Ich werde ab April nächsten Jahres Webingenieur bei DeNA sein, aber normalerweise forsche ich an der Graduiertenschule über Licht. Wenn ich meine Forschung kurz vorstelle, ändere ich die Form des Lasers und schieße ihn ab oder messe Objekte mit Licht. Der Laser verzweigt sich in 100).
In diesem Artikel möchte ich, da ich Licht studiere, eine ** "Einzelpixel-Kamera" ** vorstellen, die einfach mit Python implementiert werden kann (alles kann implementiert werden, wenn eine Matrixberechnung möglich ist). Sie können es also einfach mit MATLAB oder Octave implementieren.
Bevor wir über das Prinzip einer Einzelpixelkamera sprechen, beginnen wir mit dem Mechanismus einer normalen Kamera. Um es ganz klar auszudrücken, eine normale Kamera verwendet ein CCD, das mit vielen ** Detektoren (die die Intensität des Lichts erfassen können) ** ausgekleidet ist.
Wenn Sie beispielsweise eine Kamera haben, die Bilder mit 100 x 100 Pixel aufnehmen kann, sind 100 x 100 Detektoren in einer Reihe angeordnet.
Dann wird das vom Ziel reflektierte Licht von jedem Detektor erfasst und die Intensität des erfassten Lichts wird in einen Pixelwert umgewandelt, um ein Bild zu erzeugen.
Was ist dann mit einer Einzelpixel-Kamera? Nur ein Detektor kann ein Bild aufnehmen. Um noch ein bisschen mehr zu sagen ** "Eine Kamera (Methode), die ein Bild durch Matrixberechnung nach mehrmaliger Messung mit einem Detektor rekonstruieren kann" ** (Es wird als einzelnes Pixel bezeichnet, da es mit einem Detektor aufgenommen werden kann.)
Ich denke, dass die meisten Menschen kein wirkliches Bild bekommen, selbst wenn sie so viel hören. Es ist in Ordnung. Der Mechanismus der Einzelpixelkamera selbst ist sehr einfach. ~~ Der Grund, warum ich es als Material für den Artikel gewählt habe, scheint leicht zu erklären zu sein. .. .. ~~
Die folgende Abbildung zeigt die tatsächlichen Aufnahmen mit einer Einzelpixelkamera. Hier ist die Szene das Schießziel. Die Linse dient zum Sammeln des Lichts im Detektor. Wie in der obigen Abbildung gezeigt, passiert das gesamte vom Objekt kommende Licht die Maske und wird von einem Detektor gesammelt und erfasst.
Das Maskenmuster, das plötzlich hier auftauchte. Das ist wichtig. Dank dieses Typen kann die Einzelpixelkamera mit nur einem Detektor aufnehmen.
** "Ermitteln Sie die Lichtintensität, nachdem das vom Objekt kommende Licht das Maskenmuster durchlaufen hat" (die Reihenfolge der Maske und des Aufnahmeziels spielt keine Rolle). ** ** **
Durch Ändern des zuvor vorbereiteten Maskenmusters nacheinander und Wiederholen der obigen Arbeit wird eine Aufnahme mit einer Einzelpixelkamera durchgeführt.
Hier der Zustand der i-ten Lichtintensitätserfassung Unter der Annahme, dass das Maskenmuster (Codierungsmatrix) Wi ist, das Aufnahmeziel X ist und der Erfassungswert Yi ist, kann Wi in (1, N) und X in (N, 1) transformiert werden, wie unten gezeigt.
Es sieht aus wie. Hier ist N die Anzahl der Pixel der Maske, und dieses N ist die Anzahl der Pixel, die so wie sie sind fotografiert werden sollen.
Wie in der obigen Abbildung gezeigt, ist das i-te Messergebnis Yi das innere Produkt von Wi und X.
Jede Linie von W und Y ist die bei jeder Messung verwendete Maske und das Messergebnis. Jetzt X, W, Y.
Es ist im Staat.
Andy
Dies ist das Aufnahmeprinzip einer Einzelpixelkamera.
Einer der Vorteile der Verwendung einer Einzelpixel-Kamera für diese Art von Arbeit besteht darin, dass Sie auch bei sehr schwachem Licht aufnehmen können **.
Der Grund, warum es möglich ist, auch mit sehr schwachem Licht aufzunehmen, ist, dass eine Einzelpixelkamera ** Licht in einem Detektor sammelt und erkennt **.
Wenn beispielsweise 10 US-Dollar Licht vom Motiv kommen, verfügt eine 10 x 10-Pixel-Kamera über einen separaten Detektor für jedes Pixel, sodass die Lichtmenge, die von jedem Detektor erfasst werden kann, 10 US-Dollar / (10 x 10) US-Dollar beträgt. Da jedoch die Einzelpixelkamera das Licht in einem Detektor sammelt und erkennt, bleibt die Lichtmenge bei 10 (obwohl sie tatsächlich durch die Maske geht, fällt sie auf 4 oder 5 ab).
Daher ist es möglich, auch mit einer Lichtmenge aufzunehmen, die mit einer normalen Kamera nicht aufgenommen werden kann.
Der Nachteil ist, dass mehrere Messungen erforderlich sind, um ein Bild aufzunehmen. Daher ist es nicht zum Aufnehmen von "einem Moment" oder zum Aufnehmen von Filmen geeignet.
Lassen Sie uns nun den Fluss einer Einzelpixelkamera mit Pyhon implementieren. Nun, selbst wenn Sie die Implementierung sagen, wie im Prinzip erwähnt, führen Sie nur eine Matrixberechnung durch, also lassen Sie Python einfach die Berechnung durchführen.
Importieren Sie zunächst die zu verwendende Bibliothek. Verwenden Sie "numpy", um Matrizen zu verarbeiten, und "openCV", um Bilder zu verarbeiten.
import numpy as np
import cv2
Danach wird das aufzunehmende Bild gelesen. Ermitteln Sie auch die vertikale und horizontale Größe des Bildes und berechnen Sie die Anzahl der Pixel N der Maske daraus.
X = cv2.imread("img/target.jpg ",0)
h,w = X.shape
N = h*w
Bereiten Sie außerdem einen Prozess vor, um das Bild als Showfunktion anzuzeigen.
def show(img):
img = (img/np.max(img))*255
img = img.astype("uint8")
cv2.imshow("img", img)
cv2.waitKey(0)
Lassen Sie uns das geladene Bild anzeigen
show(X)
Dieses Mal verwenden wir ein Kreuzbild mit 16 x 16 Pixeln.
Bereiten Sie als nächstes eine Maske vor. Diesmal wird angenommen, dass die Messung M-mal mit einer zufälligen Schwarz-Weiß-Maske mit N Pixeln (M = N) durchgeführt wird.
M = N
W = np.random.rand(M, N)
W = np.where(W>0.5, 1, 0)
show(W)
print(W.shape)
Haben Sie die Bild- und Druckergebnisse "256.256" gesehen? Dies bedeutet 256-maliges Messen mit einer 256-Pixel-Maske.
Überprüfen wir auch die Maske, die bei der ersten Messung verwendet wurde
show(W[0].reshape(h,w))
Y = []
for mask in W[:M]:
#i-te Messung
yi = np.dot(mask.reshape(1,N), X.reshape(N,1))
Y.append(yi)
"""
Selbe Bedeutung
Y = np.dot(W,X.reshape(N,1))
"""
Y = np.array(Y).reshape(M,1)
print(Y.shape)
Wird es als (256, 1) angezeigt? Dies bedeutet, dass 256 Messergebnisse vorliegen. mit diesem
InvW = np.linalg.pinv(W[:M])
print(InvW.shape)
Verwenden Sie nun diese "InvW" und "Y", um X abzurufen und anzuzeigen. Beachten Sie, dass X im Status (N, 1) rekonstruiert wird. Sie müssen es daher mit (h, w) neu formen, wenn Sie es als Bild anzeigen.
rec = np.dot(InvW, Y)
print(rec.shape)
show(rec.reshape(h,w))
Wenn Sie das Originalbild sicher erhalten können, sind Sie erfolgreich. Das Obige ist der Fluss einer Einzelpixelkamera. Sie können sehen, dass es mit wahnsinnig einfachem Code implementiert werden kann. Im eigentlichen Experiment kann das Bildziel X rekonstruiert werden, indem der Erfassungswert des Detektors in die für W und Y verwendete Maske auf die gleiche Weise wie oben eingegeben wird.
Wenn Sie hier die Anzahl der Messungen M reduzieren, können Sie übrigens keine guten Bilder aufnehmen. Dies liegt daran, dass die Anzahl der Messungen normalerweise M = N sein muss. Wenn Sie jedoch eine Technologie namens ** Kompressionserfassung ** verwenden, können Sie diese Anzahl von Messungen M erheblich reduzieren. Normalerweise wird die Anzahl der Messungen durch die Kombination dieser Technologie reduziert.
Ich werde diesmal nicht auf die Kompressionserkennung eingehen, da es lange dauern wird, wenn ich es erkläre, aber wenn Sie interessiert sind, versuchen Sie es bitte. Dieser Kommentar ist leicht zu verstehen. http://www-adsys.sys.i.kyoto-u.ac.jp/mohzeki/Presentation/lecturenote20160822.pdf
Vielen Dank für Ihre fortgesetzte Unterstützung des DeNA 20 New Graduate Adventskalenders 2019. Dann: D.
Recommended Posts