2024年8月19日

使用python影像處理2024英仙座流星雨直播影片,獲取流星雨片段、星空疊圖與人造衛星軌跡

 前幾天臺北天文館的YT頻道有一個直播影片是2024英仙座流星雨,讓民眾可以看著YT直播享受流星雨。直播長度六小時,真的有人可以跟完嗎?
https://www.youtube.com/live/2sjlviZZB94?si=bJSe23PGgeb-XZMt

本來影片直播是用福壽山農場的,但是天候不佳改用北海道的なよろ市立天文台的來源

https://www.youtube.com/live/yC_cQYkoBRA?si=wVoUfYFyHtp78vgO


我看到這個影片覺得很適合用影像處理的方式來獲取一些資訊

什麼時候有流星?

幾年前我用自家擺設的定點攝影曾經作過偵測流星的程式,現在用同樣方式再來試試看。

由於直播影片太長,影片容量很大,所以就不採用下載後再分析的方法,改用串流方式,一邊串流,一邊分析。frame都轉灰階,再把當前的frame減去前一個frame之後,如果得到的結果中的最大值大於某個閾值時,那就是代表有亮亮的東西出現了,然後就把現在的frame存起來,之後再轉存成影片,或是進行疊圖。

本來是想把整段影片都處理,不過後來看到留言裡有人紀錄了流星出現的timestamp,我就使用那些timestamp的十秒內來抓流星。

以下就是2024英仙座流星雨的集錦影片


將有流星的frame疊圖,方法是留下每一個影像的最大值,最後再經過調整曲線之後得到的組圖如下,星軌不連續,是因為是把有流星的片段疊圖在一起。


在看直播影片時,如果仔細看,應該會發現畫面上有許多小亮點緩慢規律的移動,而且在那影片裡切到任一個時間點,都可以看到那些小亮點,想想應該是人造衛星。

於是想來用影像處理的方式處理出人造衛星的軌跡。概念上就等同於重複曝光,方法就是取一段時間內的所有frame中的最大值。

由於臺北天文館的影片中會部份片段切換片源,所以我改採用weathernews的影片來影像處理

https://www.youtube.com/live/yC_cQYkoBRA?si=wVoUfYFyHtp78vgO

以下這個影片就是呈現在整段七小時的影片裡,每10秒鐘的重複曝光成為一個新frame製作出的影片。

注意幾個特點

  1. 那些呈現直線運動的線段,就是衛星留下的軌跡,軌跡越長代表速度越快。
  2. 任意暫停呈現的畫面所呈現的線條數量,代表的就是在那個時間點的那塊天空裡,至少就有幾顆人造衛星。
  3. 不規則移動的軌跡通常是昆蟲飛過鏡頭留下的,不是UFO


如果想在夜空觀察人造衛星,可以先找到北極星之後,然後在那附近尋找。從影片中應該可以發現這些人造衛星的軌跡,都在靠近北極星附近。這些衛星就是繞極軌道衛星(polar orbiting satellite)


我先疊個5分鐘影片來說明,在影片中緩慢移動的亮點,若是疊成圖,就可以看到其規律的軌跡,在下圖的近乎直線的線段就是人造衛星的軌跡。而少部份由左上到右下的短線段則是流星。而星軌則因為只有5分鐘疊圖,所以只有短短的位移。



最後把整段影片都疊起來觀察,下圖經過曲線調整。



  1. 呈現同心圓的線條是恆星的星軌
  2. 接近水平直線的線段,以及少數在畫面左邊接近垂直的線段是繞極軌道的人造衛星,它們都靠近同心圓的圓心。
  3. 小段的由右上到左下的線段則是流星
  4. 其餘不規則的線段都是蟲

從這張圖更可以看到那些人造衛星的繞極軌道是怎麼一回事,另外朝向北極星是不是再也拍不到沒有人造衛星的天空了?

2024年7月31日

生物組成層次的2048Game

 


2048這款經典遊戲應該不陌生吧?這是生物組成層次的版本,看看你是否可以從細胞一路組成生物圈?

一年前一位學生拿了這個遊戲,跟我說「老師你弄這個遊戲來給我玩啦」,因為當時我經常讓學生在課堂上使用我自製的許多教學遊戲,見此玩遊戲學生物連結

我說「好,我試試看」,但其實後來再也沒有試過。

直到前一陣子,我看到許多不會寫程式的朋友在分享著他們的發現,原來他們可以用AI生成技術寫出自己想要的教學小程式,隔天我在營隊上課前等待的時間,就想那我也來試試看吧。於是就用claude和chatgpt交互使用,果然一下子就做出來了。

只是需求是不斷更迭的,所以並不是直接就達到100%的效果,後面還是要花一些時間修改,花了一段時間,總算處理好在iOS上有卷軸滾動的問題,可以公開發表了。


最後是這樣解決的,在body的css設定 overscroll-behavior: none; 

而在遊戲的div上設定 overscroll-behavior: contain;

2024年6月4日

捉放法要標記多少才會準確?用js程式進行模擬

 你有沒有好奇過進行捉放法的活動時,到底要標記多少才會準確啊?

為了解答這個疑惑,我就寫了一支程式來模擬看看吧。

https://chihhsiangchien.github.io/capture-recapture-inquiry/index.html


輸入參數有三項:族群實際數目、取樣次數、取樣大小,按下執行的按鈕之後,

程式自動會進行捉放法,假設族群實際數目有200隻,取樣5次,取樣大小50的設定,那麼就會先進行標記1隻的情況,一共做了5次捉放法,每次取樣都抓50隻來估計族群大小。然後再做標記2隻的情況、標記3隻的情況,一直到標記200隻的情況。

做出來的結果就如第一張圖,標記數量太少,越容易低估或高估。舉例來說明明族群有200隻,但是你標記1隻後,取樣50隻發現有1隻做標記,就會估算出族群數量為50隻。或是當標記20隻,但是你取樣50隻,只有1隻作記號,那麼就會估算成1000隻。從下圖可以見到大概在標記60隻以下經常會看到估算過高或過低的情形,你也許會認為那就只要標記實際族群的某個比例就可以算準了,但是那前提是你得先知道實際族群是多少。你都已經知道實際族群了,何需再用捉放法呢?

所以第一張圖頂多就是讓你知道標記要多一些,才會比較準。




接下來第二和第三張圖,是用平均數來估計族群大小,比方說取樣5次做平均。右邊那張圖的縱座標是對數顯示

第四和第五張圖則是用中位數來估計

最後一張圖則是同時將平均數的估計數和中位數的估計數放在一起比較。以預設的參數來進行模擬,會發現這種情況的中位數的估計誤差在多數的情況都比平均數來得小,因為標記數目太小容易產生極端值,而這正是中位數可以避免這樣的情況。



2024年5月30日

捉放法的互動程式

 

https://chihhsiangchien.github.io/markRelease/index.html

其實捉放法的互動程式,早就有人寫了,請見線上捉放法的模擬

只是我在使用上有時候有一些需求是別人程式無法滿足的,於是前兩天就趁著有空寫一支出來給自己用,基本架構就是參考virtualbiologylab的,所以內部程式的變數也是設定成池塘裡捕捉蝌蚪,放在魚缸裡標記。

這隻程式有幾個特點:
  1. 每次出現的蝌蚪總數是隨機的,在1000~2000之間
  2. 把捉放法的三個關鍵按鈕放在一起:捕捉、標記、釋放,比較能夠說明講解
  3. 可以輸入自己推測的總數答案,提交答案後系統自動算出誤差百分比。而提交答案後系統會自動重置蝌蚪數量。
  4. 捕捉的邏輯是隨機的,每一隻的被捕獲率預設是1%。每次採樣大概會抓個十多隻,採樣的極限是100隻,這可以避免學生用採樣把所有綠點都抓起來。

2024年5月7日

畫一棵碎形樹

 最近上一個資訊課程,上課的涂老師讓我們做了一個很有趣的活動,我覺得值得紀錄。

首先他在校園裡摘了一個約50cm長的帶葉枝條,接著讓大家猜測這個枝條上的葉子有多少片。待大家都猜測一輪之後,開始讓大家分這段枝條,然後合作把整個枝條的葉子都算出來!

我覺得真是太酷了,我從來沒有仔細算過一條枝條有多少葉子啊,印象中那個枝條的葉子有2千多片。

接著老師講解如何畫一棵科學樹,讓大家也試著畫看看。規則是在「一個分支上畫三個分支,一個是延伸原枝條,另兩個是左邊和右邊各延伸一條」,不斷重複這樣的規則。最後在每一個分支畫上葉子就好了。

第一輪會有3個枝條

第二輪在本來的3個枝條上,各畫3個枝條,所以共有 3^2個枝條

第三輪在本來的3^2個枝條上,各畫3個枝條,所以共有 3^3個枝條

若是畫了五輪,就有3^5 = 243 個枝條

在每個枝條的末端都畫一片葉子,所以就會有 729片葉子了。


我覺得這真的也很瘋耶(讚許)
畫碎形樹這種事,怎麼想都不會是手動完成啊。

我覺得這很有趣,於是就用js寫一個網頁程式來畫畫程式的碎形樹

將許多變數變成可以手動調整的,就可以畫出完全不同的樹了







2024年3月28日

客觀評估硫代硫酸鈉與鹽酸的反應速率實驗終點的模組

學校裡的理化老師經常跟我討論一個問題,他們在帶領學生進行硫代硫酸鈉與鹽酸的反應時,經常有一個困擾是無法客觀評估反應終點。反應進行時會逐漸生成奈米硫的沉澱物,當沉澱物增加到一定程度時,就會遮住燒杯底下的黑十字,學生必須計時從開始反應到遮住十字的經過時間,但是什麼時候稱為「遮住」,這就無法客觀了。

也因此,有許多的科展作品都用了光學儀器去測量這個反應,當然也都得到了很好的結果。只是如果是要在實驗室,多組學生同時操作時,儀器的簡化和操作便利性就必須列入考量了。

一開始同事希望使用Arduino來進行測量,這當然可以,不只可以計時,還可以設計亮光或聲響來提示進行過程。只是當儀器有許多按鈕和接線時,在實際在課堂上進行實驗時,就會產生許多干擾因素,像是學生忘記怎麼按鈕,某個接線脫落時要如何接回正確位置。

一開始我幫忙設計的感測電路是使用紅外線LED和光電電晶體,紅外線對著溶液照射,當沉澱物增加時,反射的紅外線就會增加,然後你只要測量光電晶體的電壓改變就好,只是當零件太多時,就更難讓學生使用了。

怎麼改進呢?後來想起,市面早有這樣的商品化模組可以使用,就是用在自走車上的紅外線循跡模組呀,這類型模組也會用在像碎紙機的感應紙張自動啟動。

模組上就有紅外線發射LED和接收的光電晶體,你只要接上3V電池,把它對著溶液就可以。當溶液的沉澱物增加到一定程度時,光電晶體接受反射的紅外線到某一個程度時,模組上有一個LED就會亮起。

當你要讓學生進行小組內的實驗時,你根本不用管那個「沉澱物的濃度」是多少,因為你使用的是同樣一組感測裝置,不管你是改變反應溫度、反應物濃度等,反正燈亮起來的時候,就是濃度到了那個特定濃度了,你只要確定每次感測時,你的感測模組和燒杯的距離都是一樣的就行了。

至於那個「濃度」是多少,有沒有辦法量化呢?使得全班都測量同一個反應濃度呢?也是可以的。這就要認識一下模組上的腳,此外,你也需要使用三用電表。

1.模組上有一個微調電阻,你可以轉動它,使模組在濃一點的濃度時候才亮,或是稀一點時就亮。

2.模組的接腳有兩種類型,一種是三隻接腳,分別是VCC、GND、OUT。另一種是四隻接腳,分別是VCC、GND、D0和A0。

VCC和GND就是供電用的,一般工作電壓是3.3V-5V,通常用3V電池就可以工作。至於三隻接腳的OUT或四隻接腳的D0其實是一樣的,就是輸出0或1,你可以再跟聲音的模組接在一起,當那個特定濃度到達時的時候,OUT或D0就會輸出1,使得聲音模組叫出來。

至於四隻腳模組的A0,你可以接上三用電表或是伏特計,直接看到感測過程中A0輸出的電壓變化,使用過程中記得要讓電表和模組共地,這樣你就可以在設定在什麼特定電壓時,模組就會亮起來。

如果你想要搭配上Arduino或是micro:bit進行其他開發應用,反正已經可以輸出電壓了,當然後續也都可以做了。


實際使用這項裝置時,只要把模組裝上麵包版,再接上電池盒的線就好了。


確保模組感測的位置是在溶液液面下,實驗進行時,你只要注意模組的燈什麼時候亮起就可以。附帶一提的是,模組上面通常有兩個燈,一個是電源指示燈,插上電就可以用,另外一顆才是你要注意的燈。


2024年1月19日

測量橫膈活動度

寫這一篇你的呼吸模式正確嗎?測量你的呼吸活動範圍之後,課程來到呼吸運動了,於是就讓學生測量看看「胸腹呼吸靈活度」。

一開始,我先按照書裡的計算方式,發下皮尺,讓學生們量吸氣和吐氣的圍長,然後相減之後除以吐氣圍長在乘上1000,結果發現課程進行的難度意外的高。

發生什麼問題呢?
1. 學生不會用皮尺,他們會把皮尺兩端拉得長長的, 然後不知道怎麼看刻度。
2. 找不到肋骨在哪裡,摸到髂骨去了。
3. 不會用計算機

於是我邊教邊改,換成以下的作法,順利很多。
  1. 發下皮尺,先教怎麼測量手腕圍度,請學生做出測量的動作,讓我檢查。
  2. 示範錯誤的測量方式:例如皮尺兩端拉長長的,還有測量成胸圍和腰圍。
  3. 坐下測量胸腔底部擴張量,也就是紀錄吸氣圍長和吐氣圍長。
  4. 計算時,只計算吸氣和吐氣的圍長差就好,但是講這樣學生還是不懂,所以就講大數字減掉小數字的差距。雖然除以吐氣圍長是有其意義的,不過我們就看差距就好了。

學生們都很意外,怎麼自己吸氣時,胸腔底部的擴張量這麼小,大多數就只有2-3公分。


 

接著請學生駝背含胸再測量一次,如果不明白這樣的姿勢,那就是低頭滑手機的姿勢啦。大多數人用這樣的姿勢測量時會發現擴張量變得更小,也就是很難進行水平呼吸,這樣產生的結果就是換氣量減少。其實也有很多學生發現怎麼自己駝背的測量和剛剛一開始的測量量都一樣,喔,那看來就是平時坐姿就已經不良了。

接著在站立測量一次,想像吸氣時把氣灌進肚子裡讓肚子變大,通常這樣的姿勢就可以讓擴張量變大一點。

安排這樣的活動,我是期待學生可以先看到自己的問題,然後有意識的去改變自己的行為和姿勢,100個當中有1個會改就好了。