파이톤을 통해 레이저 분기를 만드는 CGH를 같이 만들자(레이저와 SLM 필요)

18422 단어 Python

개시하다


레이저 분기 시키고 싶지 않아요?
너한테 해주고 싶어.
그런 너에게 누구나 할 수 있는 레이저의 분기 방법을 전수한다
독자 대상
레이저를 산 건 좋은데 레이저 하나만 쓰면 가공하기 어려울 것 같아
※ 그나저나 이쪽 HAMATSU PHOTINS 영상을 보면 지금부터 해야 할 일이라는 인상을 주기 쉽다
https://www.youtube.com/watch?v=BhLONC7LOJ0

전제조건·지식


간단히 쓰다.제가 좀 빈틈이 없는 것을 용서해 주십시오.
너는 레이저를 갈라놓고 싶다.
레이저는 빛이다.빛은 파.파도라서 진폭과 위상이 있어요.
광학 렌즈는 부립엽 변환 작용을 가지고 있다.한 마디로 하면 렌즈를 통과하는 빛은 부립엽을 거쳐 변환된 상태라고 생각하세요.
(관심 있는 사람들은 쉽게 이해할 수 있다. https://hoshistar81.jp/pdf/111111doc.pdf)。
너는 원래 레이저의 진폭을 알고 있다.
또 렌즈가 통과된 후 희망 레이저의 진폭은 이미 결정되었다.

의 원리


지금은 어떤 위상 상태로 레이저를 발사하고 렌즈를 통과하면 목적의 형상이 되기를 원한다.
그러나 레이저를 어떤 위상으로 설정하면 렌즈를 통과한 뒤 어떤 목적 형상(진폭)으로 변할지 알 수 없다.
이'어떤 위상이어야 하는지'를 아는 방법에는 반복 부립엽 변환법이 있다.
지금 당신이 가지고 있는 메시지는
  • 렌즈를 통과하기 전의 레이저 진폭
  • 렌즈를 통과한 후의 레이저 진폭(자신의 목적형상)
  • 렌즈를 통해 부립엽이 바뀐 사실
  • 네.
    현재, 렌즈를 통과하기 전에 a를 사용하고, 렌즈를 통과한 후에는 b를 사용한다.
    그리고 a에서 보면 b는 부립엽 변환 후, b에서 보면 a는 부립엽 변환 후라고 할 수 있다.
    a구역의 진폭을 원시 레이저의 진폭으로 설정하다.위상이 임의 값으로 설정되었습니다(첫 번째만).
    부립엽 변환.
    b구역의 진폭을 목적 진폭으로 설정하다.위상이 계속 지나갈 값으로 설정되었습니다.
    부립엽 역변환.
    a구역의 진폭을 원시 레이저의 진폭으로 설정하다.위상이 계속 지나갈 값으로 설정되었습니다.
    나는 이것을 계속 반복했다.그리고 위상은 부립엽 변환 전과 후의 진폭에 따라 적당히 최적화된다.
    이것은 부립엽 교체법이다.글자의 뜻처럼 부립엽 변환과 반변환을 반복하는 간단한 수법일 뿐이다.

    이루어지다


    Pytohon으로 이것을 실현하면 아래 코드와 같습니다.
    
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    def check_uniformity(u_int, target):
        u_int = u_int / np.max(u_int)
        maxi = np.max(u_int[target==1])
        mini = np.min(u_int[target==1])
        uniformity = 1 - (maxi-mini)/(maxi+mini)
        print("均一性:", uniformity)
        return uniformity
    
    def normalization(origin):
        maxi = np.max(origin)
        mini = np.min(origin)
        norm = ((origin - mini) / (maxi - mini))
        return norm
    
    
    def hologram(phase):
        phase = np.where(phase<0, phase+2*np.pi, phase)
        p_max = np.max(phase)
        p_min = np.min(phase)
        holo = ((phase - p_min)/(p_max- p_min)) * 255
        holo = holo.astype("uint8")
        return holo
    
    
    def reconstruct(norm_int):
        rec = norm_int * 255
        rec = rec.astype("uint8")
        return rec
    
    def main():
        target = cv2.imread("img/target.bmp",0)
        cv2.imshow("target",target)
        cv2.waitKey(0)
    
        height, width = target.shape[:2]
    
        target = target / 255
        laser = 1
        phase = np.random.rand(height, width)
        u = np.empty_like(target, dtype="complex")
    
        iteration = 20
        uniformity = []
    
        for num in range(iteration):
            u.real = laser * np.cos(phase)
            u.imag = laser * np.sin(phase)
    
            #-------レンズ---------
            u = np.fft.fft2(u)
            u = np.fft.fftshift(u)
            #-------レンズ---------
    
            u_abs = np.abs(u)
            u_int = u_abs ** 2
            norm_int = normalization(u_int)
    
            uniformity.append(check_uniformity(u_int,target))
    
            phase = np.angle(u)
    
            u.real = target * np.cos(phase)
            u.imag = target * np.sin(phase)
    
            #-----レンズ---------
            u = np.fft.ifftshift(u)
            u = np.fft.ifft2(u)
            #-------レンズ---------
    
            phase = np.angle(u)
    
    
        holo_name = "holo"
        rec_name = "rec"
    
        holo = hologram(phase)
        cv2.imwrite("img/{}.bmp".format(holo_name), holo)
        cv2.imshow("Hologram", holo)
        cv2.waitKey(0)
    
        rec = reconstruct(norm_int)
        cv2.imwrite("img/{}.bmp".format(rec_name), rec)
        cv2.imshow("Reconstruction", rec)
        cv2.waitKey(0)
    
        plt.figure(figsize=(8,5))
        plt.plot(np.arange(1,iteration+1),uniformity)
        plt.xlabel("Iteration")
        plt.ylabel("Uniformity")
        plt.ylim(0,1)
    
    if __name__ == "__main__":
        main()
    
    여기에 렌즈가 투사되기 전의 레이저의 강도가 고르고 렌즈가 투사된 후의 레이저는 이미지처럼 10에 있다고 가정한다×10점원본 이미지 링크으로 나누기를 희망합니다.

    상기 조건하에서 실행 프로그램은 다음과 같은 위상 이미지를 얻을 수 있다.

    이것은 CGH라고 한다.(빛의 영역에서 홀로그램이라는 이름은 이것 외에도 사용할 수 있으니 주의하세요. 매우 번거롭습니다.)
    이 CGH를 이미지처럼 SLM이라는 빛의 위상을 조절할 수 있는 장치에 표시하고 거기에 레이저를 넣으면 렌즈를 통과하면 정말 불가사의하다. 레이저가 원하는 모양으로 갈라지겠지.
    귀찮은 가공이 한순간에 끝나는군!

    참고로 프로그램의rec는 이 CGH를 사용한 상황에서 시뮬레이션한 재구성 결과입니다.
    Uniformity는 이 복구 결과의 분기된 각 점의 강도의 균일성을 나타냅니다.
    이번×분지 10을 희망하는 레이저의 강도는 모두 같지만 유니폼과 재건 결과를 보면 달라야 한다(어느 정도 중복되면 유니폼이 포화된다).
    실제로 제작된 CGH를 사용해도 재구성 이미지처럼 균일해지지 않는다.
    이번 생략 소개는 이러한 균일성을 높이기 위해 가중 알고리즘을 비롯해 다양한 방법을 설계했다.
    관심 있는 사람은 꼭 조사해 주세요.

    끝맺다


    레이저로 선을 몇 개 그려야 해요. 구멍을 많이 뚫어야 해요. 귀찮은 그곳의 당신!
    이 부립엽 반복법으로 얻을 수 있는 CGH를 반드시 사용하여 레이저를 갈라놓으세요!
    그나저나 기계 재료는 없지만 실제로 이런 수법을 해보고 싶은 사람!레이저 3000만 원?SLM은 30만 엔?많이 팔리지 않을 테니 꼭 사 보세요!
    제 책임보도는 여기서 마치겠습니다!
    이 기사를 읽고'재밌었어요','공부했어요'라고 느낀 분들은 가능하면 트위터나 페이스북에 댓글을 달아주시고 옆에 있는 책갈피에 댓글을 남겨주세요!
    또 DeNA 공식 트위터 계정@DeNAxTech에는 블로그 기사뿐 아니라 각종 학습회 등단 자료도 발송됐다.꼭 지켜봐 주세요!

    좋은 웹페이지 즐겨찾기