细胞识别图像处理项目总结
關(guān)于圖像處理方面的收獲:
五月中旬的時(shí)候接了個(gè)細(xì)胞檢測(cè)的活,要求識(shí)別白細(xì)胞、紅細(xì)胞、脂肪球、霉菌幾種
細(xì)胞,大致看了客戶發(fā)給我顯微鏡上的圖片,發(fā)現(xiàn)能做,于是就接了下來,客戶告訴
我最終的程序要是C++的編譯成DLL給他們的應(yīng)用程序調(diào)用才可以,本人因?yàn)橐恢弊?/span>
Java,做C++還是12年前畢業(yè)設(shè)計(jì)的時(shí)候做了圖像相關(guān)的東西。從那之后,做項(xiàng)目偶
爾也會(huì)搞點(diǎn)C++但是基本上就一直停留在Hello World的水平上。我的想法是先把算法
用Java實(shí)現(xiàn),然后我找人合作幫忙把算法從Java翻譯成C++,經(jīng)過大概一個(gè)月左右的
時(shí)間Java版本的算法已經(jīng)實(shí)現(xiàn),并且用客戶給我的那些測(cè)試圖片數(shù)據(jù),發(fā)現(xiàn)除了白細(xì)
胞識(shí)別率有點(diǎn)低,其它的識(shí)別都還不錯(cuò),基本都在70%左右,而且陰性的檢測(cè)準(zhǔn)確率
高達(dá)96%,已經(jīng)滿足實(shí)際需要。其實(shí)做這個(gè)識(shí)別算法我是基于模板匹配方法,但是唯
一不同的時(shí)候我是先找到ROI區(qū)域,然后只對(duì)ROI區(qū)域去做模板匹配,這樣速度就非常
快,基本滿足了客戶要求。在做這個(gè)項(xiàng)目的過程中,自己對(duì)一些基礎(chǔ)的問題又有了近
一步的認(rèn)知,對(duì)SMOOTH、先圖像梯度在灰度還是先灰度在梯度的區(qū)別都有了新的認(rèn)
知,發(fā)現(xiàn)順序不同差別還是很大的,對(duì)圖像二值化、二值圖像的填充、腐蝕與膨脹、
開閉操作、邊緣提取等都更加的熟悉了。同時(shí)對(duì)霍夫直線檢測(cè)、二值圖像的連通區(qū)域
查找等算法也有近一步的認(rèn)識(shí),在特征提取方面自己先后嘗試了LBP、HOG、幾何距
灰度共生矩陣等又溫習(xí)和進(jìn)一步理解應(yīng)用。通過綜合運(yùn)用這些知識(shí),基于提取到的模
板數(shù)據(jù)、實(shí)現(xiàn)了對(duì)細(xì)胞的快速分類與識(shí)別。
關(guān)于編程方面的收獲:
我在學(xué)習(xí)圖像處理之初,就下定決心不去依賴任何庫(kù),這樣做有好處也有壞處,好處
就是逼著自己去實(shí)現(xiàn)一些常見的圖像處理方法,壞處就工作效率比較低,特別是開始
階段,我在用Java做這些算法的時(shí)候也特別注意借鑒ImageJ中的代碼,能直接拿過來
用的,我基本都直接拿過來了,HOG是我自己用Java寫的,因?yàn)镮mageJ中我沒發(fā)現(xiàn)
這個(gè)就導(dǎo)致我的Java算法在翻譯到C++的時(shí)候有很多選擇,可以用openCV等開源庫(kù)
可以那些API我也沒仔細(xì)看,心想找個(gè)人幫我翻譯成C++的就好了,不需要任何庫(kù)
畢竟我的Java版算法也是我自己實(shí)現(xiàn)的,不依賴任何庫(kù),我估計(jì)的時(shí)間是一周左右
我很幸運(yùn)的找到一個(gè)很好的C++哥們,他也是CSDN的一個(gè)熟人,花了兩周晚上的時(shí)
間我們把Java的算法轉(zhuǎn)成C++的了,然后編譯測(cè)試通過,改了幾個(gè)小問題就發(fā)現(xiàn)運(yùn)行
結(jié)果跟Java沒有差別,這個(gè)讓我很高興,覺得幫我翻譯C++的哥們太給力了,希望我
們一直合作下去。
???????? 當(dāng)然這個(gè)過程中我們也踩了不少坑,其中最大的一個(gè)就是我Java做的算法很多變
量都沒有初始化為0,到了C++上面就悲劇了,還有一些數(shù)組也沒有初始化就直接進(jìn)行
像素或者統(tǒng)計(jì)操作,結(jié)果也很悲劇,都是很大的坑。費(fèi)了我們不少精力。其中更有一
個(gè)很惡搞的問題,我定義的數(shù)字是字節(jié)類型的,結(jié)果里面的數(shù)據(jù)是INT的,長(zhǎng)度就會(huì)溢
出,結(jié)果就很悲劇。我也學(xué)會(huì)一些簡(jiǎn)單的C++知識(shí),學(xué)會(huì)用vs2015搞東西,學(xué)會(huì)了用
CxImage這個(gè)庫(kù)來讀圖像文件和像素?cái)?shù)據(jù)。復(fù)活了我一些VC++的知識(shí)。我記得我上次
用VC++的時(shí)候還是6.0,我這個(gè)跨度比較大。項(xiàng)目總結(jié)的時(shí)候那哥們還給我提幾點(diǎn)建議
這樣方面他把代碼轉(zhuǎn)到C++。一個(gè)很認(rèn)真的哥們,他的建議:
對(duì)以后咱們合作中的Java代碼提兩點(diǎn)建議:
1.定義變量、數(shù)組時(shí)必須初始化。
2.邏輯層和視圖層分離,算法中只傳像素?cái)?shù)組,
不要有BufferedImage對(duì)象及圖像讀定相關(guān)的操作,
這些都放到視圖層。對(duì)圖像的處理,其實(shí)就是對(duì)像素的處理。
那么處理函數(shù)的定義其實(shí)只需要傳入一個(gè)待處理的像素?cái)?shù)組,
返回一個(gè)處理后的結(jié)果像素?cái)?shù)組。Java定義可以為:
public abstract int [] process( int[] pixs,int width, int height);對(duì)應(yīng)的c++定義為
virtual int process (EUINT32 * pSrcPix ,int nSrcW , int nSrcH , EUINT32 *& pDest , int & nDestW , int &nDestH ) = 0;關(guān)于我們:
如果能在一起做事情,一定要相互信任,特別是經(jīng)濟(jì)上一定要相互講清楚,只有這樣
團(tuán)隊(duì)才會(huì)相互信任,才有可能一起做更多的事情。要讓客戶看到自己的努力,認(rèn)可自
己的勞動(dòng),成功就不會(huì)太遠(yuǎn)了。現(xiàn)在我做Java,主攻圖像處理的各種算法,他主攻
C++,我們相互是對(duì)方的老師和良師。就在這個(gè)項(xiàng)目結(jié)束的時(shí)候我們又接一個(gè)新的圖
像處理的活,希望會(huì)一起走的更遠(yuǎn)。
總結(jié)
以上是生活随笔為你收集整理的细胞识别图像处理项目总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SaaS - Export项目】用户登
- 下一篇: mybtisset where tirm