Einzelpixel-Kamera zum Erleben mit Python

Einführung

** 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.

Einzelpixelkamera (Einzelpixelkamera)

Gewöhnliche Kamera

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.

Einzelpixel-Kameraprinzip

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. image.png 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.

内積説明.jpg

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. $ Wi · x = Yi $ Kann ausgedrückt werden als. Das Ergebnis der Durchführung dieser Messung M-mal kann als Produkt der Matrizen $ (M, N) × (N, 1) = (M, 1) $ (normalerweise N =) ausgedrückt werden, wie in der folgenden Gleichung gezeigt. Bei M kann das Ziel vollständig rekonstruiert werden.

行列.jpg

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 $ WX=Y $ Sie kann durch Multiplikation der Matrix von W und X ausgedrückt werden. Wie kann ich von hier aus herausfinden, wie X aussieht? ?? Ja, das ist einfach. Alles was Sie tun müssen, ist beide Seiten mit der inversen Matrix $ W ^ {-1} $ von W zu multiplizieren. Dann $ X = W^{-1}Y $ Ich konnte X daneben bekommen.

Dies ist das Aufnahmeprinzip einer Einzelpixelkamera.

Verdienst und Fehler

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.

Simulation in Python

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)

W.jpg

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))

Als nächstes erhalten wir das Messergebnis Y. Nehmen Sie die Maske nacheinander aus W heraus, nehmen Sie das innere Produkt mit dem Schießziel und fügen Sie es zu Y hinzu. Wenn Sie mit `Y = np.dot (W, X.reshape (N, 1))` berechnen, ist es eine Aufnahme, aber dieses Mal nehmen wir den Wert einmal und einmal wie die tatsächliche Messung. Vergessen Sie zu diesem Zeitpunkt nicht, die Form von X von (h, w) auf (N, 1) zu ändern.
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 $WX = Y$ Ist abgeschlossen und die Messung ist erfolgreich abgeschlossen. Als nächstes rekonstruieren wir X mit W und Y. $ X = W^{-1}Y$ Um X zu erhalten, brauchten wir $ W ^ {-1} $, was die Umkehrung von W ist, wie in der obigen Gleichung gezeigt. Verwenden Sie also "pinv" von "numpy", um die inverse Matrix zu berechnen

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


Dies ist das Ende meines Artikels.

Vielen Dank für Ihre fortgesetzte Unterstützung des DeNA 20 New Graduate Adventskalenders 2019. Dann: D.

Recommended Posts

Einzelpixel-Kamera zum Erleben mit Python
Kameraerfassung mit Python + OpenCV
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Python: So verwenden Sie Async mit
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
Link, um mit Python zu beginnen
[Python] Mit Python in eine CSV-Datei schreiben
Schön dich mit Python zu treffen
Versuchen Sie, Facebook mit Python zu betreiben
Ausgabe in eine CSV-Datei mit Python
Konvertieren Sie die Liste mit Python in DataFrame
MP3 → WAV-Konvertierung mit Python
Schwanzrekursion mit Python2 durchführen
Erste Schritte mit Python
Python> Liste> Doppelte Liste in einfache Liste konvertieren
Was tun mit PYTHON Release?
Gesichtserkennung mit Kamera mit opencv3 + python2.7
So berechnen Sie das Datum mit Python
Mit Python 3 einfach auf Twitter posten
Ich möchte mit Python debuggen
Python> Tupel> Konvertiert doppeltes Tupel in einzelnes Tupel
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Der schnellste Weg, um regelmäßig Kamerabilder mit Pythons OpenCV zu erhalten
Versuchen Sie, Farbfilme mit Python zu reproduzieren
Versuchen Sie, sich mit Python bei qiita anzumelden
Ändern Sie die Python 64-Bit-Umgebung mit Anaconda in eine 32-Bit-Umgebung
Englische Spracherkennung mit Python [Rede zu Text]
Konvertieren Sie Memos sofort mit Python 2to3
HTML-Mail mit Bild zum Senden mit Python
Memo, um nach KPI mit Python zu fragen
Python nur mit Hallo, Welten zu erinnern
Geben Sie Farbzeichen mit Python zu hübsch aus
Python-Protokoll mit GAE an die Konsole ausgeben
Konvertieren Sie Excel-Daten mit Python in JSON
Konvertiere Hiragana mit Python (Beta) in Romaji
Fraktal zum Erstellen und Spielen mit Python
Ich wollte ABC160 mit Python lösen
So arbeiten Sie mit BigQuery in Python
[Einführung in Python] Verwenden wir foreach mit Python
Ich möchte Protokolle mit Python analysieren
Wie man einen Taschentest mit Python macht
Ich möchte mit aws mit Python spielen
Bildaufnahme von der Kamera mit Python + OpenCV
So zeigen Sie Python-Japanisch mit Lolipop an
Versuch, SQLite3 mit Python zu handhaben [Hinweis]
[Teil1] Scraping mit Python → Organisieren Sie bis zu CSV!
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Fügen Sie Bildern mit Python2.7 Gaußsches Rauschen hinzu
Wie man mit Python-Flüchen Japanisch eingibt
Konvertieren Sie chinesische Zahlen mit Python in arabische Zahlen
Stellen Sie mit dem Python-Interpreter von PEPPER Mac eine Verbindung zu Pfeffer her
So betreiben Sie die Zeitstempelstation in Python