邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)_第1頁(yè)
邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)_第2頁(yè)
邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)_第3頁(yè)
邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)_第4頁(yè)
邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、醫(yī)學(xué)圖像處理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)十三:邊緣檢測(cè)、閾值處理和區(qū)域生長(zhǎng)日期: 2014年05月27日摘要本次實(shí)驗(yàn)的目的是: 了解邊緣檢測(cè)原理,用梯度閾值法,使用Sobel算子結(jié)合平滑處理和閾值處理提取邊緣,; 了解閾值處理的計(jì)算方法,進(jìn)行全局閾值和Otsu(大律法)閾值處理。 了解區(qū)域生長(zhǎng)原理。對(duì)圖像做區(qū)域生長(zhǎng)提取圖像特征。本次實(shí)驗(yàn)的內(nèi)容是: 閾值處理 全局閾值處理 OTSU(大律法)閾值處理 梯度法檢測(cè)邊緣 區(qū)域生長(zhǎng)一、技術(shù)討論1.1實(shí)驗(yàn)原理1.1.1圖像的邊緣檢測(cè)邊緣:是指圖像局部特征的不連續(xù)性。灰度或結(jié)構(gòu)信息的突變。邊緣檢測(cè):一種定位二維或三維圖像(特別是醫(yī)學(xué)圖像)中的對(duì)象的邊緣的系統(tǒng)。通過輸入端(

2、310)接收表示該圖像的各元素值的數(shù)據(jù)元素集。該數(shù)據(jù)集被存儲(chǔ)在存儲(chǔ)裝置(320)中。處理器(340)確定該圖像中的對(duì)象的邊緣。該處理器計(jì)算所述數(shù)據(jù)元素的至少一階和/或二階導(dǎo)數(shù),并且計(jì)算該圖像的等照度線曲率,所述曲率由標(biāo)識(shí)。該處理器還確定校正因數(shù),該校正因數(shù)對(duì)于由對(duì)象的曲率和/或所述數(shù)據(jù)的模糊造成的邊緣錯(cuò)位進(jìn)行校正。該校正因數(shù)取決于所述等照度線曲率。然后,該處理器確定取決于所計(jì)算出的導(dǎo)數(shù)和所述等照度線曲率的算子的過零點(diǎn)。該系統(tǒng)的輸出端(330)提供對(duì)于該圖像中的邊緣位置的指示。1.1.2圖像的Sobel梯度算子主要用作邊緣檢測(cè)。在技術(shù)上,它是一離散性差分算子,用來(lái)運(yùn)算圖像亮度函數(shù)的梯度之近似值。

3、該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經(jīng)橫向及縱向邊緣檢測(cè)的圖像,其公式如下:圖像的每一個(gè)像素的橫向及縱向梯度近似值可用以下的公式結(jié)合,來(lái)計(jì)算梯度的大小。公式如下:計(jì)算梯度方向公式如下:在以上例子中,如果以上的角度等于零,即代表圖像該處擁有縱向邊緣,左方較右方暗。1.1.3全局閾值法全局閾值是指整幅圖像使用同一個(gè)閾值做分割處理,適用于背景和前景有明顯對(duì)比的圖像。它是根據(jù)整幅圖像確定的:T=T(f)。但是這種方法只考慮像素本身的灰度值,一般不考慮空間特征,因而對(duì)噪聲很敏感。常用的全局閾值

4、選取方法有利用圖像灰度直方圖的峰谷法、最小誤差法、最大類間方差法、最大熵自動(dòng)閾值法以及其它一些方法。1.1.4最佳閾值法(Otsu算法)該方法是根據(jù)圖像的灰度特征,將圖像劃分為目標(biāo)和背景兩種類型。目標(biāo)類和背景類之間的類間方差越大,說(shuō)明圖像的目標(biāo)和背景之間的差別越大。當(dāng)背景類信息被錯(cuò)誤的分為目標(biāo)類信息,或目標(biāo)類信息被錯(cuò)誤的分為背景類信息時(shí),都會(huì)導(dǎo)致目標(biāo)和背景之間的差別變小。正是由于這一特性,只要使類間方差最大或類內(nèi)方差最小,這樣的分割就意味著最小的誤差,并且根據(jù)該準(zhǔn)則選取最佳閾值使得目標(biāo)和背景之間的分離性最好。1.1.5區(qū)域生長(zhǎng)區(qū)域生長(zhǎng)的基本思想是將具有相似性質(zhì)的像素集合起來(lái)構(gòu)成區(qū)域。具體先對(duì)每

5、個(gè)需要分割的區(qū)域找一個(gè)種子像素作為生長(zhǎng)的起點(diǎn),然后將種子像素周圍鄰域中與種子像素有相同或相似性質(zhì)的像素(根據(jù)某種事先確定的生長(zhǎng)或相似準(zhǔn)則來(lái)判定)合并到種子像素所在的區(qū)域中。將這些新像素當(dāng)作新的種子像素繼續(xù)進(jìn)行上面的過程,直到再?zèng)]有滿足條件的像素可被包括進(jìn)來(lái)。這樣一個(gè)區(qū)域就長(zhǎng)成了。1.2實(shí)驗(yàn)函數(shù)cvThreshold閾值處理.void cvThreshold( const CvArr* src, CvArr* dst,double threshold, double max_value, int threshold_type )src:輸入圖像;dst:輸出圖像;threshold:閾值;cvC

6、reateTrackbar創(chuàng)建trackbar并將它添加到指定的窗口。CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) );int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change );trackbar_name被創(chuàng)建的trackbar名字。window_name窗口名字value整數(shù)指針,它的值將反映滑塊的位置。這個(gè)變量指定創(chuàng)建時(shí)的滑塊位

7、置。count滑塊位置的最大值。最小值一直是0。on_change每次滑塊位置被改變的時(shí)候,被調(diào)用函數(shù)的指針 二、結(jié)果與討論2.1實(shí)驗(yàn)結(jié)果(運(yùn)行每個(gè)程序,根據(jù)以下實(shí)驗(yàn)要求得到結(jié)果)1. 實(shí)驗(yàn)要求(與實(shí)驗(yàn)指導(dǎo)的實(shí)驗(yàn)要求相同)1、10-02(2):可以隨時(shí)自選閾值,大家可以先用此程序嘗試出最佳閾值 (a) (b)圖2.1 程序10-02(2)結(jié)果,圖為大致最佳閾值2、10-02:本程序使用迭代法,比書本上的程序更加精確(完全使用書本上的公式做的,但不知道為什么就是出來(lái)這個(gè)結(jié)果),但還不如Otsu,能直接輸出閾值,因?yàn)槭侵苯佑?jì)算,因此沒有參數(shù)要求,大家可以多換幾幅圖片試試。 (a)histogram

8、 (b)original pic (c)result圖2.2 10-02迭代法實(shí)驗(yàn)結(jié)果4、10-01:Sobel算子檢驗(yàn)邊緣,用blur()函數(shù)做了一個(gè)平滑處理,還用了一個(gè)閾值處理,因?yàn)檫x擇的圖像特征比較復(fù)雜,因此可以看到提取效果不是很好,自己找出平滑的模板大小為多少時(shí),對(duì)應(yīng)閾值為多少時(shí)效果最好(盡量保留血管部分,除去其他部分)。由于程序會(huì)保存圖像,因此可以用10-03的程序找出最佳閾值。大家先熟悉10-03,找起來(lái)會(huì)很快Ø 先利用10-03求出最佳閾值,輸出結(jié)果為:125 init done.Ø 設(shè)置不同大小的平滑模板,并用不同的最佳閾值處理,結(jié)果如下:1)模板為5x5大

9、小時(shí),55 init done (a)original pic (b)gradient (c)result2)模板為8x8大小時(shí),30 init done (d)original pic (e)gradient (f)result3) 模板為15x15大小時(shí),27 init done (g)original pic (h)gradient (i)result4)模板為20x20大小時(shí),25 init done (j)original pic (k)gradient (l)result圖2.3 Sobel算子檢驗(yàn)邊緣實(shí)驗(yàn)結(jié)果5、10-04:區(qū)域生長(zhǎng),目的是從圖片中提取出兩個(gè)大圈的輪廓,程序中從閾

10、值化圖像中提取出種子(可以改變閾值因子S,在195行),并使用種子做區(qū)域生長(zhǎng)(可以改變閾值因子Q,在225行),得到最佳邊界。(a)取不同的S和Q處理結(jié)果如下:1)S=0.95,Q=35 (a) 種子 (b)閾值處理 (c)區(qū)域生長(zhǎng)的結(jié)果2)S=0.9,Q=35 (d)種子 (e)閾值處理 (f)區(qū)域生長(zhǎng)的結(jié)果 3) S=0.85,Q=35 (g)種子 (h)閾值處理 (i)區(qū)域生長(zhǎng)的結(jié)果4) S=0.95,Q=25 (j)種子 (k)閾值處理 (l)區(qū)域生長(zhǎng)的結(jié)果圖2.4 區(qū)域生長(zhǎng)實(shí)驗(yàn)結(jié)果Ø 2.2實(shí)驗(yàn)討論開始10-03:Otsu閾值處理,也叫大律法閾值處理,要求寫出程序流程圖讀入

11、圖像遍歷每個(gè)像素得到整幅圖像的均值、前景均值、背景均值計(jì)算最佳閾值利用閾值處理圖像輸出結(jié)果像結(jié)束10-01:Sobel算子檢驗(yàn)邊緣,用blur()函數(shù)做了一個(gè)平滑處理,還用了一個(gè)閾值處理,因?yàn)檫x擇的圖像特征比較復(fù)雜,因此可以看到提取效果不是很好,自己找出平滑的模板大小為多少時(shí),對(duì)應(yīng)閾值為多少時(shí)效果最好(盡量保留血管部分,除去其他部分)。由于程序會(huì)保存圖像,因此可以用10-03的程序找出最佳閾值。大家先熟悉10-03,找起來(lái)會(huì)很快,討論一下平滑模板和閾值分別對(duì)結(jié)果有什么影響由圖2.3結(jié)果可知,平滑模板的大小影響處理后圖片邊緣的寬窄,閾值的大小影響處理后圖像的清晰度。模版越大,處理后的圖像越模糊,

12、閾值處理后得到細(xì)節(jié)越少,并且保留的線條越粗。而模版大小越小,處理后的圖像模糊度越小,閾值處理后得到的細(xì)節(jié)越多,不過同時(shí)得到提取信息的效果就沒有那么好。由圖2.4結(jié)果,在控制Q不變時(shí)改變S,S越大,處理后的圖像的邊界越小,S越小,處理后的圖像的邊界越大。在控制S不變時(shí)改變Q,S越小,處理后的圖像的邊界越小,S越大,處理后的圖像的邊界越大。附錄(實(shí)驗(yàn)代碼).pro程序:INCLUDEPATH+=C:Qtopencv2.2includeopencvC:Qtopencv2.2includeopencv2C:Qtopencv2.2includeLIBS+=C:Qtopencv2.2liblibcv.dl

13、l.aC:Qtopencv2.2liblibopencv_calib3d220.dll.aC:Qtopencv2.2liblibopencv_contrib220.dll.aC:Qtopencv2.2liblibopencv_core220.dll.aC:Qtopencv2.2liblibopencv_features2d220.dll.aC:Qtopencv2.2liblibopencv_flann220.dll.aC:Qtopencv2.2liblibopencv_gpu220.dll.aC:Qtopencv2.2liblibopencv_highgui220.dll.aC:Qtopenc

14、v2.2liblibopencv_imgproc220.dll.aC:Qtopencv2.2liblibopencv_legacy220.dll.aC:Qtopencv2.2liblibopencv_ml220.dll.aC:Qtopencv2.2liblibopencv_objdetect220.dll.aC:Qtopencv2.2liblibopencv_video220.dll.a2. 閾值處理:#include <stdio.h>#include <stdlib.h>#include <math.h>#include "cv.h"

15、#include "highgui.h"int main(void) IplImage *src_image = 0; IplImage *dst_image = 0; IplImage *dst_image_adaptive = 0; int c; int adaptive_method; int block_size; int offset; if( (src_image = cvLoadImage( "D:/3.tif", 0) = 0 ) return -1; dst_image = cvCreateImage(cvSize(src_image-

16、>width,src_image->height), IPL_DEPTH_8U, 1); cvNamedWindow( "Threshold", 1 ); dst_image_adaptive = cvCreateImage(cvSize(src_image->width,src_image->height), IPL_DEPTH_8U, 1); cvNamedWindow( "ThresholdAdaptive", 1); int thresh_val = 100; int thresh_valBef = 0; cvCreate

17、Trackbar( "thresh val", "Threshold", &thresh_val, 255, 0 ); adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C; int adaptive_methodBef = 1; cvCreateTrackbar( "adaptive method", "ThresholdAdaptive", &adaptive_method, 1, 0 ); block_size = 1; int block_sizeBef =

18、 0; cvCreateTrackbar( "block size", "ThresholdAdaptive", &block_size, 60, 0 ); offset = 30; int offsetBef = 0; cvCreateTrackbar( "offset", "ThresholdAdaptive", &offset, 60, 0 ); for(;) if(thresh_valBef != thresh_val ) | (adaptive_methodBef != adaptive_

19、method ) | (block_sizeBef != block_size) | (offsetBef != offset) cvAdaptiveThreshold(src_image, dst_image_adaptive, (double)255, adaptive_method, CV_THRESH_BINARY, block_size*2+3, (double)(offset-30); cvShowImage("ThresholdAdaptive", dst_image_adaptive); cvThreshold(src_image, dst_image, (

20、double)thresh_val, (double)255, CV_THRESH_BINARY); cvShowImage("Threshold", dst_image); thresh_valBef = thresh_val; adaptive_methodBef = adaptive_method; block_sizeBef = block_size; offsetBef = offset; c = cvWaitKey(30); if( c = 'q' | c = 'Q' | (c & 255) = 27 | (c &

21、 255) = 32 ) break; cvDestroyWindow( "Threshold" );/銷毀窗口 cvDestroyWindow( "ThresholdAdaptive" );/銷毀窗口 cvReleaseImage( &src_image ); /釋放圖像 cvReleaseImage( &dst_image ); /釋放圖像 cvReleaseImage( &dst_image_adaptive ); /釋放圖像3. 全局閾值處理#include "cv.h"#include "c

22、xcore.h"#include "highgui.h"#include <iostream>using namespace cv;using namespace std;int hei;int wid;int BasicGlobalThreshold(IplImage* A) long N = hei * wid; int h256; for(int i = 0; i < 256; i+) hi = 0; uchar min=255,max=0; for(int i = 0; i < hei; i+) for(int j = 0; j &

23、lt; wid; j+) int k=(uchar*)(A->imageData + A->widthStep*i)j; if (k<min) min=k; if (k>max) max=k; hk+; int i,t,t1,t2,k1,k2; double u,u1,u2; t=0; u=0; for (i=min;i<max;i+) t+=hi; u+=i*hi; k2=(int) (u/t); / 計(jì)算此范圍灰度的平均值 do k1=k2; t1=0; u1=0; for (i=min;i<=k1;i+) / 計(jì)算低灰度組的累加和 t1+=hi; u1

24、+=i*hi; t2=t-t1; u2=u-u1; if (t1) u1=u1/t1; / 計(jì)算低灰度組的平均值 else u1=0; if (t2) u2=u2/t2; / 計(jì)算高灰度組的平均值 else u2=0; k2=(int) (u1+u2)/2); / 得到新的閾值估計(jì)值 while(abs(k1-k2)>0.001); / 數(shù)據(jù)未穩(wěn)定,繼續(xù) return k2;/直方圖均衡變換函數(shù)void Hist_image(IplImage *target_image) float range = 0,255; /直方圖的灰度級(jí)的范圍(以8bit圖為例),range是一個(gè)數(shù)組 floa

25、t* ranges=range; /凡是變量前加了星號(hào),都代表定義該變量是指針變量,就像ranges /不妨先定義我們將要畫的直方圖的尺寸,256×256 int hist_width=512; int hist_height=512; /原圖轉(zhuǎn)換為灰度圖 IplImage* gray_image = cvCreateImage(cvGetSize(target_image),8,1); cvZero(gray_image); cvCvtColor(target_image,gray_image,CV_BGR2GRAY); /獲取灰度圖一維直方圖的數(shù)據(jù),統(tǒng)計(jì)圖像在0 255像素值的數(shù)

26、據(jù)情況,也就是說(shuō)灰度為0的像素有多少個(gè) /,像素為1的像素點(diǎn)有多少個(gè)。如此類推,這些數(shù)據(jù)都將會(huì)存在gray_hist里面 CvHistogram* gray_hist = cvCreateHist(1,&hist_width,CV_HIST_ARRAY,ranges,1); cvCalcHist(&gray_image,gray_hist,0,0); /計(jì)算灰度圖像的一維直方圖,修改*gray_image可以獲得原來(lái)圖像的直方圖 /歸一化直方圖 cvNormalizeHist(gray_hist,1.0); int scale = 1; /創(chuàng)建一張一維直方圖的“圖”,橫坐標(biāo)設(shè)為

27、灰度級(jí)別,縱坐標(biāo)為像素個(gè)數(shù)(*scale) IplImage* hist_image = cvCreateImage(cvSize(hist_width*scale,hist_height),8,3); cvZero(hist_image); /統(tǒng)計(jì)直方圖中的最大直方塊 float max_value = 0; cvGetMinMaxHistValue(gray_hist, 0,&max_value,0,0); /分別將每個(gè)直方塊的值繪制到hist_image中 float bin_val; for(int i=0;i<hist_width;i+) bin_val = cvQue

28、ryHistValue_1D(gray_hist,i); /這里可以把bin_val理解為灰度級(jí)為i的概率 int intensity = cvRound(bin_val*hist_height/max_value); /要繪制的高度 cvRectangle( hist_image, cvPoint(i*scale,hist_height-1), cvPoint(i+1)*scale - 1, hist_height-intensity), CV_RGB(255,255,0); cvNamedWindow("Histogram"); cvShowImage("Hi

29、stogram",hist_image);int main () IplImage* img = cvLoadImage("D:/2.tif",1); IplImage* img0 = cvCreateImage(cvGetSize(img),img->depth,img->nChannels); hei = img->height; wid = img->width; cvCopy(img,img0); CvScalar s; float k; k=BasicGlobalThreshold(img); cout<<k; int

30、 sum=0; for (int i=0;i<img->height;i+) for (int j=0;j<img->width;j+) s = cvGet2D(img,i,j); sum = (s.val0+s.val1+s.val2)/3; if (sum > k)/閾值 s.val0=s.val1=s.val2=255; cvSet2D(img,i,j,s); else s.val0=s.val1=s.val2=0; cvSet2D(img,i,j,s); Hist_image(img0); cvNamedWindow("Origin image&

31、quot;); cvShowImage("Origin image",img0); cvNamedWindow("Result"); cvShowImage("Result",img); cvWaitKey(0);4. 最佳閾值處理#include <iostream>#include <math.h>#include <cv.h>#include <highgui.h>#include <stdio.h>#include <windows.h>using nam

32、espace std;int hei;int wid;void otsu(IplImage* A, IplImage* B)long N = hei * wid;int h256;double p256,u256,w256;for(int i = 0; i < 256; i+) hi = 0; pi = 0; ui = 0; wi = 0;for(int i = 0; i < hei; i+) for(int j = 0; j < wid; j+) for(int k = 0; k < 256; k+) if(uchar*)(A->imageData + A-&g

33、t;widthStep*i)j = k) hk+; for( int i = 0; i < 256; i+) pi = hi / double(N);int T = 0;double uT,thegma2fang;double thegma2fang_max = -10000;for(int k = 0; k < 256; k+) uT = 0; for(int i = 0; i <= k; i+) uk += i*pi; wk += pi; for(int i = 0; i < 256; i+) uT += i*pi; thegma2fang = (uT*wk - u

34、k)*(uT*wk - uk) / (wk*(1-wk); if(thegma2fang > thegma2fang_max) thegma2fang_max = thegma2fang; T = k; cout<<T;/顯示閾值for(int i = 0; i < hei; i+) for(int j = 0; j < wid; j+) if(uchar*)(A->imageData + A->widthStep*i)j > T) (uchar*)(B->imageData + B->widthStep*i)j = 255; els

35、e (uchar*)(B->imageData + B->widthStep*i)j = 0; int main(int argc, char* argv) IplImage* InPut = cvLoadImage( "D:/3.tif", 0 ); IplImage *OutPut = cvCreateImage(cvSize(InPut->width,InPut->height),IPL_DEPTH_8U,1); hei = InPut->height; wid = InPut->width; /計(jì)算閾值 otsu(InPut,Ou

36、tPut); cvNamedWindow( "Resource", 1 ); cvShowImage( "Resource", InPut ); cvNamedWindow( "Result", 1 ); cvShowImage( "Result", OutPut ); cvWaitKey(0);5. 梯度法檢測(cè)邊緣#include "cv.h"#include "cxcore.h"#include <iostream>#include <opencv2/c

37、ore/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;using namespace std;int main(int argc, const char * argv) / 載入圖像 Mat source_image = imread("D:/1.tif", CV_LOAD_IMAGE_GRAYSCALE), img,imgx,imgx2,imgy,imgy2,Mx; imshow(

38、"orgin img", source_image ); / 建立Sobel算子模板,gx,因?yàn)樨?fù)值會(huì)變?yōu)?,因此還需要一個(gè)從下到上的 Mat gx = (Mat_<char>(3,3) << -1, -2, -1, 0, 0, 0, 1, 2, 1); Mat gx2 = (Mat_<char>(3,3) << 1, 2, 1, 0, 0, 0, -1, -2, -1); / 建立Sobel算子模板,gy Mat gy = (Mat_<char>(3,3) << -1, 0, 1, -2, 0, 2,

39、 -1, 0, 1); Mat gy2 = (Mat_<char>(3,3) << 1, 0, -1, 2, 0, -2, 1, 0, -1); /求偏導(dǎo)數(shù) blur(source_image, img,Size(10,10);/用10乘10的模板模糊化 filter2D( img, imgx, -1, gx ); filter2D( img, imgy, img.depth(), gy ); filter2D( img, imgx2, -1, gx2 ); filter2D( img, imgy2, img.depth(), gy2 ); Mx=imgx+imgy+i

40、mgx2+imgy2;/ imshow("gx", imgx2);/ imshow("gy", imgy2); imshow("gradient", Mx); imwrite("D:/11.tif",Mx);/保存 /讀取 IplImage* img0 = cvLoadImage("D:/11.tif",1); CvScalar s; int sum=0; for (int i=0;i<img0->height;i+) for (int j=0;j<img0->width

41、;j+) s = cvGet2D(img0,i,j); sum = (s.val0+s.val1+s.val2)/3; /這里可能考慮了三通道的緣故 if (sum > 128) s.val0=s.val1=s.val2=255; cvSet2D(img0,i,j,s); else s.val0=s.val1=s.val2=0; cvSet2D(img0,i,j,s); cvNamedWindow("Result"); cvShowImage("Result",img0); cvWaitKey(0);6. 區(qū)域生長(zhǎng)#include <cxco

42、re.h>#include <cv.h>#include <stack>#include <stdio.h>#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>typedef struct/保存種子像素 int x; int y;seedpoint;/區(qū)域生長(zhǎng),8連通區(qū)域,基于多個(gè)種子點(diǎn),種子點(diǎn)可以自選,種子點(diǎn)在seed圖像內(nèi)設(shè)置為255void Grow

43、(IplImage* src,IplImage* seed, int t1)/ stack <seedpoint> seedd; seedpoint point; / 獲取圖像數(shù)據(jù),保存種子區(qū)域 int height = seed->height; int width = seed->width; int step = seed->widthStep; uchar* seed_data = (uchar *)seed->imageData; uchar* src_data=(uchar *)src->imageData; int temp; /將種子點(diǎn)

44、壓入堆棧 for(int i=0;i<height;i+) for(int j=0;j<width;j+) if(seed_datai*step+j=255) point.x=i; point.y=j; temp = src_datapoint.x*step+point.y; seedd.push(point); /取出種子點(diǎn),分別作8鄰域生長(zhǎng) seedpoint temppoint; while(!seedd.empty() point=seedd.top(); seedd.pop(); if(point.x>0)&&(point.x<(height-1)&&(point.y>0)&&(point.y<(width-1) if(seed_data(point.x-1)*step+point.y=0)&&(abs(src_data(point.x-1)*step+point.y-temp) <= t1) seed_data(point.x-1)*step+point.y=255; temppoint.x=point.x-1; temppoint.y=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論