[PYTHON] Méthode de visualisation des fluides BOS qui peut être effectuée à la maison pour voir ce qui est invisible

introduction

Le gaz clair est invisible à l'œil nu. Pourtant, il y a des moments où je veux le voir. Les technologies de visualisation des fluides telles que la méthode Schlieren et la méthode du graphe d'ombre y sont utiles. Cette fois, je vais essayer de visualiser ce fluide avec quelque chose à la maison. En gros, tout ce dont vous avez besoin est un appareil photo.

Les références

J'ai expérimenté en référence à cela. Nous vous recommandons de lire ici pour des théories détaillées. Amélioration de la méthode de visualisation du gradient de densité basée sur la méthode BOS

Introduction de la technologie de visualisation des fluides

Méthode Schrilen

Si le gradient de densité est important, vous pouvez voir quelque chose à l'œil nu, comme la brume de chaleur observée en été et le gaz du briquet. La méthode du graphe d'ombre les visualise sur le même principe qu'ils sont visibles à l'œil nu. La méthode Schlieren est une méthode pour augmenter encore la sensibilité de cette méthode. schlierens_sam13.jpg Appareil NOBBY TECH Schlierens

Ce système optique a une telle configuration.

シュリーレン法原理図.png

La lumière émise par la source lumineuse ponctuelle est collectée en un point par la lentille. En réalité, l'objectif a une certaine ampleur. Installez le bord du couteau de manière à ce que cette lumière soit bloquée d'environ la moitié. S'il y a un gradient de densité (inégalité de densité) sur le chemin optique, la lumière sera réfractée et ne sera pas collectée en un point. S'il est plié vers le bord du couteau, il sera bloqué et l'image sur le capteur sera sombre, et s'il est plié dans la direction opposée, elle sera lumineuse. De cette manière, le gradient de densité peut être enregistré en tant qu'informations de luminosité.

Cette méthode est très sensible et permet de prendre de belles photos, mais elle est un peu difficile à reproduire chez soi. Ce qui est difficile, c'est qu'il y a beaucoup de choses à préparer en premier.

Vient ensuite la difficulté d'installer le système optique. Il faut beaucoup d'efforts pour aligner l'axe optique. En particulier, le tranchant du couteau doit être dans la position de mise au point exacte. Ce serait bien s'il y avait une belle scène de mouvement, mais si ce n'était pas le cas, une certaine ingéniosité serait nécessaire.

Méthode SPBOS (Stripe-Patterned Background Oriented Schlieren)

Cette méthode BOS est une méthode qui permet de visualiser le gradient de densité de la même manière que la méthode Schlieren. Cela ne nécessite pas de lame de couteau.

Le système optique est également très simple. BOS法原理図.png

Prenez deux images, une avec uniquement l'arrière-plan et une avec un gradient de densité, et calculez le gradient de densité à partir de la différence. Il existe également une méthode BOS qui utilise un motif aléatoire en arrière-plan, mais qui rend le programme encombrant car il calcule la corrélation mutuelle et trouve l'écart comme PIV. Cette fois, nous utiliserons la méthode SPBOS qui utilise un motif par bandes qui facilite le programme.

Expérience

Choses à préparer

  1. Écran rayé
  2. Caméra
  3. Ce que vous voulez mesurer

Ceux utilisés cette fois sont les suivants.

  1. iphone8
  2. D5100, AF-S DX NIKKOR 55-300mm f/4.5-5.6G ED VR
  3. Monotaro Air Duster

Je pense que l'écran peut être imprimé sur papier avec un smartphone ou une imprimante.

Il est souhaitable que l'appareil photo puisse être enregistré au format RAW. La profondeur de bits du D5100 est de 14 bits (gradation 16383), mais lorsqu'elle est enregistrée au format jpg, elle n'est que de 8 bits (gradation 255) en fonction de la gradation de l'affichage. De plus, la correction gamma est efficace, donc le retour au linéaire aggravera la situation. Ce serait bien d'avoir un trépied, mais je pense qu'il n'y a rien de mal à le poser par terre. Veillez à ne pas secouer l'appareil photo lorsque vous appuyez sur le déclencheur.

Tournage

Cette fois, je l'ai installé comme ça. La distance focale est de 300 mm, le temps d'exposition est de 1/60, la valeur F est de 20 et la sensibilité ISO est de 400. BOS光学系セットアップ.png

Faites la mise au point de la caméra sur l'écran.

Vous devez faire attention à la distance entre l'écran et l'objet à mesurer. S'il est trop proche, la sensibilité ne sera pas obtenue. Même s'il existe un gradient de densité à proximité immédiate de l'écran et que la lumière se plie, la lumière pliée sera imagée à la même position que lorsqu'elle ne se pliait pas. Au contraire, s'il est trop loin, l'objet mesuré sera flou. Augmentez la valeur F pour augmenter la profondeur de vue.

L'image d'arrière-plan a été créée avec le programme suivant.

import numpy as np

#afficher
ppi = 326 # 1inch(25.4mm)Nombre de pixels par
x_pix = 750 #Résolution horizontale
y_pix = 1334 #Résolution verticale
pix_per_mm = ppi / 25.4
x_mm = x_pix / pix_per_mm
y_mm = y_pix / pix_per_mm
lam = 1.0 # mm

def sin_img(direction="x",bit=8):
    if direction == "x":
        x = np.linspace(0.0,x_mm,x_pix)
        sin = np.sin(2.0*np.pi*x/lam)
        img = np.tile(sin,(y_pix,1)).T
        img = 0.5 * (img + 1.0) * (2**bit-1.0)
    elif direction == "y":
        y = np.linspace(0.0,y_mm,y_pix)
        sin = np.np.sin(2.0*np.pi*y/lam)
        img = np.tile(sin,(x_pix,1))
        img = 0.5 * (img + 1.0) * (2**bit-1.0)
        
    if bit == 8:
        img = img.astype(np.uint8)
    elif bit == 16:
        img = img.astype(np.uint16)
    else:
        print("Le nombre de bits est de 8 ou 16")
    return img

Contexte pris ref.png

Il y a une mesure jet.png

une analyse

Tout d'abord, collez le programme utilisé pour l'analyse.

Les images RAW sont développées à l'aide de rawpy. Utilise des valeurs de luminosité à échelle linéaire sans correction gamma.

import rawpy
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
import cv2
from pathlib import Path

def postproccesing(path):
    raw = rawpy.imread(str(path))
    return raw.postprocess(gamma=[1.0,1.0],
                               no_auto_bright=True,
                               output_color=rawpy.ColorSpace.raw,
                               use_camera_wb=True,
                               use_auto_wb=False,
                               output_bps=16,
                                no_auto_scale=True
                              )

ref_path = Path("data/ref2.NEF")
jet_path = Path("data/jet2.NEF")

ref_img = postproccesing(ref_path)
jet_img = postproccesing(jet_path)

ref_gray = ref_img[:,:,1] #Échelle de gris
jet_gray = jet_img[:,:,1]

La visualisation ne prend que la différence et multiplie l'espace. En prenant la différence, vous pouvez voir la pièce réfractée par le gradient de densité. Même si la lumière se plie dans la même direction, elle sera plus sombre ou plus claire selon le motif de fond, il est donc nécessaire de multiplier le dégradé.

bos = (jet_gray-ref_gray) * np.gradient(0.5*(jet_gray+ref_gray))[1]

Appliquez un filtre passe-bas. Déterminez le groupe tout en regardant l'apparence de manière appropriée.

def fft_lpf(img,r):
    #Masque d'espace de fréquence
    mask = np.zeros_like(img)
    X,Y = np.meshgrid(np.arange(img.shape[1])-img.shape[1]/2.0,np.arange(img.shape[0])-img.shape[0]/2.0)
    mask[np.sqrt(X**2 + Y**2) < r] = 1.0
    
    #FFT
    fft_img = np.fft.fftshift(np.fft.fft2(img))
    fft_img *= mask
    return np.abs(np.fft.fft2(np.fft.fftshift(fft_img)))

Après avoir appliqué le filtre passe-bas, enregistrez l'image et terminez. 調整.png

Il y a beaucoup de bruit, mais le jet peut être visualisé fermement. Il semble que le bruit puisse être réduit avec un peu plus d'ingéniosité.

2020/04/14 PostScript J'ai réparé correctement la caméra et pris à nouveau une photo, puis ajusté la luminosité plus tard pour réduire le bruit. Vous pouvez prendre une si belle photo. 論文実装.png

Résumé

Il a été démontré que la visualisation des fluides peut être effectuée telle quelle avec uniquement ceux de la maison. Essayez-le.

Recommended Posts

Méthode de visualisation des fluides BOS qui peut être effectuée à la maison pour voir ce qui est invisible
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Quelle est la méthode Newton? ?? Solution approximative de l'équation à résoudre par la méthode de Newton