數字圖像處理與深度學習技術應用 課件 第9、10章 圖像分割與測量、圖像頻域變換處理_第1頁
數字圖像處理與深度學習技術應用 課件 第9、10章 圖像分割與測量、圖像頻域變換處理_第2頁
數字圖像處理與深度學習技術應用 課件 第9、10章 圖像分割與測量、圖像頻域變換處理_第3頁
數字圖像處理與深度學習技術應用 課件 第9、10章 圖像分割與測量、圖像頻域變換處理_第4頁
數字圖像處理與深度學習技術應用 課件 第9、10章 圖像分割與測量、圖像頻域變換處理_第5頁
已閱讀5頁,還剩339頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第9章圖像分割與測量9.1概述圖像分析過程圖像圖像識別圖像預處理圖像理解圖像分割圖像分割與測量是圖像識別工作的基礎。圖像分割將圖像分為一些有意義的區域,然后可以對這些區域進行描述,相當于提取出某些目標區域圖像的特征,判斷圖像中是否有感興趣的目標。圖像分割的基礎是像素間的相似性和跳變性。圖像分割的概念分成若干個互不相交的小區域的過程,小區域是某種意義下具有共同屬性的像素的連通集合。各區域對某種性質,如灰度,紋理等有相似性。區域內部是連通的,沒有過多小孔。區域邊界是明確的,相鄰區域對分割所依據的性質有明顯的差異。圖像分割的概念圖像分割圖像分割:把圖像分成各具特性的區域,如目標或前景與背景,選擇性地定位感興趣目標在圖像中的位置和范圍,提取出感興趣目標的技術和過程。

人的視覺系統對圖像分割是十分復雜的,也是相當有效的。但分割原理和模型都未搞清楚。圖像分割的基本思路:從簡到難,逐級分割控制背景環境,降低分割難度把焦點放在增強感興趣對象,縮小不相干圖像成分的干擾上。圖像分割邊緣檢測:檢測出邊緣,再將邊緣像素連接,構成邊界形成分割,找出目標物體的輪廓,進行目標的分析、識別、測量等。閾值分割:最常用法。有直方圖門限選擇,半閾值選擇圖像分割,迭代閾值。邊界方法:直接確定區域邊界,實現分割;有邊界跟蹤法,輪廓提取法。區域法:將各像素劃歸到相應物體或區域的像素聚類方法;有區域增長法等。圖像分割四種不同的方法概述分割的目的是將圖像分為一些有意義的區域,如目標或前景,然后可以對這些區域進行描述。圖像分割的基本思路:從簡到難,逐級分割;控制背景環境,降低分割難度,把焦點放在增強感興趣的對象,縮小不相干圖像成分的干擾上。圖像分割的方法有多種,依據工作對像來分,可分為點相關分割和區域相關分割;按算法分類,可分為閥值法,界限檢測法,匹配法,跟蹤法等。9.2閾值法分割12基本原理原始圖像——f(x,y)灰度閾值——T閾值運算得二值圖像——g(x,y)閾值分割9.2.1直方圖門限選擇法9.2.1直方圖閾值選擇

閾值T可通過分析邊緣檢測輸出的直方圖來確定。假設,一幅圖像只有物體和背景兩部分組成,其灰度級直方圖成明顯的雙峰值。255f(i,j)16人工閾值人工選擇法是通過人眼的觀察,應用人對圖像的知識,在分析圖像直方圖的基礎上,人工選出合適的閾值。也可以在人工選出閾值后,根據分割效果,不斷的交互操作,從而選擇出最佳的閾值。17直方圖閾值選擇閾值選擇直接影響分割效果,利用灰度直方圖求兩峰之間的谷底作為閾值。18T=70的二值化圖像原始圖像直方圖人工閾值255如果f(i,j)≥Tf(i,j)=

0如果f(i,j)<T或:

0如果f(i,j)≥Tf(i,j)=

255如果f(i,j)<T直方圖閾值選擇

若直方圖呈現多個明顯的峰值,如三個峰值,可取兩個峰谷處的灰度值T1,T2作為閾值。同樣,可將閾值化后的圖像變成二值化圖像。

f(i,j)T1T22550直方圖閾值選擇其數學表達式為:

0如果T1≤f(i,j)≤T2f(i,j)=

255其它或

255如果T1≤f(i,j)≤T2f(i,j)=

0其它

直方圖閾值選擇1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內存空間,初始化為255。3)圖像灰度統計,顯示灰度直方圖。4)通過對話框選取一個峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則置為255。6)將結果復制到原圖像數據區。實現步驟效果圖(a)根據直方圖選擇閾值(b)原圖(c)二值化效果展示根據直方圖9-3所示,將兩峰之間的谷底140作為閾值。

圖9-3直方圖19.2.2半閾值選擇法9.2.2半閾值選擇分割不論圖像的直方圖具有雙峰還是多峰值,閾值化后將原多值圖像變成二值圖像,若希望只把圖像的背景表示成二值圖像(即背景不是最白就是最黑),而物體為多值圖像。此時,可采用半閾值技術,把物體從背景中分離出來。半閾值化表示為:

f(i,j)如果f(i,j)≥Tf(i,j)=

0或者255如果f(i,j)<T

f(i,j)如果f(i,j)≤Tf(i,j)=

0或者255其它半閾值選擇分割1)獲得原圖像的首地址,圖像的寬和高。2)開辟一塊內存空間,并初始化為255。3)進行圖像灰度統計,顯示灰度直方圖。4)選取一個峰谷作為閾值。5)像素灰度值小于閾值,將像素置為0,否則保持灰度值不變。實現步驟(a)根據直方圖選擇閾值

(b)半閾值選擇分割效果圖cv2.calcHist()函數用于統計圖像直方圖信息hist=cv2.calcHist(image,channel,mask,histSize,range,accumulate)hist:表示返回的統計直方圖,數組內的元素是各個灰度級的像素個數;image:表示原始圖像,該圖像需要用“[]”括起來;channel:表示指定通道編號,通道編號需要用“[]”括起來;mask:表示掩模圖像,當統計整幅圖像的直方圖時,將這個值設為None;當統計圖像某一部分的直方圖時,需要用到掩模圖像;histSize:表示BINS的值,該值需要用“[]”括起來;range:表示像素值范圍;accumulate:表示累計標識,默認值為False。如果被設置為True,則直方圖在開始計算時不會被清零,計算的是多個直方圖的累計結果,用于對一組圖像計算直方圖。該參數是可選的,一般情況下不需要設置。函數說明效果展示根據直方圖9-5所示,將兩峰之間的谷底140作為閾值。

圖9-5直方圖2效果展示

圖9-6半閾值選擇圖像分割處理效果圖9.2.3迭代閾值法34基本思想:選擇一個閾值作為初始值,按某種策略不斷地迭代改進,直到滿足給定的準則。自動輸出一個閾值。在迭代過程中,關鍵是閾值改進策略,閾值改進策略要求:快速收斂,新產生閾值優于上一次的閾值。9.2.3迭代閾值分割迭代閾值法

1)選擇圖像灰度的中值作為初始閾值Ti=T0。2)利用閾值Ti把圖像分割成兩部分區域,R1和R2,并計算其灰度均值。3)計算新的閾值Ti+14)重復步驟2、3,直到Ti+1和Ti的閾值差別小于某個給定值。1)獲得原圖像的首地址,圖像的高和寬。2)進行直方圖統計。3)設定初始閾值T=127。4)分別計算圖像中小于T和大于T的兩組平均灰度值。5)迭代計算閾值,直至兩個閾值相等。7)根據計算出的閾值,對圖像進行二值化處理。實現步驟37原始圖像迭代閾值二值化效果圖函數說明matplotlib模塊可以使用其中的hist()函數來直接繪制圖像的直方圖。n,bins,patches=matplotlib.pyplot.hist(src,bins=10,normed=False,histtype=u'bar',**kwargs)返回值:

n:直方圖向量,是否歸一化由參數normed設定。當normed取默認值時,n即為直方圖各組內元素的數量(各組頻數);

bins:返回各個bin的區間范圍;

patches:返回每個bin里面包含的數據,是一個list;參數:

src:表示原始圖像數據,必須將其轉換為一維數據;

bins:直方圖的柱數,可選項,默認為10;

normed:是否將得到的直方圖向量歸一化。默認為0;

histtype:直方圖類型,這些類型有:'bar','barstacked','step','stepfilled'。效果展示9.2.4Otsu閾值法小結Otsu算法主要采用最大類間方差法,將圖像分成背景和前景兩部分,要求這兩個部分的類內離散度最小,類間離散度最大,使兩類間方差最大來確定最佳閾值。根據閾值T將圖像中的像素點分為C1和C2兩類,則:ω0=N0/M×Nω1=N1/M×NN0+N1=M×Nω0+ω1=1μ=ω0*μ0+ω1*μ1(9-12)

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2(9-13)

將式(9-12)代入式(9-13),得到等價公式:

g=ω0ω1(μ0-μ1)^2在從0到255的范圍內,不斷調整閾值T;分別計算上式,找到上述最大的g(T),則對應的T即為Otsu算法自動選取的閾值。函數說明在threshold()函數傳遞type參數時,多傳遞一個參數cv2.THRESH_OTSU即可,必須把閾值設置為0。retval,dst=cv2.threshold(src,thresh,maxval,type)retval:表示返回的閾值;dst:表示輸出的圖像;src:表示要進行閾值分割的圖像,可以是多通道的圖像;thresh:表示設定的閾值;maxval:表示type參數,cv2.THRESH_OTSU;效果展示圖像Ostu算法閾值處理效果如圖9-8所示。左側為原始圖像,右側為處理后的圖像。圖9-8Ostu算法閾值處理效果圖9.2.5自適應閾值法小結自適應閾值可以看成一種局部性的閾值,通過規定一個區域大小,比較處理像素點與區域大小里面像素點的平均值—閾值(或者其他特征)的大小關系確定這個像素點是黑還是白。理想的情況下,色彩均衡的圖像,對整個圖像使用單個閾值進行閾值化就會成功。但是,受到多種因素的影響,圖像的色彩并不會很均衡,在這種情況下,使用局部值(又稱自適應值)進行分割可以產生好的結果。函數說明在OpenCV中提供函數cv2.adaptiveThreshold()來實現自適應閾值處理,其一般格式為:dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,c)dst:輸出的圖像;src:輸入圖,只能輸入單通道圖像,通常來說為灰度圖;maxval:當像素值超過了閾值(或者小于閾值,根據type來決定)時,所賦予的值adaptiveMethod:閾值的計算方法,包含以下2種類型:

cv2.ADAPTIVE_THRESH_MEAN_C:區域內均值;

cv2.ADAPTIVE_THRESH_GAUSSIAN_C:區域內像素點加權和,權重為一個高斯窗口;thresholdType:二值化操作的類型BlockSize:圖片中區域的大小;C:閾值計算方法中的常數項。效果展示圖像自適應閾值分割處理效果如圖9-9所示。圖9-9(a)為原始圖像,圖9-9(b)為采用權重相等方式的局部閾值處理;圖9-9(c)為采用權重為高斯分布的局部閾值處理??梢钥闯鰣D9-9(c)相對于圖9-9(b)保留了大量的細節信息。9.2.6分水嶺算法是一種分割方法;在分割中,與鄰近相似性作為參考依據;將空間位置上相近和灰度值相近的像素點,連接起來構成一個封閉的輪廓;比喻為地理學上的地形表面實現分割。9.1分水嶺算法9.1.1算法原理灰度值高的區域看成山峰,灰度值低的區域看成山谷。由于噪聲,存在過度分割的現象;為了解決過度分割的問題,使用基于標記(mark)圖像的分水嶺算法。通常的mark圖像都是在某個區域定義了一些灰度層級,在這個區域的洪水淹沒過程中,水平面都是從定義的高度開始的,這樣可以避免一些很小的噪聲極值區域的分割。9.1.2OpenCV中的相關函數完成分水嶺分割還需要:對灰度圖進行OTSU二值化閾值處理;形態學函數;距離變換函數cv2.distanceTransform();計算結果進行閾值化處理,得到圖像內子圖的一些形狀信息;對目標進行標注,函數cv2.connectedComponent()使用cv2.watershed()函數實現分水嶺算法。1.形態學函數開運算:先腐蝕后膨脹的操作。去除圖像內的噪聲。在用分水嶺算法處理圖像前,要先使用開運算去除圖像內的噪聲,以避免噪聲對圖像分割可能造成的干擾。2.距離變換函數distanceTransform二值圖像內任意點到最近背景點的距離。一般計算非零值像素點到最近的零值像素點的距離。其計算結果反映了各個像素與背景(值為0的像素點)的距離關系。如果對上述計算結果進行閾值化處理,就可以得到圖像內子圖的一些形狀信息。距離變換函數實現步驟①將輸入圖片轉換為二值圖像,前景設置為1,背景設置為0②先遍歷圖像:左,左上,上,左下公式計算:D表示距離包括歐式距離,棋盤距離和麥哈頓距離;掩膜模板mask為maskL;f(p)為像素點p的像素值;③再次遍歷圖像,右,右上,右下,下;④根據模板maskL和maskR的掃描,得到最終的距離變換圖像。為了減少計算了量,采用了一種倒角模版的算法,只需要對圖像進行兩次掃描,可以實現距離變換,該方法被稱為chamfer倒角距離變換,該模版如下:距離變換函數實現步驟函數介紹dst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])·dst表示計算得到目標函數圖像。·src表示原始圖像,必須是8通道的二值圖像?!istanceType表示距離類型?!askSize表示掩模的尺寸大小?!stType表示目標函數的類型,默認為CV_F。distanceType表示的是選取距離的類型,可以設置為CV_DIST_L1,CV_DIST_L2,CV_DIST_C等,具體如下:DIST_L1=1,distance=|x1-x2|+|y1-y2|DIST_L2=2,thesimple歐式distanceDIST_C=3,distance=max(|x1-x2|,|y1-y2|)DIST_L12=4,L1-L2metric:distance=2(sqrt(1+x*x/2)-1))DIST_FAIR=5,distance=c^2(|x|/c-log(1+|x|/c)),c=1.3998DIST_WELSCH=6,distance=c^2/2(1-exp(-(x/c)^2)),c=2.9846DIST_HUBER=7distance=|x|<c?x^2/2:c(|x|-c/2),c=1.345maskSize表示的是距離變換的掩膜模板,可以設置為3,5或CV_DIST_MASK_PRECISE,對CV_DIST_L1或CV_DIST_C的情況,參數值被強制設定為3,因為3×3mask給出5×5mask一樣的結果,而且速度還更快。labels表示可選輸出2維數組;labelType表示的是輸出二維數組的類型;defcalcEuclideanDistance(x1,y1,x2,y2): returnmath.sqrt(float((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));defdistanceTrans(src,x1):rows=src.shape[0]cols=src.shape[1]#第一遍遍歷圖像,使用左模板foriinrange(1,rows-1):forjinrange(1,cols-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j-1)fDisMin=min(float(src[i][j]),src[i][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j-1)fDisMin=min(fDisMin,src[i-1][j-1]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j)fDisMin=min(fDisMin,src[i-1][j]+disPara)disPara=calcEuclideanDistance(i,j,i-1,j+1)fDisMin=min(fDisMin,src[i-1][j+1]+disPara)src[i][j]=fDisMin

#第二遍使用右模板,從右下角開始foriinrange(rows-2,0,-1):forjinrange(cols-2,0,-1):ifi==x1:disPara=calcEuclideanDistance(i,j,i,j+1)fDisMin=min(float(src[i][j]),src[i][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j+1)fDisMin=min(fDisMin,src[i+1][j+1]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j)

fDisMin=min(fDisMin,src[i+1][j]+disPara)disPara=calcEuclideanDistance(i,j,i+1,j-1)fDisMin=min(fDisMin,src[i+1][j-1]+disPara)src[i][j]=fDisMinreturnsrc[[000000][02552552552550][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][02552552552550][02552552552550][02552552552550][000000]][[000000][011110][012210][02552552552550][02552552552550][000000]][[000000][011110][012210][012210][02552552552550][000000]]9-1-0觀察距離變換函數cv2.distanceTransform()

[[000000][011110][012210][012210][011110][000000]]1.原圖2.第一行距離3.第二行距離4.第三行距離5.第四行距離img=cv2.imread("F:/picture/coin.jpg")imageGray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)#對灰度圖進行OTSU閾值處理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#設定開運算的卷積核#對二值圖像進行開運算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)distTransform=cv.distanceTransform(imageOpen,cv.DIST_L2,5)#計算歐氏距離#對距離圖像進行閾值處理ret,fore=cv.threshold(distTransform,0.4*distTransform.max(),255,0)cv.imwrite("result.jpg",fore)使用距離變換函數cv2.distanceTransform()確定一幅圖像的前景圖像

a是原始的灰度圖像;b是經過開運算處理的圖像;c是距離變換函數cv2.distanceTransform()計算得到的圖像;d是對距離圖像經過閾值處理后的圖像。d可以較為準確地確定圖a的前景圖像。未知區域的確定開運算是先膨脹后腐蝕,得到背景信息小于實際的背景信息,距離變換函數cv2.distanceTransform()只是得到了圖像的“中心信息”,即確定前景。對于一幅圖像來說,除去這兩種區域之外所剩的就是未知區域。imageGray=cv.imread("F:/picture/coin.jpg",0)#讀圖像#進行Otsu閾值處理ret,thresh=cv.threshold(imageGray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)kernel=np.ones((3,3),np.uint8)#設定開運算的卷積核#對二值圖像進行開運算imageOpen=cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel,iterations=2)#對開運算后的圖像進行膨脹操作,得到確定背景bg=cv.dilate(imageOpen,kernel,iterations=3)distTransform=cv.distanceTransform(imageOpen,cv.DIST_L2,5)#計算歐氏距離#對距離圖像進行閾值處理ret,fore=cv.threshold(distTransform,0.4*distTransform.max(),255,0)fore=np.uint8(fore)#調整對距離圖像閾值處理的結果un=cv.subtract(bg,fore)#確定未知區域cv.imshow("imageGray",imageGray)#顯示原始灰度圖cv.imshow("bg",bg)#顯示確定背景圖像cv.imshow("distTransfom",distTransform)#顯示距離圖像cv.imshow("un",un)#顯示未知區域a:原始的灰度圖像;b:距離變換函數cv2.distanceTransform()計算得到的確定前景圖像;c:對原始圖像經過膨脹操作得到的圖像,其背景圖像是確定背景;d是未知區域的圖像。由c減去b得到。1連通域是指圖像中具有相同像素值且位置相鄰的前景像素點組成的區域。2.連通區域分析:指將圖像中的各個連通區域找出并標記。通常連通區域分析處理的對象是二值化后的圖像。l圖像的標注圖像的標注確定前景圖像后,cv2.connectedComponents()函數對圖像進行標注。將背景標記為0,其他使用從1開始的整數標記。

ret,labels=cv2.connectedComponents(image)·ret表示標注的數量?!abels表示標注的結果圖像?!mage表示原始圖像,必須是8通道的圖像。補充:cv2.connectedComponentsWithStats()num_labels,labels,stats,centroids=cv2.connectedComponentsWithStats(image,connectivity=8,ltype=None)image:必須是二值圖,8位單通道圖像。connectivity:可選值為4或8,也就是使用4連通還是8連通。ltype:輸出圖像標記的類型,目前支持CV_32S和CV_16U。

返回值:num_labels:所有連通域的數目labels:圖像上每一像素的標記,用數字1、2、3…表示(不同的數字表示不同的連通域)對原始圖中的每一個像素都打上標簽,背景為0,連通域打上1,2,3。。。的標簽,同一個連通域的像素打上同樣的標簽。stats:每一個標記的統計信息,5列矩陣,每行對應每個區域外接矩形的x、y、width、height和面積,表示每個連通區域的外接矩形(起始點的x、y、寬和高)和面積centroids:連通域的中心點左邊是確定的前景圖像,右邊是標注的圖像,共標注了20個結果。分水嶺分割在經過上述操作后,cv2.watershed()函數實現圖像的分水嶺操作。img=cv2.watershed(image,markers)·img表示分水嶺操作的結果。·image表示輸入的8位三通道圖像?!arkers表示32位單通道標注結果?!纠?-4】使用cv2.watershed()函數對一幅圖像進行分水嶺演示。小結分水嶺分割是基于自然的啟發算法來模擬水流通過地形起伏的現象,從而研究總結出來的一種分割方法,其基本原理是將圖像特征看作地理上的地貌特征,在分割中,它會把與鄰近像素間的相似性作為重要的參考依據,從而將在空間位置上相近和灰度值相近的像素點互相連接起來構成一個封閉的輪廓。具體實現方案如下:(1)對灰度圖進行二值化處理,增強目標前景,去除無用背景(2)利用形態學函數,找到背景并標記背景;確定背景信息B(3)利用距離變換函數cv2.distanceTransform()函數,確定前景信息F距離變換函數實現步驟:小結①將輸入圖片轉換為二值圖像,前景設置為1,背景設置為0。②Chamfer倒角模版遍歷像素順序如圖9-10所示,需要對圖像進行兩次掃描。依次選取左、左上、上、右下,等像素計算見(9-20)式,實現距離變換。其中,D表示距離包括歐式距離,棋盤距離和麥哈頓距離;小結掩膜模板mask為maskL;f(p)為像素點p的像素值。③依據圖9-10(b)所示的后向模板maskR再次遍歷圖像,依次選取右、右下、下、左下等像素計算(9-20)式,實現距離變換。④根據模板maskL和maskR的掃描,得到最終的距離變換圖像。(4)獲取邊緣,確定未知區域UN圖像中有了確定前景F和確定背景B,剩下的區域就是未知區域UN了。未知區域UN=

圖像O

-

確定背景B

-

確定前景F未知區域UN=(圖像O

-

確定背景B)-

確定前景F上式中的“圖像O

-

確定背景B”,可以通過對圖像進行形態學的開運算操作得到。(5)利用函數cv2.connectedComponent(),構建標記圖像(marker),對目標進行標注使用函數cv2.connectedComponents()進行標注,該函數會將背景標注為0,將其他的對象使用從1開始的正整數標注。函數說明使用cv2.watershed()函數實現分水嶺算法,(1)距離變換函數distanceTransformdst=cv2.distanceTransform(src,distanceType,maskSize[,dstType])dst:表示計算得到目標函數圖像??梢允?位或32位浮點數,尺寸和src相同;src:表示原始圖像,必須是8通道的二值圖像;DistanceType:表示距離類型。常用距離類型標識符和含義如表9-1所示。(2)圖像的標注cv2.connectedComponents()函數對圖像進行標注。ret,markers=cv2.connectedComponents(image)ret:連通域的數目,表示標注的數量;markers:表示標注的結果圖像,圖像上每一個像素的標記,用數字1、2、3、…表示(不同的數字表示不同的連通域),0表示背景;image:表示原始圖像,必須是8通道的圖像。函數說明(3)分水嶺分割cv2.watershed()函數實現圖像的分水嶺操作。img=cv2.watershed(image,markers)img:表示分水嶺操作的結果;image:表示輸入圖像;markers:表示32位單通道標注結果。效果展示圖像分水嶺算法處理效果如圖9-20所示,左面的圖像是原始的灰度圖,右邊的圖像是對其進行分水嶺操作后的圖像。

圖9-20分水嶺算法處理效果圖9.3投影法分割水平投影量的計算1.水平投影實現步驟:①圖像二值化,物體為黑,背景為白。②循環各行,依次判斷每一列的像素值是否為黑,統計該行所有黑像素的個數。設該行共有M個黑像素,則把該行從第一列到第M列置為黑。實現步驟:①圖像二值化,物體為黑,背景為白。②循環各列,依次判斷每一行的像素值是否為黑,統計該列所有黑像素的個數。設該列共有M個黑像素,則把該列從第一行到第M行置為黑。垂直投影投影量的計算(a)原圖(b)水平投影(c)垂直投影效果圖9.3.1水平投影分割小結水平投影分割是沿著圖像水平方向,統計水平方向像素的累加計算量的集合,通過水平投影可以取得目標物體所在的行數。實現步驟:①將圖像二值化,使物體為黑,背景為白。②循環各行,依次判斷每一列的像素值是否為黑,統計該行所有黑像素的個數。設該行共有M個黑像素,則把該行從第一列到第M列置為黑。③顯示該圖。效果展示通過水平投影可以取得漢字所在的行數,圖像投影處理效果如圖9-21所示。圖9-21水平投影可分割漢字所在的行數9.3.2垂直投影分割小結垂直投影分割是沿著圖像垂直方向,統計垂直方向像素的累加計算量的集合,通過垂直投影可以取得目標物體所在的列數。實現步驟:①將圖像二值化,使物體為黑,背景為白。②循環各列,依次判斷每一行的像素值是否為黑,統計該列所有黑像素的個數。設該列共有M個黑像素,則把該列從第一行到第M行置為黑。③顯示該圖。效果展示圖像投影處理效果如圖9-22所示,垂直投影可獲得漢字所在的列數,因此,垂直投影可以分割每個漢字。圖9-22垂直投影可以分割每個漢字9.4輪廓檢測9.4.1鄰域判斷法

掏空內部點輪廓提取圖像邊緣是圖像局部特性不連續性(灰度突變、顏色突變等)的反映,它標志著一個區域的終結和另一個區域的開始。二值圖像的輪廓提取采用掏空內部點法:如果原圖中有一點為黑,且它的8個相鄰點皆為黑,則將該點刪除。對于非二值圖像,要先進行二值化處理。1)獲取原圖像的首地址,圖像的高和寬。2)開辟一塊內存緩沖區。3)將像素點的8鄰域像素讀入數組中,如果8個鄰域像素都和中心點相同,在內存緩沖區中將該像素點置白,否則保持不變。4)重復執行3),對每一個像素進行處理。實現步驟(a)原圖(b)輪廓提取效果圖效果圖9.4.2邊界跟蹤法

從圖像中一個邊界點出發,然后根據某種判別準則搜索下一個邊界點,以此跟蹤出目標邊界。邊界跟蹤法小結中心像素可以跟蹤的方向有8個,對每個方向制訂了方向編號及偏移量,當找到起始點,把該點記錄下來,定義初始的跟蹤方向是左上方0方向,判斷該點是否為目標點,若是則把該目標點作為跟蹤的起始點,逆時針旋轉90度作為新的跟蹤方向,繼續檢測該新的跟蹤方向上的點;若不是則沿順時針旋轉45度,直至找到目標點。找到目標點后,在當前跟蹤方向的基礎上,逆時針旋轉90度作為新的跟蹤方向,用同樣的方法跟蹤下一個邊界點,直到回到起始點為止。小結邊界跟蹤的基本方法是:先根據某些嚴格的“探測準則”找出目標物體輪廓上的像素,再根據這些像素的某些特征用一定的“跟蹤準則”找出目標物體上的其他像素。圖9-24邊界跟蹤示意圖確定邊界的起始搜索點,起始點的選擇很關鍵,對某些圖像,選擇不同的起始點會導致不同的結果。

確定合適邊界判別準則和搜索準則,判別準則用于判斷一個點是不是邊界點,搜索準則則指導如何搜索下一個邊緣點。

確定搜索的終止條件。邊界跟蹤法1)從左下角開始逐點掃描,當遇到邊緣點時,則跟蹤,直至跟后續點回到起始點(對于閉合線),或其后續點再沒有新的后續點(對于非閉合線)為止。2)如果為非閉合線,則跟蹤一側后,需從起始點開始朝相反的方向跟蹤到另一尾點。3)如果不止一個后續點,則按上述連接準則選擇距離最近的點為后續點,另一次要的后續點作為新的邊緣跟蹤起點另行跟蹤。4)一條線跟蹤完后,接著掃描下一個未跟蹤點,直至所有邊緣都跟蹤完畢。邊界跟蹤法--跟蹤準則(a)中心像素跟蹤的8個方向編號及偏移量(b)邊界跟蹤示意圖(-1,-1)(0,-1)(1,-1)(-1,0)(1,0)(-1,1)(0,1)(1,1)邊界跟蹤法--跟蹤準則

中心像素可以跟蹤的方向有8個,對每個方向制定了方向編號及偏移量,選取圖像的最左下方的像素點作為起始點。邊界跟蹤法--跟蹤準則當找到起始點,把該點記錄下來;初始跟蹤方向是:左上方0方向;判斷該點是否為目標點,是則把該點為跟蹤的起始點;逆時針旋轉90度,作為新的跟蹤方向,繼續檢測該新的跟蹤方向上的點。邊界跟蹤法--跟蹤準則若不是是目標點則沿順時針旋轉45度,一直到找到目標點。找到目標點后,在當前跟蹤方向的基礎上,逆時針旋轉90度作為新的跟蹤方向,用同樣的方法跟蹤下一個邊界點;直到回到起始點為止。

邊界跟蹤法--跟蹤準則1)獲得圖像的首地址,圖像的高和寬。2)開辟一塊內存緩沖區,初始化為255。3)將圖像進行二值化處理。4)跟蹤邊界點,找到1個邊界點,就將內存緩沖區中該點置0。5)按照跟蹤準則,重復執行(4),直到回到初始點。實現步驟(a)原圖(b)外邊界跟蹤效果圖

效果圖9.4.3區域增長法閾值分割法:很少考慮空間關系,使多閾值選擇受到限制。區域分割法:彌補這點不足,利用空間性質,認為屬于同一區域的像素應具有相似性。傳統的區域分割算法有:區域增長法和區域分裂合并法。該類方法在先驗知識不足的圖像進行分割,有較好的性能。但是,空間和時間開銷比較大。區域增長法

依次用圖像的每一個像素的灰度值和種子點相減,判斷結果是否小于標準差,是則將該點和種子點合并,不是則保持像素點的灰度值不變。這樣處理后的圖像就是用區域分割法處理后的邊緣分割圖像。區域增長法考慮空間鄰域象素之間的關系。開始時確定一個或多個象素點作為種子,按某種相似性準則,增長區域,逐步生成具有某種均勻性的空間區域,將相鄰的具有相似性質的象素或區域歸并,從而逐步增長區域,直至沒有可以歸并的點或其它小區域為止。區域內象素的相似性度量可以包括平均灰度值、紋理、顏色等信息。區域增長法選擇合適的種子點確定相似性準則(生長準則)確定生長停止條件區域增長法區域增長法示意圖區域增長法1)獲取原圖像的首地址,及高和寬。2)依次用圖像的每一個像素的灰度值減去種子點,判斷結果的絕對值是否小于閾值,閾值為10。如果小于則將種子點賦給該像素點,否則灰度值保持不變。實現步驟(a)選擇生長點

(b)按右鍵點擊黑處效果圖效果圖小結將具有相似性質的像素集合起來構成區域。先找一個種子像素作為生長起點,然后將與種子像素有相同或相似性質的像素合所在的區域中。將這些新像素當作新的種子繼續上面的過程,直到沒有滿足條件

區域增長法示意圖函數說明(1)None=dWindow(winname[,flags])該函數是OpenCV中用于創建窗口的函數,窗口通常用來顯示圖像。Winname:窗口名稱;Flags:可選參數,例如有cv2.WINDOW_NORMAL、cv.WINDOW_AUTOSIZE等。(2)None=cv2.setMouseCallback(winname,onMouse,userdata)該函數是OpenCV中常需要用到的鼠標回調函數,以此實現人機交互。Winname:綁定的窗口名稱;OnMouse:鼠標的回調函數;Userdata:可選參數。函數說明(3)在OpenCV中提供了cv2.circle()函數來繪制圓image=cv2.circle(image,center,radius,color[,thickness[,lineType]])image:表示繪制的載體圖像;center:表示圓心;radius:表示圓的半徑;color:表示繪制圓的線條的顏色;thickness:表示繪制圓的線條的粗細;lineType:表示繪制圓的線條的類型。函數說明(4)在OpenCV中提供了cv2.putText()函數,用于在圖形上繪制文字mage=cv2.putText(image,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])image:表示繪制的載體圖像;text:表示要繪制的字體;org:表示繪制字體的位置;fontFace:表示字體類型;fontScale:表示字體大?。籧olor:表示繪制文字的線條的顏色;thickness:表示繪制文字的線條的粗細;lineType:表示繪制文字的線條的類型;bottomLeftOrigin:表示文字的方向。效果展示

圖9-27鼠標單擊效果圖9.4.4輪廓檢測與擬合圖像的輪廓由一系列的點組成,這些點以某種方式表示圖像中的一條曲線。所以,圖像輪廓的繪制就是將檢測到的邊緣信息和圖像的前景信息進行擬合,從而得到圖像的輪廓。在OpenCV中提供了cv2.findContours()和cv2.drawContours()函數來實現對圖像輪廓的查找與繪制,OpenCV中輪廓的查找與繪制函數說明在OpenCV中提供了cv2.findContours()和cv2.drawContours()函數來實現對圖像輪廓的查找與繪制。(1)cv2.findContours()函數一般格式為:image,contours,hierarchy=cv2.findContours(image,mode,method)image:表示8位單通道原始圖像。mode:表示輪廓檢索模式。(2)cv2.drawContours()函數一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])函數說明image:表示待繪制輪廓的圖像。contours:表示需要繪制的輪廓。contourIdx:表示需要繪制的邊緣索引。color:表示繪制的輪廓顏色。繪制的顏色,用BGR格式表示。thickness:表示繪制輪廓的粗細。如將該值設置為“-1”,則表示要繪制實心輪廓。lineType:表示繪制輪廓所選用的線型。hierarchy:對應函數cv2.findContours()所輸出的層次信息。maxLevel:控制所繪制輪廓層次的深度。offset:表示輪廓的偏移程度。該參數使輪廓偏移到不同的位置展示出來。函數介紹cv2.findContours()函數的一般格式為:image,contours,hierarchy=cv2.findContours(image,mode,method)其中:·image表示8位單通道原始圖像?!ontours表示返回的輪廓。·hierarchy表示輪廓的層次信息?!ode表示輪廓檢索模式。·method表示輪廓的近似方法。cv2.drawContours()函數的一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])函數介紹cv2.drawContours()函數的一般格式為:image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineTypehierarchy[,maxLevel[,offset]]]]])其中:·image表示待繪制輪廓的圖像?!ontours表示需要繪制的輪廓?!ontourIdx表示需要繪制的邊緣索引?!olor表示繪制的輪廓顏色。·thickness表示繪制輪廓的粗細。·lineType表示繪制輪廓所選用的線型?!ierarchy對應cv2.findContours()函數中同樣參數的信息。·maxLevel控制所繪制輪廓層次的深度。

繪制輪廓實例【例】繪制一幅圖像內的輪廓。效果分析a是原始圖像;b是繪制圖1a中輪廓的結果;c是輪廓的信息??梢钥闯觯瑘D像共有8個輪廓信息,類型是列表。由于本書是黑白打印,為了觀察輪廓繪制效果,請上機測試?!纠?】利用查找繪制輪廓的方法提取出一幅圖像的前景信息。效果分析a是原始圖像;b是通過cv.findContours()函數和cv.draw-Contours()函數繪制的輪廓;c是通過掩模提取的前景信息。效果展示

(a)原圖(b)輪廓繪制(c)Mask圖

效果展示

(d)提取的前景(e)Canny檢測的邊緣(f)繪制的邊緣信息

9.5目標物體測量9.5.1區域標記二值圖像區域標記在二值圖像中,相互聯結的黑像素集合成為一個(黑)區域。通過對圖像內每個區域進行標記操作,求得區域的數目。處理前的f是二值的,像素要么為0(黑),要么為255(白),處理后每個像素的值即為其所處理區域的區域標號(1,2,3,…)。從左到右,從上倒下逐個像素掃描。若該點的左上、正上、右上及左前點都不為物體,則標號加1。優先級依次為右上點,正上點,左上點及左前點。右上點的優先級最高,左前的優先級最低。若右上點為物體,則當前點標記和右上點相同的值。若右上點不為物體,則判斷正上點。標記準則其中特別調整:當前點的右上點及左前點為不同標記,正上點和左上點不為物體,則當前點標記同右上點置相同的值。此時,從頭到尾掃描圖像,把所有標記相同的像素值都標記成與右上點同樣的值。標記準則1)讀入原圖數據,存放在緩沖區內。2)根據輸入的閾值進行二值化。3)從左到右,從上倒下,依次檢測每個像素,如果發現某像素點像素值為0,則依次檢測該點的右上、正上、左上及左前點共四個點的像素值,根據前面介紹的8個準則進行連通性的判斷,并標識物體,將物體的像素值改為標號。4)依次逐行檢測至掃描結束。實現步驟(a)原圖

(b)對物體加標記圖

效果圖函數說明(1)在OpenCV中可以通過cv2.moments()函數來獲取圖像的輪廓特征moments=cv2.moments(img,binaryImage=False)img:可以是灰度圖像或者二值圖像;binaryImage:表示輸入的二值圖像是否已經是經過二值化處理的。如果是,則傳入True,否則傳入False。moments:返回的矩特征。cv2.moments函數的返回值為一個字典,包含了圖像矩及其他信息。字典的鍵與矩的特征有關,例如中心矩、二階矩等。m00=moments['m00'] #面積cx=moments['m10']/moments['m00'] #x坐標cy=moments['m01']/moments['m00'] #y坐標其中,m00表示圖像的面積,cx和cy分別表示圖像的重心。效果展示9.5.2面積測量9.4.2二值圖像的區域面積測量在二值圖像f中,通過對圖像f內每個像素進行標記操作,將物體的像素值改為標號,求各種標號的總和,即求得不同區域的面積數目。1)調用標記統計函數,對圖像進行標記,劃分成不同的連通區域。2)循環取得各點像素值,像素值就是標號。3)根據不同的標號,加到對應的數組。4)彈出對話框,輸出各個連通區域的面積(像素個數)。實現步驟面積測量效果圖在OpenCV中,cv2.contourArea()函數可以用于計算輪廓的面積,其一般格式為:retval=cv2.contourArea(contour[,booled])retval:表示返回的輪廓面積;contour:表示輸入的輪廓;booled:表示輪廓的封閉性。函數說明效果展示9.5.3周長測量9.4.3二值圖像的周長測量在二值圖像區域標記的基礎上,物體的像素值改為標號,再采用邊界跟蹤法,跟蹤各封閉區域邊界線(輪廓線)的每個黑像素的標號,記錄二值圖像物體邊界。1)調用biaoji()函數,對圖像進行標記,劃分成不同的連通區域。2)根據不同的像素值,即不同的連通區,循環取得各點像素值的標號,搜索出一個發點,利用7.3.2節介紹的邊界跟蹤法,采用Lunkuogenzong()函數,找到出發點后,記錄其坐標,再跟蹤下一像素。保留循環得到的邊界點,其余都置255(白點)。實現步驟3)根據不同的像素值,即不同的連通區,依次執行第2步。4)把緩沖區的數據返回到原數據區。5)調整連通邊界區,計算每個連通邊界區的周長(像素個數)。6)彈出對話框,輸出各個邊界連通區域的像素個數。實現步驟周長計算效果圖

(a)原圖

(b)對不同區域體標識圖(c)區域面積測量圖(d)區域周長測量圖效果圖函數說明在OpenCV中,函數cv2.arcLength()可以用于計算輪廓的長度,其一般格式為:retval=cv2.arcLength(contour,booled)其中:retval:表示返回的輪廓周長;contour:表示輸入的輪廓;booled:表示輪廓的封閉性。效果展示圖9-35周長計算效果圖在OpenCV中,當查找并繪制出圖像的輪廓后,可以通過cv2.arcLength()函數和cv2.contourArea()函數計算輪廓的周長與面積。在OpenCV中,函數cv2.arcLength()可以用于計算輪廓的長度,其一般格式為:ret=cv2.arcLength(contour,booled)其中:·ret表示返回的輪廓周長?!ontour表示輸入的輪廓?!ooled表示輪廓的封閉性。OpenCV中輪廓的周長與面積9.2.1

周長計算:cv2.arcLength()函數【】計算并顯示一幅圖像中的輪廓長度。運行結果a是原始圖像,其中有8個各種各樣的圖形;b是原始圖像中各個圖形的周長。面積計算:cv2.contourArea()函數在OpenCV中,cv2.contourArea()函數可以用于計算輪廓的面積,其一般格式為:ret=cv2.contourArea(contour[,booled])其中:·ret表示返回的輪廓面積。·contour表示輸入的輪廓?!ooled表示輪廓的封閉性?!纠?】計算并顯示一幅圖像中的輪廓面積。運行結果a是原始圖像,其中有8個圖形;b是原始圖像中各個圖形的面積。9.6最小外包形狀檢測在通過之前的閾值分割和邊緣檢測后,可以獲得一幅圖像的前景或邊緣。接下來,一般是通過擬合的方式獲取可以近似這些圖像輪廓的多邊形或者最小外包,為之后的模板匹配打下一定的基礎。幾何圖形的最小外包與擬合9.6.1最小外包矩形cv2.minAreaRect()函數用來繪制輪廓的最小外包矩形框,其一般格式為:ret=cv2.minAreaRect(points)其中:·ret表示返回的矩形特征信息。·points表示輸入的輪廓。注意返回值ret的結構不符合cv2.drawContours()函數的參數結構要求。因此必須用cv2.boxPoints()函數將上述返回值ret轉換為符合要求的結構。cv2.boxPoints()函數的一般格式是:points=cv2.boxPoints(box)其中:·box表示cv2.minAreaRect()函數返回值類型的值?!oints表示返回的符合結構的矩形特征信息。【例6】利用cv2.minAreaRect()函數得到圖像的最小外包矩形框。運行結果圖6a是原始圖像;圖6b是在原始圖像上繪制的最小矩形外包的圖像。9.6.2最小外包圓形在OpenCV中提供了cv2.minEnclosingCircle()函數來繪制輪廓的最小外包圓形,其一般格式為:center,radius=cv2.minEnclosingCircle(points)其中:·center表示最小外包圓形的中心。·radius表示最小外包圓形的半徑?!oints表示輸入的輪廓?!纠?】利用cv2.minEnclosingCircle()函數得到圖像的最小外包圓形。運行結果9.6.3最小外包三角形在OpenCV中提供了cv2.minEnclosingTriangle()函數來繪制輪廓的最小外包三角形,其一般格式為:ret,triangle=cv2.minEnclosingTriangle(points)其中:·ret表示最小外包三角形的面積?!riangle表示最小外包三角形的三個頂點集?!oints表示輸入的輪廓?!纠?】利用cv2.minEnclosingTriangle()函數得到圖像的最小外包三角形。運行結果9.6.4最小外包橢圓在OpenCV中提供了cv2.fitEllipse()函數來繪制輪廓的最小外包橢圓,其一般格式為:ret=cv2.fitEllipse(points)其中:·ret表示返回的橢圓特征信息,包括中心點、軸長度和旋轉角等?!oints表示輸入的輪廓?!纠?】利用cv2.fitEllipse()函數得到圖像的最小外包橢圓。運行結果9.3.5最優擬合直線在OpenCV中提供了cv2.fitLine()函數來繪制輪廓的最優擬合直線,其一般格式為:line=cv2.fitLine(points,distType,param,reps,aeps)其中:·line表示返回的最優擬合直線參數?!oints表示輸入的輪廓。·distType表示距離類型?!aram表示距離參數,與所用距離類型相關?!eps表示最優擬合直線的徑向精度,一般為0.01。·aeps表示最優擬合直線的角度精度,一般為0.01?!纠?0】利用cv2.fitLine()函數得到圖像的最優擬合直線。運行結果9.7霍夫檢測霍夫變換于1962年由PaulHough首次提出,霍夫變換運用兩個坐標空間之間的變換將在一個空間中具有相同形狀的曲線或直線映射到另一個坐標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉化為統計峰值問題。9.7霍夫檢測9.7.1霍夫直線檢測小結霍夫變換(HoughTransform)的原理是將特定圖形上的點變換到一組參數空間上,根據參數空間點的累計結果找到一個極大值對應的解,那么這個解就對應著要尋找的幾何形狀的。圖9-40極坐標系下的直線方程(1)極坐標系下的直線方程ρ

=

xcosθ

+

ysinθ(9-21)(2)極坐標系中的一點對應θ從0~2π變化的直線(3)θ角度由1°逐漸遞增可獲取對應的直線參數ρ(4)同一條直線上的點,對應相同的(ρ,θ)圖9-40極坐標系下的直線方程(5)參數空間(θ,ρ)量化,構建累加器矩陣,統計相同(θ,ρ)的出現次數霍夫直線檢測,就是將參數空間(θ,ρ)量化成m×n(m為θ的等份數,n為ρ的等份數)個單元。小結算法流程:①首先就是對圖像進行Canny邊緣提??;②將參數空間(θ,ρ)量化成m×n個單元,并設置累加器矩陣Q[m×n],并把累加器的初始值置為零;③將每一個邊緣點的直角坐標系代入式ρ=xcosθ+ysinθ,然后將θ0~θm?1?也都代入其中,分別計算出相應的值ρj;④在參數空間中,找到每一個Q(θi,ρj)所對應的單元,并將該單元的累加器加1;⑤待圖像xy坐標系中的所有點都進行運算之后,檢查參數空間的累加器,指定一個閾值,輸出多條直線。函數說明(1)cv2.HoughLines()函數來實現標準霍夫直線檢測,lines=cv2.HoughLines(image,rho,theta,threshold)lines:表示函數的返回值,是檢測到的直線參數;image:表示輸入的8位單通道二值圖像;rho:表示距離的精度,一般為1;theta:表示角度的精度,一般為π/180;threshold:表示判斷閾值。效果展示

(a)原圖(b)Canny邊緣檢測

(c)霍夫直線檢測結果(d)繪制效果圖9-42霍夫直線檢測效果圖OpenCV中霍夫直線檢測在OpenCV中提供了cv2.HoughLines()函數來實現標準霍夫直線檢測,其一般格式為:lines=cv2.HoughLines(image,rho,theta,threshold)其中:·lines表示函數的返回值,是檢測到的直線參數?!mage表示輸入的8位單通道二值圖像。·rho表示距離的精度,一般為1。·theta表示角度的精度,一般為π/180?!hreshold表示判斷閾值。注意在使用該函數進行霍夫直線檢測時,所檢測到的是圖像中的直線而不是線段。1.標準霍夫直線檢測:霍夫直線檢測在使用標準霍夫直線檢測時,雖然可以檢測出圖像中的直線,但是會出現很多重復的檢測直線,為了解決這種問題,有學者提出了概率霍夫變換。這是一種對霍夫變換的優化,它只需要一個足以進行線檢測的隨機點子集即可。在OpenCV中提供了cv2.HoughLinesP()函數來實現概率霍夫直線檢測,其一般格式為:lines=cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)其中:·lines表示函數的返回值,是檢測到的直線參數?!mage表示輸入的8位單通道二值圖像?!ho表示距離的精度,一般為1。·theta表示角度的精度,一般為π/180?!hreshold表示判斷閾值。·minLineLength用來控制所接受直線的最小長度。·maxLineGap用來控制共線線段之間的最大間隔。2.霍夫直線檢測:【例11】使用cv2.Ho

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論