天天看點

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

作者:曆史安利官

文|曆史安利官

編輯|曆史安利官

星體跟蹤子產品主要負責在天文觀測圖像中,尋找一顆适合導星的星體,将其作為目标星,并在後來的每一幀天文相機拍攝的圖像中尋找這一個特定的目标星,記錄其變曆史。

星體跟蹤子產品的輸入是天文相機拍攝的觀測圖像,而對外提供了關于目标星、目标星曆史的相關資訊。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

為了能夠在天文觀測圖像中确定目标星,星體跟蹤的實作分為兩步:

首先,在天文觀測圖像中找到所有星體;

然後,在找到的星體中通過比較找到最适合導星的星體。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

據此可知,星體跟蹤的實作需要兩個功能,即星體尋找和星體評價。

是以,星體跟蹤子產品的實作實際上引用了星體尋找和星體評價子產品。

由于星體評價子產品比較小,而且結構設計與圖像分割等子產品類似。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

星體定位

代理模式,顧名思義就是讓一個類做另一個類的代理,然後代替完成那另一個類的任務。

這樣便需要前者擁有後者的接口,于是,與裝飾類類似,代理類和被代理類共用一個接口以提供相同的功能。

這樣,第三方類就可以通過代理類的接口通路被代理類的資訊,并使用被代理類提供的功能了。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

具體步驟如下:

1.代理類與被代理類實作同一套接口标準;

2.代理類在内部儲存被代理類的引用,并且其統一接口的實作使用儲存的引用調用相應被代理類的方法;

3.第三方類隻與代理類互動,獲得功能實作,與被代理類之間沒有直接聯系。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

這一模式其實R是為被代理類和第三方類之間建立了一個中間通信管道,對于功能的實作本身并沒有任何影響。

其主要作用是隔離開第三方類和被代理類,将它們之間的直接通信或聯系轉化為間接的或者是第三方類和被代理類之間本來就無法進行直接的通信。

此時,釆用代理模式便可提供一個中間類來轉發互動資訊,完成兩者的互動。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

導星算法在子產品之間的組織上參考了實體之間的關系,即讓代表天文望遠鏡的類在内部包含(組合)代表天文相機和代表赤道儀的類對象。

在更上層,實作導星邏輯的導星類會包含代表天文望遠鏡類,于是,導星類便無法與底層的天文相機和赤道儀類進行直接交流。

但是,導星類對于導星邏輯的實作需要使用相機的拍攝、赤道儀的校準,轉動等功能。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

是以,我便讓天文望遠鏡類代理天文相機類和赤道儀類,對導星邏輯的實作提供支援。

采取這種方法,可以讓導星類和代表底層硬體實體的類之間分隔開來,降低之間的耦合度,底層實作的改變就不會對上層實作産生影響,提高了軟體整體的可維護性和可擴充性。

政策模式,這一模式的采用可以讓軟體在運作時,更換功能實作的政策。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

這裡所指的政策代表了實作方式,也就是說,在保持總體邏輯不變的情況下,可以更換局部使用的具體方法。

為了使得這種更換不會影響包含控制邏輯在内的上層調用代碼,同樣的,各個.政策必須維護統一接口。

在此之上,為了能夠進行動态更換,上層使用政策的類就需要儲存一個定義接口的引用,來引用具體的政策實作。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

具體步驟如下:

1.定義政策類的統一接口,讓所有的具體政策類實作這一接口;

2.在使用政策的類中定義政策類的接口引用,并且提供更換政策的接口(setter)

3.使用政策的類可以在運作時建立新的政策,經過更換政策的接口進行更換後,同樣的邏輯就使用了新更換完畢的政策實作。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

政策類的基本思想和多态相似,如果将政策的統一接口定義為虛函數,然後讓使用政策的類根據具體政策分類,派生出相應的子類。

最後,子類按具體政策的實作重寫虛函數便可以得到同樣的結果。

在運作時,隻要用父類的引用指向不同的子類即可。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

然而這種做法卻有以下幾個缺點:

将政策的接口混合在了使用政策類的接口中,使得接口更加複雜;

使用繼承關系将政策分類和使用政策的類緊密的耦合在了一起,政策的修改會影響使用政策類的類結構。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

而反觀政策模式,則是很好的将政策類的結構與使用政策類的結構分了開來,并且采用耦合程度較低的組合方式完成了對政策類的引用和更換。

由此一來,隻要接口不變,政策類的修改便與使用政策類無關,巧妙的斬斷了兩個類的直接關聯。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

導星算法使用政策模式來支援多種共同用途算法的更換,比如完成圖像預處理的算法,可以有高斯去嗓,可以有維納濾波等不同的去嗓算法。

将不同實作但相同用途的算法作為政策,然後導星算法的總邏輯使用這些政策,就可以在算法整體邏輯不變的同時,根據具體的應用場景改變某個部分使用的具體算法,達到更好的效果。

如此一來,導星算法的軟體實作就獲得了更好的靈活性,可擴充性。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

圖像分割

為了在尋找星體時,将星體像素和背景像素區分開來,導星算法的星體定位步驟使用了圖像分割算法。

根據對設計模式的讨論,本文提出的導星算法在設計圖像分割功能實作的結構時,采用了政策模式,并為圖像分割功能定義了一個專門的子產品。

這一子產品大緻由抽象基類的繼承(接口的實作)構成整體結構。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

抽象基類(接口)ImageThresh定義了圖像分割功能的統一接口,将其定義為純虛函數以迫使子類實作具體操作,并利用了C++中的函數調用操作符重載來提高使用的便利性。

具體的圖像分割功能實作即為ImageThresh的子類,對其定義的純虛函數進行具體實作,并根據具體實作使用的算法之間的關系,組織成樹狀的結構。

這樣,使用圖像分割功能的子產品就可以按照政策模式的模闆那樣,對已經實作好的圖像分割具體方法進行調用,以及任意的更換。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

導星算法的軟體實作由于這樣的設計,其靈活性和可擴充性得到了極大的提升

星體定位

星體定位子產品的主要功能就是根據傳入的星體圖像,計算代表整個星體的中心位置。

傳入星體定位子產品的星體圖像是僅僅包含單個星體的一個适當大小的矩形區域,通過對矩形區域中星體像素的考察,星體定位子產品傳回星體中心的位置。

在結構上,與圖像分割子產品類似,星體定位子產品也是被當做了政策模式中的政策一角。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

星體定位子產品定義StarLocator為定義接口的抽象基類,然後具體的星體定位算法由此類的子類來實作。

星體定位類結構和圖像分割類結構非常相似,隻是負責的功能不同,相應的接口不同。

是以,将星體定位子產品獨立出來,同樣有助于提高導星算法軟體實作的靈活性、可擴充性以及可維護性。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

星體過濾

在星體尋找子產品從天文觀測照片中找到星體之後,其數目可能很多,為了能夠從中找出适合導星的目标星體,導星算法引入了星體過濾的功能。

星體過濾的具體實作是通過建構一系列的過濾規則,然後對特定的星體根據規則進行判斷,是保留還是剔除同時,為了增強靈活性,星體過濾子產品中的過濾規則之間需要能夠動态組合,即運作時根據具體環境要求進行調整。

導星算法在實作星體過濾這一子產品時,除了使用接口和繼承之外,為了能夠支援靈活動态的規則組合。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

根據前面的講解,裝飾模式中的結構定義了裝飾類和被裝飾類。

在将此模式運用到星體過濾子產品上時,并沒有發現明顯的裝飾與被裝飾關系,所有過濾規則的地位其實是相同的。

根據裝飾模式的結構在星體過濾規則的實作上做了一些修改,定義了一個預設的過濾規則。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

這一預設的過濾規則直接傳回通過的結果,并且充當裝飾模式中被裝飾類的角色。

如此一來,便可以将其他具體的過濾規則實作為裝飾類。

從裝飾模式的角度來看,為被裝飾類添加新功能就是為整個過濾器添加新的規則,然後将新規則的結果與原有規則的結果,通過布爾運算整合起來。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

星體過濾類定義了StarFilter抽象基類來作為星體過濾子產品的接口。

預設的星體過濾規則繼承了此抽象基類,并實作其過濾接口方法filterStar。

然後,通過從StarFilter接口中派生出一個裝飾器類的抽象基類,裝飾器的基本功能得到實作。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

最後,隻要根據具體過濾規則的要求,繼承裝飾器類,實作過濾接口,即可完成裝飾器類的實作。

由于星體過濾子產品使用了裝飾器模式,具體的過濾器在構造時與一般的類對象的構造之間有些差別。

構造時需要一步一步建立獨立的過濾規則,然後再将它們整合起來。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

具體步驟如下:

1.建構預設的過濾規則;

2.一步一步将具體的過濾規則建構起來,設定好相應的參數;

3.使用裝飾器類的設定方法或構造函數,将被裝飾器類的引用儲存入裝飾器類;

4.使用最後結合完成的裝飾器類來過濾星體,即可達到過濾規則結合的目的。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

在裝飾器模式的幫助下,星體過濾的規則可以在程式運作時進行動态調整,如增減規則,調整規則的參數等操作。

如果使用普通的接口和繼承方式,那麼不止是各個獨立的規則需要建立一個類來實作過濾,每種可能的規則組合要在程式運作時能夠調整,就需要為每種組合來定義一個新的類,并實作星體過濾接口。

這是一個很大的工作量,特别是當星體過濾規則需要新增規則時。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

由此可以看出,使用裝飾器模式,不僅将規則的結合和調整機會延伸到了運作時,更為規則實作的變更建構了一個抽象隔離,這極大地提高了導星算法程式實作的靈活性和可擴充性。

星體尋找星體尋找子產品的任務是,在天文圖檔中找出其中存在的星體,并根據星體圖像計算能夠代表星體的中心位置。

與圖像分割子產品類似,星體尋找定義了StarFinder抽象基類來定義接口。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

接口同樣以純虛函數fmdStars的形式定義,具體的尋找算法會對這一接口進行實作不過,同樣作為政策摸式使用的一環,星體尋找子產品不僅處于圖像分割子產品所代表的政策角度,即向更上層的子產品提供尋找星體功能的實作,還是使用政策的一方。

星體尋找子產品引用了之前提到的圖像分割、星體過濾以及星體定位子產品,即采用了圖像分割、星體過濾以及星體定位的政策來完成星體尋找的功能。

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

根據政策模式的設計思路,星體尋找類StarFinder在構造時引入了對圖像分割、星體過濾、星體定位子產品接口類的引用,并且也提供了設定接口以友善更換具體的實作子類。

這些引用會指向具體的政策實作,作為使用方,StarFinder類的子類隻需要直接調用上述引用子產品定義的接口即可。

而不用關心具體實作的是哪一個算法,上述引用子產品中具體算法實作的更改也不會影響到星體尋找子產品。

參考文獻

天文導星的各類模式,使用與工作狀态,接口之間的互相轉接資訊

繼續閱讀