天天看點

細胞識别圖像處理項目總結

關于圖像處理方面的收獲:

五月中旬的時候接了個細胞檢測的活,要求識别白細胞、紅細胞、脂肪球、黴菌幾種

細胞,大緻看了客戶發給我顯微鏡上的圖檔,發現能做,于是就接了下來,客戶告訴

我最終的程式要是C++的編譯成DLL給他們的應用程式調用才可以,本人因為一直做

Java,做C++還是12年前畢業設計的時候做了圖像相關的東西。從那之後,做項目偶

爾也會搞點C++但是基本上就一直停留在Hello World的水準上。我的想法是先把算法

用Java實作,然後我找人合作幫忙把算法從Java翻譯成C++,經過大概一個月左右的

時間Java版本的算法已經實作,并且用客戶給我的那些測試圖檔資料,發現除了白細

胞識别率有點低,其它的識别都還不錯,基本都在70%左右,而且陰性的檢測準确率

高達96%,已經滿足實際需要。其實做這個識别算法我是基于模闆比對方法,但是唯

一不同的時候我是先找到ROI區域,然後隻對ROI區域去做模闆比對,這樣速度就非常

快,基本滿足了客戶要求。在做這個項目的過程中,自己對一些基礎的問題又有了近

一步的認知,對SMOOTH、先圖像梯度在灰階還是先灰階在梯度的差別都有了新的認

知,發現順序不同差别還是很大的,對圖像二值化、二值圖像的填充、腐蝕與膨脹、

開閉操作、邊緣提取等都更加的熟悉了。同時對霍夫直線檢測、二值圖像的連通區域

查找等算法也有近一步的認識,在特征提取方面自己先後嘗試了LBP、HOG、幾何距

灰階共生矩陣等又溫習和進一步了解應用。通過綜合運用這些知識,基于提取到的模

闆資料、實作了對細胞的快速分類與識别。

關于程式設計方面的收獲:

我在學習圖像處理之初,就下定決心不去依賴任何庫,這樣做有好處也有壞處,好處

就是逼着自己去實作一些常見的圖像處理方法,壞處就工作效率比較低,特别是開始

階段,我在用Java做這些算法的時候也特别注意借鑒ImageJ中的代碼,能直接拿過來

用的,我基本都直接拿過來了,HOG是我自己用Java寫的,因為ImageJ中我沒發現

這個就導緻我的Java算法在翻譯到C++的時候有很多選擇,可以用openCV等開源庫

可以那些API我也沒仔細看,心想找個人幫我翻譯成C++的就好了,不需要任何庫

畢竟我的Java版算法也是我自己實作的,不依賴任何庫,我估計的時間是一周左右

我很幸運的找到一個很好的C++哥們,他也是CSDN的一個熟人,花了兩周晚上的時

間我們把Java的算法轉成C++的了,然後編譯測試通過,改了幾個小問題就發現運作

結果跟Java沒有差别,這個讓我很高興,覺得幫我翻譯C++的哥們太給力了,希望我

們一直合作下去。

         當然這個過程中我們也踩了不少坑,其中最大的一個就是我Java做的算法很多變

量都沒有初始化為0,到了C++上面就悲劇了,還有一些數組也沒有初始化就直接進行

像素或者統計操作,結果也很悲劇,都是很大的坑。費了我們不少精力。其中更有一

個很惡搞的問題,我定義的數字是位元組類型的,結果裡面的資料是INT的,長度就會溢

出,結果就很悲劇。我也學會一些簡單的C++知識,學會用vs2015搞東西,學會了用

CxImage這個庫來讀圖像檔案和像素資料。複活了我一些VC++的知識。我記得我上次

用VC++的時候還是6.0,我這個跨度比較大。項目總結的時候那哥們還給我提幾點建議

這樣方面他把代碼轉到C++。一個很認真的哥們,他的建議:

對以後咱們合作中的Java代碼提兩點建議:

1.定義變量、數組時必須初始化。

2.邏輯層和視圖層分離,算法中隻傳像素數組,

不要有BufferedImage對象及圖像讀定相關的操作,

這些都放到視圖層。對圖像的處理,其實就是對像素的處理。

那麼處理函數的定義其實隻需要傳入一個待處理的像素數組,

傳回一個處理後的結果像素數組。Java定義可以為:

對應的c++定義為

關于我們:

如果能在一起做事情,一定要互相信任,特别是經濟上一定要互相講清楚,隻有這樣

團隊才會互相信任,才有可能一起做更多的事情。要讓客戶看到自己的努力,認可自

己的勞動,成功就不會太遠了。現在我做Java,主攻圖像處理的各種算法,他主攻

C++,我們互相是對方的老師和良師。就在這個項目結束的時候我們又接一個新的圖

像處理的活,希望會一起走的更遠。