Caméra à pixel unique à expérimenter avec Python

introduction

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

Caméra à pixel unique (caméra à pixel unique)

Appareil photo ordinaire

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.

Principe de la caméra à pixel unique

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

内積説明.jpg

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. $ Wi · x = Yi $ Peut être exprimé comme. Le résultat de l'exécution de cette mesure M fois peut être exprimé comme le produit des matrices $ (M, N) × (N, 1) = (M, 1) $ (généralement N =) comme indiqué dans l'équation suivante. Lorsque M, la cible peut être complètement reconstruite).

行列.jpg

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 $ WX=Y $ Il peut être exprimé en multipliant la matrice de W et X. Comment puis-je savoir à quoi ressemble X à partir d'ici? ?? Oui, c'est facile. Tout ce que vous avez à faire est de multiplier les deux côtés par la matrice inverse $ W ^ {-1} $ de W. Puis $ X = W^{-1}Y $ J'ai pu obtenir X à côté.

C'est le principe de prise de vue d'un appareil photo à pixel unique.

mérite et démérite

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.

Simulation en Python

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)

W.jpg

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

Ensuite, obtenons le résultat de la mesure Y. Retirez le masque de manière séquentielle de W, prenez le produit intérieur avec la cible de tir et ajoutez-le à Y. Si vous calculez avec `Y = np.dot (W, X.reshape (N, 1))`, ce sera un coup, mais cette fois nous prendrons la valeur une fois et une fois comme la mesure réelle. À ce stade, n'oubliez pas de changer la forme de X de (h, w) à (N, 1).
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 $WX = Y$ Est terminé et la mesure est terminée avec succès. Ensuite, reconstruisons X en utilisant W et Y. $ X = W^{-1}Y$ Pour obtenir X, nous avions besoin de $ W ^ {-1} $, qui est l'inverse de W, comme indiqué dans l'équation ci-dessus. Utilisez donc 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


Ceci est la fin de mon article.

Merci pour votre soutien continu au calendrier de l'Avent DeNA 20 pour les nouveaux diplômés 2019. Puis: D

Recommended Posts

Caméra à pixel unique à expérimenter avec Python
Capture de caméra avec Python + OpenCV
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
Python: comment utiliser async avec
Utiliser la caméra Point Grey avec Python (PyCapture2)
Lien pour commencer avec python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python
Sortie vers un fichier csv avec Python
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
Pour faire une récursion avec Python2
Comment démarrer avec Python
Python> liste> Convertir une double liste en une seule liste
Que faire avec la sortie de PYTHON?
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Comment calculer la date avec python
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
Python> tuple> Convertir un double tuple en un seul tuple
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
Essayez de reproduire un film couleur avec Python
Essayez de vous connecter à qiita avec Python
Changer l'environnement Python 64 bits en environnement 32 bits avec Anaconda
Reconnaissance vocale en anglais avec python [speech to text]
Convertir un mémo à la fois avec Python 2to3
mail html avec image à envoyer avec python
Mémo pour demander des KPI avec python
python à retenir uniquement avec bonjour, mondes
Sortir les caractères de couleur en joli avec python
Sortie du journal Python vers la console avec GAE
Convertir des données Excel en JSON avec python
Convertir Hiragana en Romaji avec Python (bêta)
Fractal pour faire et jouer avec Python
Je voulais résoudre ABC160 avec Python
Comment utiliser BigQuery en Python
[Introduction à Python] Utilisons foreach avec Python
Convertissez des données FX 1 minute en données 5 minutes avec Python
Je veux analyser les journaux avec Python
Comment faire un test de sac avec python
Je veux jouer avec aws avec python
Acquisition d'images depuis une caméra avec Python + OpenCV
Comment afficher le japonais python avec lolipop
Essayer de gérer SQLite3 avec Python [Note]
[Part1] Scraping avec Python → Organisez jusqu'à csv!
Connectez-vous à s3 avec AWS Lambda Python
Ajouter du bruit gaussien aux images avec python2.7
Comment entrer le japonais avec les malédictions Python
Convertir des nombres chinois en nombres arabes avec Python
Connectez-vous à Pepper avec l'interpréteur Python de PEPPER Mac
Pour faire fonctionner la station d'horodatage en Python