版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
-.z.數(shù)字圖像處理課程設(shè)計(jì)報(bào)告細(xì)胞識(shí)別目錄第一部分實(shí)驗(yàn)課題名稱----------------------------------------------------------------------------------3實(shí)驗(yàn)?zāi)康?---------------------------------------------------------------------------------------3實(shí)驗(yàn)內(nèi)容概要----------------------------------------------------------------------------------3第二部分建立工程文件----------------------------------------------------------------------------------3圖像信息獲取----------------------------------------------------------------------------------4如何建立下拉菜單----------------------------------------------------------------------------6標(biāo)記Mark點(diǎn)------------------------------------------------------------------------------------6二值化---------------------------------------------------------------------------------------------9填洞------------------------------------------------------------------------------------------------9收縮------------------------------------------------------------------------------------------------10獲取中心點(diǎn)--------------------------------------------------------------------------------------11細(xì)胞計(jì)數(shù)-----------------------------------------------------------------------------------------13All-steps-----------------------------------------------------------------------------------------13擴(kuò)展功能---------------------------------------------------------------------------------------14第三部分12、各步驟結(jié)果和錯(cuò)誤舉例--------------------------------------------------------------------16第四部分13、心得體會(huì)----------------------------------------------------------------------------------------22第一部分1、實(shí)驗(yàn)課題:細(xì)胞識(shí)別2、實(shí)驗(yàn)?zāi)康模簩?duì)血液細(xì)胞切片圖片進(jìn)行各種處理,最終得出細(xì)胞的數(shù)目、面積等信息。3、實(shí)驗(yàn)內(nèi)容概要:基于VC++6.0軟件下的細(xì)胞識(shí)別,通過細(xì)胞的標(biāo)記、二值化、填洞、收縮、獲取中心點(diǎn)、計(jì)數(shù)等過程完成實(shí)驗(yàn)?zāi)康?。第二部分——?shí)驗(yàn)具體步驟1、建立工程文件新建MFC工程項(xiàng)目:--MFCAppWizard、工程名拷貝cdib.h,cdib.cpp到工程文件夾,再向工程里添加doc.h添加變量:m_lpDib和頭文件*include”cdib.h”doc.cpp:變量(m_lpDib)的new、deletedoc.cpp:Serialize()2、圖像信息獲取讀取圖像參數(shù)View.cpp:OnDraw()m_pDib->Draw()如果圖像不為空的話,則就執(zhí)行如下主要代碼:點(diǎn)擊鍵,建立類向?qū)В趍essages中添加OnInitialUpdate()函數(shù),添加代碼實(shí)現(xiàn)對(duì)自動(dòng)打開固定圖片。通過鼠標(biāo)右擊,點(diǎn)擊建立類向?qū)?,在messages中添加OnMouseMove()函數(shù),添加代碼實(shí)現(xiàn)獲取所要信息,即實(shí)現(xiàn)鼠標(biāo)在圖像任一位置移動(dòng)時(shí)可以直觀的讀取相對(duì)應(yīng)位置的信息??梢栽谄聊簧巷@示鼠標(biāo)所指點(diǎn)的坐標(biāo)以及RGB、HSI和灰度值,通過HSI的可以選取合適的閾值來找到細(xì)胞以及邊界。為了RGB圖像轉(zhuǎn)化為人眼更容易識(shí)別的HSI模型,我們可以通過添加成員函數(shù)RgbtoHsi來實(shí)現(xiàn)這一功能。HSI模型與RGB模型的轉(zhuǎn)化關(guān)系(添加函數(shù)時(shí),可以右擊類窗口中的view.h,選中addmemberfunction,之后選擇函數(shù)的返回值類型和函數(shù)描述,其它默認(rèn)不變)確定后在里面添加實(shí)現(xiàn)函數(shù)功能的代碼。添加下拉菜單在resourceview那欄的找到菜單按鍵設(shè)置雙擊,后在里面添加所需按鍵每個(gè)按鍵的ID號(hào)為注意在填寫為IDR_加菜單大寫。之后右擊按鍵,建立類向?qū)砑影存I所需函數(shù)4、標(biāo)記mark分為四步找出mark(red)點(diǎn)和maybemark(blue)點(diǎn)將maybemark(blue)點(diǎn)變成mark(blackred)點(diǎn)將mark(blackred)點(diǎn)變成edge(yellow(fullred&&fullgreen))點(diǎn)edge點(diǎn)濾波基本思想:Mark點(diǎn)指的是我們要尋找的細(xì)胞內(nèi)的點(diǎn)。我們先獲取每一個(gè)像素點(diǎn)的RGB分量,然后我們將其轉(zhuǎn)化成HSI分量,將H分量進(jìn)行歸一化,因?yàn)镾的*圍是0到1,所以我們要進(jìn)行尺度的一致,這樣才具有可計(jì)算性。然后我們通過每個(gè)像素點(diǎn)的H分量和S分量的值與細(xì)胞內(nèi)部的H分量和S分量計(jì)算歐幾里得距離,設(shè)定一個(gè)Mark門限值(我們這里將MarkDoor設(shè)置為0.09,大家可以行設(shè)置合適的參數(shù)),小于這個(gè)門限值我們就當(dāng)做是細(xì)胞的內(nèi)部,然后對(duì)細(xì)胞進(jìn)行標(biāo)記(Red)。還需要設(shè)定一個(gè)MaybeMark門限值(我們這里將MaybeMarkDoor設(shè)置為0.15,大家可以行設(shè)置合適的參數(shù)),我們大于Mark門限值小于MaybeMark門限值時(shí),我們暫時(shí)看成是細(xì)胞,我們進(jìn)行MaybeMark的標(biāo)記(Blue)。否則的話,我們需要考慮,一些不是Mark和MaybeMark點(diǎn)的*lpSrc==0我們區(qū)別一下賦值為1,*lpSrc==255我們區(qū)別一下賦值為254,*(lpSrc+1)==255我們區(qū)別一下賦值為254.這樣的話,我們?cè)诤竺媾袛嗍欠駷镸ark點(diǎn)的時(shí)候,我們只需要判斷*lpSrc是否為0就可以了,判斷MaybeMark點(diǎn)時(shí)只需要判斷*(lpSrc)是否為255就可以了。對(duì)于邊緣的判斷只需要判斷*(lpSrc+1)是否為255就可以了。將細(xì)胞標(biāo)記為Mark用紅色(255,0,0)標(biāo)記出來,將可能是的細(xì)胞標(biāo)記為MayBeMark用藍(lán)色(0,0,255)標(biāo)記出來。將MayBeMarkToMark的區(qū)域用亮紅(128,0,0)表示,將不可能是細(xì)胞的區(qū)域、細(xì)胞邊界分別用綠色標(biāo)記出來。操作過程:根據(jù)H、S的歐幾里得距離sqrt(s2+h2)來大致的確定哪些是細(xì)胞(Mark)和可能是細(xì)胞(MaybeMark)的點(diǎn)。根據(jù)MaybeMark點(diǎn)周圍的情況,如果它的上下左右四個(gè)方向有Mark點(diǎn),則將MaybeMark點(diǎn)變成Mark點(diǎn)。用Sobel算子來做邊緣的提取邊界(0,255,255)(255,255,0),使用3*3的模板,使用歐幾里得距離來判斷是否為邊緣。兩種Sobel算子如下:主要代碼如下:doubletmp1=pi*el[0]+2*pi*el[1]+pi*el[2]-pi*el[6]-2*pi*el[7]-pi*el[8];doubletmp2=pi*el[0]+2*pi*el[3]+pi*el[6]-pi*el[2]-2*pi*el[5]-pi*el[8];doubleedge=sqrt(tmp1*tmp1+tmp2*tmp2); if(edge>edgeDoor) *(lpDst+1)=255;//Sobel判斷該點(diǎn)是否edge//edgeDoor=40edge濾波就是去除全邊緣點(diǎn)(四周都是背景或邊緣)(強(qiáng)度為5)5、二值化基本思想:將原有彩色圖像變換為二值圖像,其中細(xì)胞0*80(128)用Gray(灰色)標(biāo)記出來,邊緣0*F0(240)用Bright(亮色)標(biāo)記出來,其他表示為0。主要代碼:填洞將細(xì)胞中或者細(xì)胞相鄰的地方的較小的背景填成細(xì)胞的背景,填完的細(xì)胞背景的灰度值是129,因?yàn)槎急辉L問過了,然后將邊緣去掉。填洞的基本思想:首先將細(xì)胞或邊緣內(nèi)的黑點(diǎn)置為vistied=0*01 ,以該黑點(diǎn)為中心,在其上下左右側(cè)進(jìn)行訪問是否有未訪問的黑點(diǎn),若有則將上方黑點(diǎn)壓棧,且上下左右側(cè)的黑點(diǎn)置已訪問。將堆棧頂端的數(shù)據(jù)彈出,作為新的種子進(jìn)行擴(kuò)散,即以該元素為基點(diǎn),判斷其周圍是否存在未訪問黑點(diǎn),若有則繼續(xù)壓棧,重復(fù)操作。直到找到最后一點(diǎn),此點(diǎn)四周均不存在未訪問黑點(diǎn),結(jié)束訪問。若洞像素?cái)?shù)小于100大于50,洞內(nèi)像素?cái)?shù)及其初進(jìn)棧的點(diǎn)(56,(409,222))時(shí),則進(jìn)行填洞。填洞的過程就是將非mark點(diǎn)轉(zhuǎn)化為mark點(diǎn)。主要標(biāo)記訪問代碼:填洞函數(shù)主要代碼分析:填完洞后,進(jìn)行下面操作:如果圖像中只有已訪問黑點(diǎn)0*01則將其恢復(fù)成0;如果圖像中只有Edge點(diǎn)0*f0則將Edge置為黑點(diǎn)。這樣圖像中只有黑色的背景以及灰色的細(xì)胞mark(0*80)點(diǎn)。主要代碼:7、收縮收縮的目的是為了方便計(jì)數(shù)。通過掃描圖像,對(duì)圖像進(jìn)行預(yù)先的3次腐蝕,判斷所生成邊界點(diǎn),然后根據(jù)原理判定是否標(biāo)注該點(diǎn),存放所標(biāo)志的中心點(diǎn),便于統(tǒng)計(jì)細(xì)胞個(gè)數(shù)及計(jì)算細(xì)胞半徑。由Mark生成邊界,我們有四鄰域生成邊界和八鄰域生成邊界。判斷該點(diǎn)是否為Mark點(diǎn),如果是Mark點(diǎn)的話,我們判斷i、j是否是我們選取圖片的邊界,如果是的話,我們將該點(diǎn)變成邊緣點(diǎn),否則我們判斷它的上下左右(周圍八個(gè)點(diǎn))是否有非Mark點(diǎn),如有有,則將這邊變成邊緣點(diǎn),反之,不變。8鄰域收縮操作代碼(4鄰域與8鄰域思想相同):8、獲取中心點(diǎn)根據(jù)前面所作工作統(tǒng)計(jì)獲得的中心點(diǎn)個(gè)數(shù),去掉一系列不符合要求的點(diǎn)得出最終的細(xì)胞個(gè)數(shù)、細(xì)胞的平均半徑和平均面積,用對(duì)話框輸出統(tǒng)計(jì)結(jié)果。操作過程如下:首先我們要去除訪問標(biāo)志,是我們先前一次在判斷是否需要保存點(diǎn)的時(shí)候(MarkIt(inti,intj)),我們將邊緣點(diǎn)都標(biāo)記成訪問過了,這時(shí)在處理下一次遍歷圖片發(fā)現(xiàn)中心點(diǎn)的時(shí)候,我們要進(jìn)行判斷點(diǎn)是否要保存就沒有辦法做了,所以在沒進(jìn)行一次圖片的遍歷之前我們都需要去除訪問標(biāo)志。主要代碼:*lpSrc&=NO_VISITED;//0*fe//清除visited標(biāo)志最后位置0操作需要判斷是否是邊界以外的點(diǎn),這里我們只處理邊界內(nèi)部的點(diǎn),對(duì)于邊界外部的點(diǎn)不加以查找中心點(diǎn)。對(duì)于內(nèi)部的點(diǎn),我們先要判斷是否是孤立的邊緣點(diǎn),即判斷該邊緣點(diǎn)的上下左右四個(gè)點(diǎn)都不是Mark點(diǎn)和邊緣點(diǎn)我們認(rèn)為是孤立的邊緣點(diǎn),但是我們?cè)谶@里也要去除半徑不大于2的孤立點(diǎn),因?yàn)槲覀冋J(rèn)為它的半徑太小,是噪聲。如果是半徑大于2的孤立點(diǎn),我們對(duì)他進(jìn)行標(biāo)記成中心點(diǎn),對(duì)半徑做一點(diǎn)補(bǔ)償(pt.radius=k+pre_shrink_count+4,4為補(bǔ)償)。然后在入隊(duì)。主要代碼如下: { if(k<3)//如果進(jìn)行第一次收縮即消失的點(diǎn)則認(rèn)為該點(diǎn)是噪點(diǎn),不進(jìn)行保存直接進(jìn)行下一次收縮 continue; //孤立的點(diǎn) *lpSrc|=CENTERED;//0*2對(duì)孤立點(diǎn)加上中心點(diǎn)標(biāo)志0*f2//后面shrink時(shí)為0*02 //保存一下CENTER_POINT信息(圓心,半徑) pt.*=i; pt.y=j; pt.radius=k+pre_shrink_count+4;//+4放大補(bǔ)償,k為把此圓收縮到一點(diǎn)所經(jīng)歷的收縮次數(shù) points_temp.push_back(pt); continue; }需要判斷是否需要保存該點(diǎn),我們?cè)谂袛嗨纳舷伦笥沂欠裼袥]有訪問過的邊緣點(diǎn),這里我們運(yùn)用遞歸函數(shù)來找相連通的邊緣點(diǎn),如果是全邊緣點(diǎn)的時(shí)候我們就需要保存,即將m_bFullEdge=1。在保存的函數(shù)中我們將該點(diǎn)變成中心點(diǎn),然后半徑補(bǔ)償然后我們來對(duì)該點(diǎn)入隊(duì)(保存),然后將該點(diǎn)設(shè)置成沒有訪問過的點(diǎn),因?yàn)橄旅嬖谧鲈擖c(diǎn)的上下左右是否為訪問過的,訪問過才保存,因?yàn)檫@個(gè)點(diǎn)已經(jīng)保存過了,所以要將保存過的點(diǎn)設(shè)置成沒有訪問過,我們必須將這點(diǎn)變成沒有訪問過。然后判斷該點(diǎn)的周圍八點(diǎn)是否是訪問過的,如果訪問過就保存該點(diǎn),這里也是運(yùn)用遞歸函數(shù)來實(shí)現(xiàn)的。對(duì)中心點(diǎn)處理:獨(dú)立的中心點(diǎn)直接存儲(chǔ)相鄰的中心點(diǎn)通過遞歸求質(zhì)心作為圓心,最大半徑作為新的半徑,合并各中心為一點(diǎn)主要代碼如下: pt.*=tot_*/tot_num;//質(zhì)心 pt.y=tot_y/tot_num; pt.radius=ma*_radius;//取最大半徑作為質(zhì)點(diǎn)中心點(diǎn)半徑 *(lpSrc-(pt.y-j)*lLineBytes+pt.*-i)|=CENTERED;//質(zhì)點(diǎn)置為中心點(diǎn) points.push_back(pt);c)相近但不相鄰的點(diǎn),求質(zhì)心為圓心,最大半徑為半徑(直到無相近點(diǎn))主要代碼如下: if(abs(*0-*)+abs(y0-y)<10)//相近 { /*pt=points.at(j); if(points.at(i).radius<points.at(j).radius) pt=points.at(i);*/ points.at(i).*=(*+*0)/2;//取均值,保存最大半徑 points.at(i).y=(y+y0)/2; points.at(i).radius=ma*(points.at(i).radius,points.at(j).radius)+4; pt=pt=points.at(i);d)在無相近點(diǎn)的情況下,若半徑小于8,則刪除。主要代碼如下: if(bdelete) { msg.Format("去掉潛在的錯(cuò)誤(圓r<8Redpen)后數(shù)目=%d",m_vCenterPoints.size()); MessageBo*(msg); }e)兩圓相交,若其中一圓非相交部分面積小于50%,則刪除主要代碼如下: if(total<Pi*r0*r0*0.5)//所有的圓都不相交的部分的面積<圓面積的50%,刪除 CENTER_POINTcenterp; centerp=m_vCenterPoints.at(i);細(xì)胞計(jì)數(shù)打開我們處理前的圖片,根據(jù)前面保存中心點(diǎn)的隊(duì)列,我們知道中心點(diǎn)的位置和細(xì)胞的半徑,然后我們重新的導(dǎo)入細(xì)胞的圖片,在上面畫圓,標(biāo)出細(xì)胞。然后我們獲取細(xì)胞內(nèi)部的HSI的最大值和最小值,計(jì)算出細(xì)胞的平均面積和個(gè)數(shù)。主要代碼如下:msg.Format("共有%d個(gè)細(xì)胞,平均半徑%d,平均面積%d:H(%3.1f,%3.1f)S(%3.2f,%3.2f)I(%3.2f,%3.2f)",m_vCenterPoints.size(),(int)(totr/m_vCenterPoints.size()+.5),(int)(tota/m_vCenterPoints.size()+.5),360.0*min[0]/255.0,360.0*ma*[0]/255.0,1.0*min[1]/255.0,1.0*ma*[1]/255.0,1.0*min[2]/255.0,1.0*ma*[2]/255.0);10、All-steps可以一次性實(shí)現(xiàn)細(xì)胞識(shí)別的所有操作步驟設(shè)置控制按鍵的權(quán)限,點(diǎn)擊update_mand_ui,鍵入控制條件每步操作時(shí)給cellprocess設(shè)置不同數(shù)值,表示那步進(jìn)行過,只能進(jìn)行規(guī)定的下步操作,從而在運(yùn)行過程中放置按鍵誤觸導(dǎo)致程序崩潰。11、擴(kuò)展:區(qū)域選擇:建立類向?qū)В篛nButtonDown和OnButtonUp鍵入代碼:在OnDraw中添加下列代碼注意:bool變量m_bDrag要定義在view.cpp文件頭部,定義在view.h會(huì)出現(xiàn)第一次區(qū)域選擇時(shí)出現(xiàn)錯(cuò)誤。添加復(fù)位按鍵:點(diǎn)擊該鍵后會(huì)重新讀取圖像(和圖像自動(dòng)打開代碼一樣)第三部分12、各步驟結(jié)果和錯(cuò)誤舉例各步驟結(jié)果圖Mark(Red)&MayBeMark(Blue)maybemarktomark(blackred)edgeinformationandedgefiltertwovaluefillholesshrinkfindcentercount出現(xiàn)的錯(cuò)誤舉例:Mousemove程序中出現(xiàn)問題:1.錯(cuò)誤:沒有加*include"MainFrm.h"頭文件2.錯(cuò)誤errorC2248:'m_wndStatusBar':cannotaccessprotectedmemberdeclaredinclass'CMainFrame'需將protected://controlbarembeddedmembers CStatusBarm_wndStatusBar; CToolBarm_wndToolBar;protected變?yōu)閜ublic 供用戶操作使用MouseMove函數(shù)中((CMainFrame*)Af*GetMainWnd())->m_wndStatusBar.SetPaneTe*t(0,str);使str.Format中內(nèi)容顯示在標(biāo)準(zhǔn)窗口圖像的左下方barMouseMove的坐標(biāo)判決放在for循環(huán)外,鼠標(biāo)移動(dòng)到圖像外,程序會(huì)崩潰。。解決:改變坐標(biāo)判決代碼的位置通見問題:在ClassView中的類視圖不見了,在FileView視圖中該類的.h和.cpp文件仍然存在解決方案:先保存workspace,然后關(guān)閉工程,刪除此工程目錄中的.ncb文件,重新打開workspace原因:classview顯示混亂在類中添加的成員變量和成員函數(shù)不能顯示出來,即使顯示出來了變量或函數(shù),雙擊后不能跳至正確的位置。Edgeinformation中出現(xiàn)問題正常 不正常memcpy(lpNewDIBBits,lpSrc,lHeight*lLineBytes);代碼應(yīng)放在圖像處理前,參考圖像是初始狀態(tài)的圖像,把第一步的四個(gè)小步驟分開寫在不同的函數(shù)內(nèi)時(shí),因?yàn)槊恳恍〔降牟僮鞫紩?huì)改變圖像的狀態(tài),如果把:memcpy(lpNewDIBBits,lpSrc,lHeight*lLineBytes);寫在maybemark_to_mark之后則參考圖像就不是原始圖像發(fā)現(xiàn):做到shrink時(shí),看到收縮后的圖像效果很差,和標(biāo)準(zhǔn)收縮圖像相差較大,經(jīng)調(diào)試后發(fā)現(xiàn)問題(沒注意ppt最后一頁有,老師在qq群在中也提到過)。Shrink操作后,關(guān)閉圖像,出現(xiàn)問題GenEdge4()函數(shù)中出現(xiàn)問題for(intj=0;j<lHeight;j++)//可以 { lpSrc=(unsigned
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何高效報(bào)送網(wǎng)絡(luò)輿情 2024(方法+流程)
- 機(jī)房搬遷方案
- 微積分 第3版 課件 2.5 函數(shù)的連續(xù)性
- 坪山區(qū)七年級(jí)上學(xué)期語文期末考試試卷
- 講述京東課件教學(xué)課件
- 股東合同范本(2篇)
- 南京航空航天大學(xué)《多元統(tǒng)計(jì)分析》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《數(shù)字圖形設(shè)計(jì)》2022-2023學(xué)年第一學(xué)期期末試卷
- 獨(dú)坐敬亭山說課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《領(lǐng)導(dǎo)科學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 餐飲行業(yè)報(bào)告:中餐出海
- 2024年江蘇鐘吾大數(shù)據(jù)發(fā)展集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 青少年數(shù)獨(dú)智力運(yùn)動(dòng)會(huì)U12組數(shù)獨(dú)賽前集訓(xùn)題
- 醫(yī)院健康教育培訓(xùn)課件
- GH/T 1419-2023野生食用菌保育促繁技術(shù)規(guī)程灰肉紅菇
- 鼻咽癌的放射治療課件
- 明孝端皇后九龍九鳳冠
- 注塑車間規(guī)劃方案
- 營養(yǎng)不良五階梯治療
- 標(biāo)本運(yùn)送培訓(xùn)課件
- 護(hù)士與醫(yī)生的合作與溝通
評(píng)論
0/150
提交評(píng)論