** Ceci est un article sur DeNA 20 New Graduate Advent Calendar 2019. ** **
Je serai ingénieur Web à DeNA à partir d'avril de l'année prochaine, mais j'étudie généralement la lumière à l'école supérieure. Lorsque je présente brièvement mes recherches, je change la forme du laser et je le tire, ou je mesure des objets à l'aide de la lumière (Au fait, lorsque j'affiche l'image de mon compte Qiita sur quelque chose appelé SLM et que je frappe le laser, Le laser se ramifie en 100).
Dans cet article, étant donné que j'étudie la lumière, je voudrais vous présenter une ** "caméra à pixel unique" ** qui peut être facilement implémentée en Python (tout peut être implémenté si le calcul matriciel est possible). Vous pouvez donc facilement l'implémenter avec MATLAB ou Octave)
Avant de parler du principe d'une caméra à pixel unique, commençons par le mécanisme d'une caméra normale. Pour le dire franchement, une caméra normale utilise un CCD, qui est bordé de nombreux ** détecteurs (qui peuvent détecter l'intensité de la lumière) **.
Par exemple, si l'appareil photo peut prendre des images de 100 x 100 pixels, 100 x 100 détecteurs sont alignés.
Ensuite, chaque détecteur détecte la lumière réfléchie par l'objet, et l'intensité de la lumière détectée est convertie en une valeur de pixel pour créer une image.
Alors, qu'en est-il d'une caméra à pixel unique? Un seul détecteur peut prendre une image. Pour en dire un peu plus ** "Une caméra (méthode) qui peut reconstruire une image par calcul matriciel après avoir mesuré plusieurs fois en utilisant un détecteur" ** (Cela s'appelle un pixel unique car il peut être filmé avec un seul détecteur).
Je pense que la plupart des gens n'obtiennent pas une image réelle même s'ils écoutent beaucoup. Ça va. Le mécanisme de la caméra à pixel unique lui-même est vraiment simple. ~~ La raison pour laquelle je l'ai choisi comme matériau de l'article semble facile à expliquer. .. .. ~~
La figure ci-dessous montre la prise de vue réelle avec un appareil photo à pixel unique. Ici, la scène est la cible de tir. La lentille est utilisée pour collecter la lumière dans le détecteur. Comme le montre la figure ci-dessus, toute la lumière provenant de l'objet passe à travers le masque et est collectée et détectée par un détecteur.
Le motif de masque qui est soudainement apparu ici. C'est important. Grâce à ce type, la caméra à pixel unique peut filmer avec un seul détecteur.
** "Détecter l'intensité lumineuse après que la lumière provenant de l'objet passe à travers le motif du masque" (l'ordre du masque et de la cible de tir n'a pas d'importance). ** **
En changeant le motif de masque préparé à l'avance l'un après l'autre et en répétant le travail ci-dessus, la prise de vue avec une caméra à un seul pixel est effectuée.
Ici, l'état de la i-ème détection d'intensité lumineuse En supposant que le motif de masque (matrice de codage) est Wi, la cible de tir est X et la valeur de détection est Yi, Wi peut être transformé en (1, N) et X peut être transformé en (N, 1) comme indiqué ci-dessous.
On dirait. Ici, N est le nombre de pixels du masque, et ce N est le nombre de pixels à photographier tel quel.
Comme le montre la figure ci-dessus, le i-ème résultat de mesure Yi est le produit interne de Wi et X.
Chaque ligne de W et Y est le masque utilisé dans chaque mesure et le résultat de la mesure. Maintenant X, W, Y
C'est dans l'état.
Andy
C'est le principe de prise de vue d'un appareil photo à pixel unique.
L'un des avantages de l'utilisation d'un appareil photo à pixel unique pour ce type de travail est que vous pouvez prendre des photos même sous un éclairage très faible **.
La raison pour laquelle il est possible de photographier même avec une lumière très faible est qu'une caméra à un seul pixel ** collecte et détecte la lumière dans un seul détecteur **.
Par exemple, si 10 $ de lumière provient du sujet, une caméra 10x10 pixels a un détecteur séparé pour chaque pixel, donc la quantité de lumière qui peut être détectée par chaque détecteur est de 10 $ / (10x10) $. Cependant, comme la caméra à pixel unique recueille et détecte la lumière dans un détecteur, la quantité de lumière reste à 10 (bien qu'elle passe réellement à travers le masque, elle tombe donc à 4 ou 5).
Par conséquent, il est possible de prendre des photos même avec une quantité de lumière qui ne peut pas être prise avec un appareil photo normal.
L'inconvénient est qu'il faut plusieurs mesures pour prendre une image. Par conséquent, il ne convient pas pour capturer "un moment" ou pour filmer des films.
Maintenant, implémentons enfin le flux d'une caméra à pixel unique avec Pyhon. Eh bien, même si vous dites implémentation, comme mentionné dans le principe, vous ne faites que des calculs matriciels, vous laissez donc Python faire le calcul.
Tout d'abord, importez la bibliothèque à utiliser. Utilisez numpy
pour gérer les matrices et ʻopenCV` pour gérer les images.
import numpy as np
import cv2
Après cela, l'image à prendre est lue. Aussi, obtenez les tailles verticale et horizontale de l'image, et calculez le nombre de pixels N du masque à partir de celle-ci.
X = cv2.imread("img/target.jpg ",0)
h,w = X.shape
N = h*w
Préparez également un processus pour afficher l'image en tant que fonction show.
def show(img):
img = (img/np.max(img))*255
img = img.astype("uint8")
cv2.imshow("img", img)
cv2.waitKey(0)
Montrons l'image chargée
show(X)
Cette fois, nous utiliserons une image croisée de 16x16 pixels.
Ensuite, préparez un masque. Cette fois, on suppose que la mesure est effectuée M fois avec un masque aléatoire noir et blanc à N pixels (M = N).
M = N
W = np.random.rand(M, N)
W = np.where(W>0.5, 1, 0)
show(W)
print(W.shape)
Avez-vous vu l'image et imprimé les résultats "256.256"? Cela signifie mesurer 256 fois avec un masque de 256 pixels.
Vérifions également le masque utilisé lors de la première mesure
show(W[0].reshape(h,w))
Y = []
for mask in W[:M]:
#i-ème mesure
yi = np.dot(mask.reshape(1,N), X.reshape(N,1))
Y.append(yi)
"""
Même signification
Y = np.dot(W,X.reshape(N,1))
"""
Y = np.array(Y).reshape(M,1)
print(Y.shape)
Vous avez vu (256, 1)? Cela signifie qu'il y a 256 résultats de mesure. avec ça
pinv
of numpy
pour calculer la matrice inverse
InvW = np.linalg.pinv(W[:M])
print(InvW.shape)
Maintenant, utilisez ces ʻInvW et
Y` pour obtenir et afficher X. Notez que X est reconstruit dans l'état de (N, 1), donc si vous voulez l'afficher sous forme d'image, vous devez le remodeler en utilisant (h, w).
rec = np.dot(InvW, Y)
print(rec.shape)
show(rec.reshape(h,w))
Si vous pouvez obtenir l'image originale en toute sécurité, vous réussissez. Ce qui précède est le flux d'une caméra à pixel unique. Vous pouvez voir qu'il peut être implémenté avec un code incroyablement simple. Dans l'expérience réelle, l'image cible X peut être reconstruite en entrant la valeur de détection du détecteur dans le masque utilisé pour W et Y de la même manière que ci-dessus.
D'ailleurs, si vous réduisez ici le nombre de mesures M, vous ne pourrez pas bien acquérir les images. En effet, le nombre de mesures doit généralement être M = N. Cependant, si vous utilisez une technologie appelée ** détection de compression **, vous pouvez réduire considérablement ce nombre de mesures M. Habituellement, le nombre de mesures est réduit en combinant cette technologie.
Je ne parlerai pas de la détection de compression cette fois car ce sera long si je l'explique, mais si vous êtes intéressé, essayez-le. Ce commentaire est facile à comprendre. http://www-adsys.sys.i.kyoto-u.ac.jp/mohzeki/Presentation/lecturenote20160822.pdf
Merci pour votre soutien continu au calendrier de l'Avent DeNA 20 pour les nouveaux diplômés 2019. Puis: D
Recommended Posts