C#處理醫學影像(四):基於Stitcher演算法拼接人體全景脊柱骨骼影像

喬克灬叔叔發表於2023-05-05

在拍攝脊柱或胸片時,經常會遇到因裝置高度不夠需要分段拍攝的情況,

對於影像科診斷查閱影像時希望將分段影像合併成一張影像,有助於更直觀的觀察病灶,

以下圖為例的兩個分段影像:

     

我們使用OpenCVSharp中的Stitcher類的Stitch方法,匯入兩張影像並拼接:

 但結果卻失敗了,返回錯誤結果:ERR_NEED_MORE_IMGS,是由於醫學影像的特徵點匹配不夠,導致無法確定對接點。

一幅圖中總存在著一些獨特的畫素點,這些點我們可以認為就是這幅圖的特徵,即為特徵點

獲取一幅圖中存在的一些獨特的畫素點,需要解決兩個問題:

  • 解決尺度不變性問題,不同大小的圖片獲取到的特徵是一樣的
  • 提取到的特徵點要穩定,能被精確定位 


 

可參考本系列文章:C#處理醫學影像(三):基於漫水邊界自動選取病灶範圍的實現思路

 

根據演算法原理得到如下結果:

 

Sobel運算元:

根據演算法原理得到如下結果:

 

其中直觀區別是canny運算元計算的結果清晰,但不連續,容易受噪點影響,而sobel運算元線條相對柔和,連續性強。

 

⑤背景降噪

進行一次手動背景降噪,使得展現的無用邊緣更少,結果更清晰:

 

經過上述的一系列處理步驟後我們再次合併拼接:

            Mat srcImg1 = imgList1[0];
                    Mat srcImg2 = imgList1[1];
                  

                    Mat[] images = new Mat[] { srcImg1, srcImg2};

                    Stitcher stitcher = Stitcher.Create(Stitcher.Mode.Panorama);
                    Mat pano = new Mat();
                    var status = stitcher.Stitch(images, pano);
                    if (status != Stitcher.Status.OK)
                    {
                        ShowMsg.Box("拼接異常(" + status.ToString() + "),請重試。", BoxType.Msg, 120, this);
                        return;
                    }

得到了正確的結果:

 

 

相關文章