![詳細的圖像分割之邊緣檢測實驗報告_第1頁](http://file4.renrendoc.com/view/fec327dd56f73c98799d082d48ced990/fec327dd56f73c98799d082d48ced9901.gif)
![詳細的圖像分割之邊緣檢測實驗報告_第2頁](http://file4.renrendoc.com/view/fec327dd56f73c98799d082d48ced990/fec327dd56f73c98799d082d48ced9902.gif)
![詳細的圖像分割之邊緣檢測實驗報告_第3頁](http://file4.renrendoc.com/view/fec327dd56f73c98799d082d48ced990/fec327dd56f73c98799d082d48ced9903.gif)
![詳細的圖像分割之邊緣檢測實驗報告_第4頁](http://file4.renrendoc.com/view/fec327dd56f73c98799d082d48ced990/fec327dd56f73c98799d082d48ced9904.gif)
![詳細的圖像分割之邊緣檢測實驗報告_第5頁](http://file4.renrendoc.com/view/fec327dd56f73c98799d082d48ced990/fec327dd56f73c98799d082d48ced9905.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
邊緣檢測實驗報告一、實驗?zāi)康耐ㄟ^課堂的學習,已經(jīng)對圖像分割的相關(guān)理論知識已經(jīng)有了全面的了解,知道了許多圖像分割的算法及算子,了解到不同的算子算法有著不同的優(yōu)缺點,為了更好更直觀地對圖像分割進行深入理解,達到理論聯(lián)系實際的目的,特制定如下的實驗。二、實驗原理:圖像處理有兩大類目的:1.改善像質(zhì)(增強、恢復(fù));2.圖像分析:對圖像內(nèi)容作出描述;其一般的圖像處理過程如下:圖像輸入圖像輸入光電變換數(shù)字化圖像增強圖像恢復(fù)圖像編碼預(yù)處理閾值分割邊緣檢測……圖像分割圖像識別圖像分析理解描述解釋特征提取圖像分割的算法有:(1)閾值分割原理:(2)邊緣檢測:梯度對應(yīng)一階導(dǎo)數(shù),對于一個連續(xù)圖像函數(shù)f(x,y):梯度矢量定義:梯度的幅度:梯度的方向:a)Roberts算子1100-101-10Roberts算子b)Sobel算子-10-101-202-101121000-1-2-1c)Prewitt算子-10-101-101-101111000-1-1-1d)Kirsch算子由K0~K7八個方向模板組成,將K0~K7的模板算法分別與圖像中的3×3區(qū)域乘,選最大一個值,作為中央像素的邊緣強度(3)區(qū)域分割1區(qū)域生長法算法描述先對每個需要分割的區(qū)域找一個種子像素作為生長的起點,然后將種子像素周圍鄰域中與種子像素有相似性質(zhì)的像素合并到種子像素所在的區(qū)域中。將這些新像素當作新的種子像素繼續(xù)進行上面的過程,直到再沒有滿足條件的像素可被包括進來。2分裂合并法實際中常先把圖像分成任意大小且不重疊的區(qū)域,然后再合并或分裂這些區(qū)域以滿足分割的要求,即分裂合并法.一致性測度可以選擇基于灰度統(tǒng)計特征(如同質(zhì)區(qū)域中的方差),假設(shè)閾值為T,則算法步驟為:①對于任一Ri,如果,則將其分裂成互不重疊的四等分;②對相鄰區(qū)域Ri和Rj,如果,則將二者合并;③如果進一步的分裂或合并都不可能了,則終止算法。(4)Hough變換Hough變換是一種檢測、定位直線和解析曲線的有效方法。它是把二值圖變換到Hough參數(shù)空間,在參數(shù)空間用極值點的檢測來完成目標的檢測。下面以直線檢測為例,說明Hough變換的原理。(xi(xi,yi)(xj,yj)XoYy=p’x+q’PoQq=-pxj+yjq=-pxi+yiq’p’三、實驗過程:1、打開VC++6.0,利用AppWizard向?qū)陆ɑ诙辔臋n的工程文件”demo”,其他默認設(shè)置即可。2、新建如下的菜單資源:圖像分割Roberts算子ID_RobertSobel算子ID_SobelPrewitt算子ID_PrewittLaplacian算子ID_LaplacianGauss-Laplacian算子ID_Gauss_laplacianKrisch算子ID_Krisch3、在demoDoc.h中添加如下代碼:#include"ImgCenterDib.h"public:ImgCenterDib*GetPDib() { return&m_dib; }private: ImgCenterDibm_dib;4、在demoView.cpp中添加代碼如下:#include"MainFrm.h"#include"Segment.h"5、新建圖像處理的圖像分割類Segment.h和ImgCenterDib.h,代碼如下://圖像分割類的定義:#ifndef_INSIDE_VISUAL_CPP_IMGSEGMENT#define_INSIDE_VISUAL_CPP_IMGSEGMENT#include"ImgCenterDib.h"classImgSegment:publicImgCenterDib{public: //輸出圖像每像素位數(shù) intm_nBitCountOut; //輸出圖像位圖數(shù)據(jù)指針 unsignedchar*m_pImgDataOut; //輸出圖像顏色表 LPRGBQUADm_lpColorTableOut;private: //輸出圖像的寬 intm_imgWidthOut; //輸出圖像的高 intm_imgHeightOut; //輸出圖像顏色表長度 intm_nColorTableLengthOut;public: //不帶參數(shù)的構(gòu)造函數(shù) ImgSegment(); //帶參數(shù)的構(gòu)造函數(shù) ImgSegment(CSizesize,intnBitCount,LPRGBQUADlpColorTable, unsignedchar*pImgData); //析構(gòu)函數(shù) ~ImgSegment(); //以像素為單位返回輸出圖像的尺寸 CSizeGetDimensions(); //Roberts算子 voidRoberts(); //Sobel算子 voidSobel(); //Prewitt算子 voidPrewitt(); //Laplacian算子 voidLaplacian(); //Krisch算子 voidKrisch(); //Gauss-Laplacian算子 voidGaussLaplacian();};#endif//_INSIDE_VISUAL_CPP_IMGSEGMENT//ImgCenterDib類的定義:ImgCenterDib.h#ifndef_INSIDE_VISUAL_CPP_IMGCENTERDIB#define_INSIDE_VISUAL_CPP_IMGCENTERDIB//ImgCenterDib類classImgCenterDib{public: //圖像數(shù)據(jù)指針 unsignedchar*m_pImgData; //圖像顏色表指針 LPRGBQUADm_lpColorTable; //每像素占的位數(shù) intm_nBitCount;private: //指向DIB的指針(包含BITMAPFILEHEADER,BITMAPINFOHEADER和顏色表) LPBYTEm_lpDib; //邏輯調(diào)色板句柄 HPALETTEm_hPalette; //顏色表長度(多少個表項) intm_nColorTableLength;protected: //圖像的寬,像素為單位 intm_imgWidth; //圖像的高,像素為單位 intm_imgHeight; //圖像信息頭指針 LPBITMAPINFOHEADERm_lpBmpInfoHead;public: //不帶參數(shù)的構(gòu)造函數(shù) ImgCenterDib(); //帶參數(shù)的構(gòu)造函數(shù) ImgCenterDib(CSizesize,intnBitCount,LPRGBQUADlpColorTable, unsignedchar*pImgData); //析構(gòu)函數(shù) ~ImgCenterDib(); //獲取DIB的尺寸(寬高) CSizeGetDimensions(); //DIB讀函數(shù) BOOLRead(LPCTSTRlpszPathName); //DIB寫函數(shù) BOOLWrite(LPCTSTRlpszPathName); //顯示DIB BOOLDraw(CDC*pDC,CPointorigin,CSizesize); //用新的數(shù)據(jù)替換DIB voidReplaceDib(CSizesize,intnBitCount,LPRGBQUADlpColorTable, unsignedchar*pImgData); //計算顏色表的長度 intComputeColorTabalLength(intnBitCount); private: //創(chuàng)建邏輯調(diào)色板 voidMakePalette(); //清理空間 voidEmpty();};#endif//_INSIDE_VISUAL_CPP_IMGCENTERDIB6、類Segment.cpp和ImgCenterDib.cpp的實現(xiàn)代碼://圖像分割類的實現(xiàn)Segment.cpp:#include"stdafx.h"#include"Segment.h"#include"math.h"/************************************************************************函數(shù)名稱:*ImgSegment()**說明:無參數(shù)的構(gòu)造函數(shù),對成員變量進行初始化***********************************************************************/ImgSegment::ImgSegment(){ m_pImgDataOut=NULL;//輸出圖像位圖數(shù)據(jù)指針為空 m_lpColorTableOut=NULL;//輸出圖像顏色表指針為空 m_nColorTableLengthOut=0;//輸出圖像顏色表長度為0m_nBitCountOut=0;//輸出圖像每像素位數(shù)為0 m_imgWidthOut=0;//輸出圖像的寬為0 m_imgHeightOut=0;//輸出圖像的高為0}/************************************************************************函數(shù)名稱:*ImgSegment()**函數(shù)參數(shù):*CSizesize-圖像大小(寬、高)*intnBitCount-每像素所占位數(shù)*LPRGBQUADlpColorTable-顏色表指針*unsignedchar*pImgData-位圖數(shù)據(jù)指針**返回值:*無**說明:本函數(shù)為帶參數(shù)的構(gòu)造函數(shù),給定位圖的大小、每像素位數(shù)、顏色表*及位圖數(shù)據(jù),調(diào)用ImgCenterDib()對基類成員初始化,并初始化派生類的*數(shù)據(jù)成員***********************************************************************/ImgSegment::ImgSegment(CSizesize,intnBitCount,LPRGBQUADlpColorTable,unsignedchar*pImgData):ImgCenterDib(size,nBitCount,lpColorTable,pImgData){ m_pImgDataOut=NULL;//輸出圖像位圖數(shù)據(jù)指針為空 m_lpColorTableOut=NULL;//輸出圖像顏色表指針為空 m_nColorTableLengthOut=0;//輸出圖像顏色表長度為0m_nBitCountOut=0;//輸出圖像每像素位數(shù)為0 m_imgWidthOut=0;//輸出圖像的寬為0 m_imgHeightOut=0;//輸出圖像的高為0}/************************************************************************函數(shù)名稱:*~ImgSegment()**說明:析構(gòu)函數(shù),釋放資源***********************************************************************/ImgSegment::~ImgSegment(){ //釋放輸出圖像位圖數(shù)據(jù)緩沖區(qū) if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放輸出圖像顏色表 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; }}/************************************************************************函數(shù)名稱:*GetDimensions()**函數(shù)參數(shù):*無**返回值:*圖像的尺寸,用CSize類型表達**說明:返回輸出圖像的寬和高***********************************************************************/CSizeImgSegment::GetDimensions(){ if(m_pImgDataOut==NULL)returnCSize(0,0); returnCSize(m_imgWidthOut,m_imgHeightOut);}/************************************************************************函數(shù)名稱:*Roberts()**函數(shù)參數(shù):*無**返回值:*無**說明:Roberts邊緣檢測,函數(shù)將圖像看作若干通道數(shù)據(jù)的合成,在不同通道上*完成了邊緣檢測,因此可同時適用于灰度和彩色圖像***********************************************************************/voidImgSegment::Roberts(){ //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight]; //循環(huán)變量,圖像的坐標 inti,j; //每像素占字節(jié)數(shù),輸出圖像與輸入圖像相同 intpixelByte=m_nBitCount/8; //循環(huán)變量,遍歷像素的每個通道,比如彩色圖像三個分量 intk; //中間變量 intx,y,t; //Roberts算子 for(i=1;i<m_imgHeight-1;i++){ for(j=1;j<m_imgWidth-1;j++){ for(k=0;k<pixelByte;k++){ //x方向梯度 x=*(m_pImgData+i*lineByte+j*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+j*pixelByte+k); //y方向梯度 y=*(m_pImgData+i*lineByte+j*pixelByte+k) -*(m_pImgData+i*lineByte+(j+1)*pixelByte+k); t=sqrt(x*x+y*y)+0.5; if(t>255) t=255; *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t; } } }}/************************************************************************函數(shù)名稱:*Sobel()**函數(shù)參數(shù):*無**返回值:*無**說明:Sobel邊緣檢測,函數(shù)將圖像看作若干通道數(shù)據(jù)的合成,在不同通道上*完成了邊緣檢測,因此可同時適用于灰度和彩色圖像***********************************************************************/voidImgSegment::Sobel(){ //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight]; //循環(huán)變量,圖像的坐標 inti,j; //每像素占字節(jié)數(shù),輸出圖像與輸入圖像相同 intpixelByte=m_nBitCount/8; //循環(huán)變量,遍歷像素的每個通道,比如彩色圖像三個分量 intk; //中間變量 intx,y,t; //Sobel算子 for(i=1;i<m_imgHeight-1;i++){ for(j=1;j<m_imgWidth-1;j++){ for(k=0;k<pixelByte;k++){ //x方向梯度 x=*(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k) +2**(m_pImgData+i*lineByte+(j+1)*pixelByte+k) +*(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k) -*(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k) -2**(m_pImgData+i*lineByte+(j-1)*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k); //y方向梯度 y=*(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k) +2**(m_pImgData+(i-1)*lineByte+j*pixelByte+k) +*(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k) -2**(m_pImgData+(i+1)*lineByte+j*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k); t=sqrt(x*x+y*y)+0.5; if(t>255) t=255; *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t; } } }}/************************************************************************函數(shù)名稱:*Prewitt()**函數(shù)參數(shù):*無**返回值:*無**說明:Prewitt邊緣檢測,函數(shù)將圖像看作若干通道數(shù)據(jù)的合成,在不同通道上*完成了邊緣檢測,因此可同時適用于灰度和彩色圖像***********************************************************************/voidImgSegment::Prewitt(){ //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight]; //循環(huán)變量,圖像的坐標 inti,j; //每像素占字節(jié)數(shù),輸出圖像與輸入圖像相同 intpixelByte=m_nBitCount/8; //循環(huán)變量,遍歷像素的每個通道,比如彩色圖像三個分量 intk; //中間變量 intx,y,t; //Prewitt算子 for(i=1;i<m_imgHeight-1;i++){ for(j=1;j<m_imgWidth-1;j++){ for(k=0;k<pixelByte;k++){ //x方向梯度 x=*(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k) +*(m_pImgData+i*lineByte+(j+1)*pixelByte+k) +*(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k) -*(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k) -*(m_pImgData+i*lineByte+(j-1)*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k); //y方向梯度 y=*(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k) +*(m_pImgData+(i-1)*lineByte+j*pixelByte+k) +*(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+j*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k); t=sqrt(x*x+y*y)+0.5; if(t>255) t=255; *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t; } } }}/************************************************************************函數(shù)名稱:*Laplacian()**函數(shù)參數(shù):*無**返回值:*無**說明:Laplacian邊緣檢測,函數(shù)將圖像看作若干通道數(shù)據(jù)的合成,在不同通道上*完成了邊緣檢測,因此可同時適用于灰度和彩色圖像***********************************************************************/voidImgSegment::Laplacian(){ //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight]; //循環(huán)變量,圖像的坐標 inti,j; //每像素占字節(jié)數(shù),輸出圖像與輸入圖像相同 intpixelByte=m_nBitCount/8; //循環(huán)變量,遍歷像素的每個通道,比如彩色圖像三個分量 intk; //中間變量 intt; //Laplacian算子 for(i=1;i<m_imgHeight-1;i++){ for(j=1;j<m_imgWidth-1;j++){ for(k=0;k<pixelByte;k++){ t=4**(m_pImgData+i*lineByte+j*pixelByte+k) -*(m_pImgData+(i-1)*lineByte+j*pixelByte+k) -*(m_pImgData+(i+1)*lineByte+j*pixelByte+k) -*(m_pImgData+i*lineByte+(j-1)*pixelByte+k) -*(m_pImgData+i*lineByte+(j+1)*pixelByte+k); t=abs(t)+0.5; if(t>255) t=255; *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t; } } }}/************************************************************************函數(shù)名稱:*Krisch()**函數(shù)參數(shù):*無**返回值:*無**說明:Krisch邊緣檢測,同時適合于灰度和彩色圖像***********************************************************************/voidImgSegment::Krisch(){ //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable, sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight]; //輸出圖像緩沖區(qū)初始化為0 memset(m_pImgDataOut,0,lineByte*m_imgHeight); //循環(huán)變量,圖像的坐標 inti,j; //每像素占字節(jié)數(shù),輸出圖像與輸入圖像相同 intpixelByte=m_nBitCount/8; //循環(huán)變量,遍歷像素的每個通道,比如彩色圖像三個分量 intk; //兩個指針變量 unsignedchar*p1,*p2; //申請臨時緩沖區(qū),存放中間結(jié)果 unsignedchar*buf=newunsignedchar[lineByte*m_imgHeight]; //模板數(shù)組 intmask[9]; //設(shè)置Kirsch模板1參數(shù) mask[0]=5; mask[1]=5; mask[2]=5; mask[3]=-3; mask[4]=0; mask[5]=-3; mask[6]=-3; mask[7]=-3; mask[8]=-3; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板2參數(shù) mask[0]=-3; mask[1]=5; mask[2]=5; mask[3]=-3; mask[4]=0; mask[5]=5; mask[6]=-3; mask[7]=-3; mask[8]=-3; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板3參數(shù) mask[0]=-3; mask[1]=-3; mask[2]=5; mask[3]=-3; mask[4]=0; mask[5]=5; mask[6]=-3; mask[7]=-3; mask[8]=5; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板4參數(shù) mask[0]=-3; mask[1]=-3; mask[2]=-3; mask[3]=-3; mask[4]=0; mask[5]=5; mask[6]=-3; mask[7]=5; mask[8]=5; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板5參數(shù) mask[0]=-3; mask[1]=-3; mask[2]=-3; mask[3]=-3; mask[4]=0; mask[5]=-3; mask[6]=5; mask[7]=5; mask[8]=5; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板6參數(shù) mask[0]=-3; mask[1]=-3; mask[2]=-3; mask[3]=5; mask[4]=0; mask[5]=-3; mask[6]=5; mask[7]=5; mask[8]=-3; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板7參數(shù) mask[0]=5; mask[1]=-3; mask[2]=-3; mask[3]=5; mask[4]=0; mask[5]=-3; mask[6]=5; mask[7]=-3; mask[8]=-3; //求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ p1=m_pImgDataOut+i*lineByte+j*pixelByte+k; p2=buf+i*lineByte+j*pixelByte+k; if(*p1<*p2) *p1=*p2; } } } //設(shè)置Kirsch模板8參數(shù) mask[0]=5; mask[1]=5; mask[2]=-3; mask[3]=5; mask[4]=0; mask[5]=-3; mask[6]=-3; mask[7]=-3; mask[8]=-3;//求兩幅緩存圖像的最大值,并將大的值存入m_pImgDataOut中 for(i=0;i<m_imgHeight;i++){ for(j=0;j<m_imgWidth;j++){ for(k=0;k<pixelByte;k++){ if(*(m_pImgDataOut+i*lineByte+j*pixelByte+k)<*(buf+i*lineByte+j*pixelByte+k)) *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=*(buf+i*lineByte+j*pixelByte+k); } } }}/************************************************************************函數(shù)名稱:*GaussLaplacian()**函數(shù)參數(shù):*無**返回值:*無**說明:Gauss-Laplacian邊緣檢測,同時適合于灰度和彩色圖像***********************************************************************/voidImgSegment::GaussLaplacian(){ //定義Gauss-Laplacian模板 intmask[25]; mask[0]=-2; mask[1]=-4; mask[2]=-4; mask[3]=-4; mask[4]=-2; mask[5]=-4; mask[6]=0; mask[7]=8; mask[8]=0; mask[9]=-4; mask[10]=-4; mask[11]=8; mask[12]=24; mask[13]=8; mask[14]=-4; mask[15]=-4; mask[16]=0; mask[17]=8; mask[18]=0; mask[19]=-4; mask[20]=-2; mask[21]=-4; mask[22]=-4; mask[23]=-4; mask[24]=-2; //釋放m_pImgDataOut指向的圖像數(shù)據(jù)空間 if(m_pImgDataOut!=NULL){ delete[]m_pImgDataOut; m_pImgDataOut=NULL; } //釋放顏色表空間 if(m_lpColorTableOut!=NULL){ delete[]m_lpColorTableOut; m_lpColorTableOut=NULL; } //輸出圖像與輸入圖像為同一類型 m_nBitCountOut=m_nBitCount; //輸出圖像顏色表長度 m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut); //輸出圖像顏色表,與輸入圖像相同 if(m_nColorTableLengthOut!=0){ m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut]; memcpy(m_lpColorTableOut,m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLengthOut); } //輸出圖像的寬高,與輸入圖像相等 m_imgWidthOut=m_imgWidth; m_imgHeightOut=m_imgHeight; //每行像素所占字節(jié)數(shù),輸出圖像與輸入圖像相同 intlineByte=(m_imgWidth*m_nBitCount/8+3)/4*4; //申請輸出圖像緩沖區(qū) m_pImgDataOut=newunsignedchar[lineByte*m_imgHeight];}//ImgCenterDib.cpp的實現(xiàn)代碼#include"stdafx.h"#include"ImgCenterDib.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif/************************************************************************函數(shù)名稱:*ImgCenterDib()**說明:無參數(shù)的構(gòu)造函數(shù),對成員變量進行初始化***********************************************************************/ImgCenterDib::ImgCenterDib(){ m_lpDib=NULL;//初始化m_lpDib為空。 m_lpColorTable=NULL;//顏色表指針為空 m_pImgData=NULL;//圖像數(shù)據(jù)指針為空 m_lpBmpInfoHead=NULL;//圖像信息頭指針為空 m_hPalette=NULL;//調(diào)色板為空}/************************************************************************函數(shù)名稱:*ImgCenterDib()**函數(shù)參數(shù):*CSizesize-圖像大?。▽挕⒏撸?intnBitCount-每像素比特數(shù)*LPRGBQUADlpColorTable-顏色表指針*unsignedchar*pImgData-位圖數(shù)據(jù)指針**返回值:*無**說明:本函數(shù)為帶參數(shù)的構(gòu)造函數(shù),給定位圖的大小、每像素位數(shù)、顏色表*及位圖數(shù)據(jù)生成一個ImgCenterDib類對象***********************************************************************/ImgCenterDib::ImgCenterDib(CSizesize,intnBitCount,LPRGBQUADlpColorTable, unsignedchar*pImgData){ //如果沒有位圖數(shù)據(jù)傳入,我們認為是空的DIB,此時不分配DIB內(nèi)存 if(pImgData==NULL){ m_lpDib=NULL; m_lpColorTable=NULL; m_pImgData=NULL;//圖像數(shù)據(jù) m_lpBmpInfoHead=NULL;//圖像信息頭 m_hPalette=NULL; } else{//如果有位圖數(shù)據(jù)傳入 //圖像的寬、高、每像素位數(shù)等成員變量賦值 m_imgWidth=size.cx; m_imgHeight=size.cy; m_nBitCount=nBitCount; //根據(jù)每像素位數(shù),計算顏色表長度 m_nColorTableLength=ComputeColorTabalLength(nBitCount); //每行像素所占字節(jié)數(shù),必須擴展成4的倍數(shù) intlineByte=(m_imgWidth*nBitCount/8+3)/4*4; //位圖數(shù)據(jù)緩沖區(qū)的大小(圖像大?。? intimgBufSize=m_imgHeight*lineByte; //為m_lpDib一次性分配內(nèi)存,生成DIB結(jié)構(gòu) m_lpDib=newBYTE[sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength+imgBufSize]; //填寫B(tài)ITMAPINFOHEADER結(jié)構(gòu) m_lpBmpInfoHead=(LPBITMAPINFOHEADER)m_lpDib; m_lpBmpInfoHead->biSize=sizeof(BITMAPINFOHEADER); m_lpBmpInfoHead->biWidth=m_imgWidth; m_lpBmpInfoHead->biHeight=m_imgHeight; m_lpBmpInfoHead->biPlanes=1; m_lpBmpInfoHead->biBitCount=m_nBitCount; m_lpBmpInfoHead->biCompression=BI_RGB; m_lpBmpInfoHead->biSizeImage=0; m_lpBmpInfoHead->biXPelsPerMeter=0; m_lpBmpInfoHead->biYPelsPerMeter=0; m_lpBmpInfoHead->biClrUsed=m_nColorTableLength; m_lpBmpInfoHead->biClrImportant=m_nColorTableLength; //調(diào)色板句柄初始化為空,有顏色表時,MakePalette()函數(shù)要生成新的調(diào)色板 m_hPalette=NULL; //如果有顏色表,則將顏色表拷貝進DIB的顏色表位置 if(m_nColorTableLength!=0){ //m_lpColorTable指向DIB顏色表的起始位置 m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER)); //顏色表拷貝 memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD)*m_nColorTableLength); //創(chuàng)建邏輯調(diào)色板 MakePalette(); } //m_pImgData指向DIB位圖數(shù)據(jù)起始位置 m_pImgData=(LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength; //拷貝圖像數(shù)據(jù)進DIB位圖數(shù)據(jù)區(qū) memcpy(m_pImgData,pImgData,imgBufSize); }}/************************************************************************函數(shù)名稱:*~ImgCenterDib()**說明:析構(gòu)函數(shù),釋放資源***********************************************************************/ImgCenterDib::~ImgCenterDib(){ //釋放m_lpDib所指向的內(nèi)存緩沖區(qū) if(m_lpDib!=NULL) delete[]m_lpDib; //如果有調(diào)色板,釋放調(diào)色板緩沖區(qū) if(m_hPalette!=NULL) ::DeleteObject(m_hPalette); }/************************************************************************函數(shù)名稱:*Draw()**函數(shù)參數(shù):*CDC*pDC-設(shè)備環(huán)境指針*CPointorigin-顯示矩形區(qū)域的左上角*CSizesize-顯示矩形區(qū)域的尺寸**返回值:*0為失敗,1為成功**說明:給定設(shè)備環(huán)境指針,以及需要顯示的矩形區(qū)域在設(shè)備環(huán)境中的位置*將m_lpDib所指向的DIB顯示出來***********************************************************************/BOOLImgCenterDib::Draw(CDC*pDC,CPointorigin,CSizesize){ //舊的調(diào)色板句柄 HPALETTEhOldPal=NULL; //如果DIB為空,則返回0 if(m_lpDib==NULL)returnFALSE; //如果DIB有調(diào)色板 if(m_hPalette!=NULL){ //將調(diào)色板選進設(shè)備環(huán)境中 hOldPal=::SelectPalette(pDC->GetSafeHdc(),m_hPalette,TRUE); //實現(xiàn)調(diào)色板 pDC->RealizePalette(); } //設(shè)置位圖伸縮模式 pDC->SetStretchBltMode(COLORONCOLOR); //將DIB在pDC所指向的設(shè)備上進行顯示 ::StretchDIBits(pDC->GetSafeHdc(),origin.x,origin.y,size.cx,size.cy, 0,0,m_lpBmpInfoHead->biWidth,m_lpBmpInfoHead->biHeight,m_pImgData, (LPBITMAPINFO)m_lpBmpInfoHead,DIB_RGB_COLORS,SRCCOPY); //恢復(fù)舊的調(diào)色板 if(hOldPal!=NULL) ::SelectPalette(pDC->GetSafeHdc(),hOldPal,TRUE); //函數(shù)返回 returnTRUE;}/************************************************************************函數(shù)名稱:*Read()**函數(shù)參數(shù):*LPCTSTRlpszPathName-圖像名字及路徑**返回值:*0為失敗,1為成功**說明:給定一個圖像文件名及其路徑,讀取圖像數(shù)據(jù)進內(nèi)存生成DIB,*并存放在m_lpDib所指向的緩沖區(qū)***********************************************************************/BOOLImgCenterDib::Read(LPCTSTRlpszPathName){ //讀模式打開圖像文件 CFilefile; if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite)) returnFALSE; BITMAPFILEHEADERbmfh; try{ //清理空間 Empty(); //讀取BITMAPFILEHEADER結(jié)構(gòu)到變量bmfh中 intnCount=file.Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER)); //異常判斷 if(nCount!=sizeof(BITMAPFILEHEADER)){ thrownewCException; } if(bmfh.bfType!=0x4d42){ thrownewCException; } //為m_lpDib分配空間,讀取DIB進內(nèi)存 if(m_lpDib!=NULL) delete[]m_lpDib; m_lpDib=newBYTE[file.GetLength()-sizeof(BITMAPFILEHEADER)]; file.Read(m_lpDib,file.GetLength()-sizeof(BITMAPFILEHEADER)); //m_lpBmpInfoHead位置為m_lpDib起始位置 m_lpBmpInfoHead=(LPBITMAPINFOHEADER)m_lpDib; //為成員變量賦值 m_imgWidth=m_lpBmpInfoHead->biWidth; m_imgHeight=m_lpBmpInfoHead->biHeight; m_nBitCount=m_lpBmpInfoHead->biBitCount; //計算顏色表長度 m_nColorTableLength= ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount); //如果有顏色表,則創(chuàng)建邏輯調(diào)色板 m_hPalette=NULL; if(m_nColorTableLength!=0){ m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER)); MakePalette(); } //m_pImgData指向DIB的位圖數(shù)據(jù)起始位置 m_pImgData=(LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength; } catch(CException*pe){ AfxMessageBox("Readerror"); pe->Delete(); returnFALSE; } //函數(shù)返回 returnTRUE;}/************************************************************************函數(shù)名稱:*Write()**函數(shù)參數(shù):*LPCTSTRlpszPathName-指定圖像名字及路徑**返回值:*0為失敗,1為成功**說明:給定一個圖像文件名及其路徑,將m_lpDib指向的DIB存盤***********************************************************************/BOOLImgCenterDib::Write(LPCTSTRlpszPathName){ //寫模式打開文件 CFilefile; if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite |CFile::shareExclusive)) returnFALSE; //填寫文件頭結(jié)構(gòu) BITMAPFILEHEADERbmfh; bmfh.bfType=0x4d42;//'BM' bmfh.bfSize=0; bmfh.bfReserved1=bmfh.bfReserved2=0; bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength; try{ //文件頭結(jié)構(gòu)寫進文件 file.Write((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER)); //文件信息頭結(jié)構(gòu)寫進文件 file.Write(m_lpBmpInfoHead,sizeof(BITMAPINFOHEADER)); //如果有顏色表的話,顏色表寫進文件 if(m_nColorTableLength!=0) file.Write(m_lpColorTable,sizeof(RGBQUAD)*m_nColorTableLength); //位圖數(shù)據(jù)寫進文件 intimgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight; file.Write(m_pImgData,imgBufSize); } catch(CException*pe){ pe->Delete(); AfxMessageBox("writeerror"); returnFALSE; } //函數(shù)返回 returnTRUE;}/************************************************************************函數(shù)名稱:*ReplaceDib()**函數(shù)參數(shù):*CSizesize-要替換的新圖像尺寸*intnBitCount-每像素的位數(shù)*LPRGBQUADlpColorTable-顏色表指針*unsignedchar*pImgData-位圖數(shù)據(jù)的指針*返回值:*無**說明:圖像的尺寸,每像素位數(shù)、顏色表、及位圖數(shù)據(jù),*替換m_lpDib所指向的現(xiàn)有的DIB***********************************************************************/voidImgCenterDib::ReplaceDib(CSizesize,intnBitCount, LPRGBQUADlpColorTable,unsignedchar*pImgData){ //釋放原DIB所占空間 Empty(); //成員變量賦值 m_imgWidth=size.cx; m_imgHeight=size.cy; m_nBitCount=nBitCount; //計算顏色表的長度 m_nColorTableLength=ComputeColorTabalLength(nBitCount); //每行像素所占字節(jié)數(shù),擴展成4的倍數(shù) intlineByte=(m_imgWidth*nBitCount/8+3)/4*4; //位圖數(shù)據(jù)的大小 intimgBufSize=m_imgHeight*lineByte; //為m_lpDib重新分配空間,以存放新的DIB m_lpDib=newBYTE[sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength+imgBufSize]; //填寫位圖信息頭BITMAPINFOHEADER結(jié)構(gòu) m_lpBmpInfoHead=(LPBITMAPINFOHEADER)m_lpDib; m_lpBmpInfoHead->biSize=sizeof(BITMAPINFOHEADER); m_lpBmpInfoHead->biWidth=m_imgWidth; m_lpBmpInfoHead->biHeight=m_imgHeight; m_lpBmpInfoHead->biPlanes=1; m_lpBmpInfoHead->biBitCount=m_nBitCount; m_lpBmpInfoHead->biCompression=BI_RGB; m_lpBmpInfoHead->biSizeImage=0; m_lpBmpInfoHead->biXPelsPerMeter=0; m_lpBmpInfoHead->biYPelsPerMeter=0; m_lpBmpInfoHead->biClrUsed=m_nColorTableLength; m_lpBmpInfoHead->biClrImportant=m_nColorTableLength; //調(diào)色板置空 m_hPalette=NULL; //如果有顏色表,則將顏色表拷貝至新生成的DIB,并創(chuàng)建邏輯調(diào)色板 if(m_nColorTableLength!=0){ m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof(BITMAPINFOHEADER)); memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD)*m_nColorTableLength); MakePalette(); } //m_pImgData指向DIB的位圖數(shù)據(jù)起始位置 m_pImgData=(LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*m_nColorTableLength; //將新位圖數(shù)據(jù)拷貝至新的DIB中 memcpy(m_pImgData,pImgData,imgBufSize);}/************************************************************************函數(shù)名稱:*ComputeColorTabalLength()**函數(shù)參數(shù):*intnBitCount-DIB每像素位數(shù)**返回值:*顏色表的長度**說明:給定每像素的比特
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同范例粉水
- 2025年公共藝術(shù)設(shè)計市場調(diào)研報告
- 公路護欄工程合同范例
- 學校保安聘任合同范本
- 出售魚苗批發(fā)合同范本
- 公司賣舊車合同范例
- 2025年度燃氣設(shè)施建設(shè)與運營管理合同范本
- 2025年度建筑施工單位臨時用工勞務(wù)派遣與職業(yè)健康合同
- 餐飲服務(wù)合同范本
- 船舶設(shè)備零部件行業(yè)深度研究報告
- 低空飛行旅游觀光項目可行性實施報告
- 2024年版:煤礦用壓力罐設(shè)計與安裝合同
- 2024年貴州云巖區(qū)總工會招聘工會社會工作者筆試真題
- 《算法定價壟斷屬性問題研究的國內(nèi)外文獻綜述》4200字
- 2024年04月浙江義烏農(nóng)商銀行春季招考筆試歷年參考題庫附帶答案詳解
- 涉密計算機保密培訓
- 掛靠免責協(xié)議書范本
- 2024年浙江省五校聯(lián)盟高考地理聯(lián)考試卷(3月份)
- 在線心理健康咨詢行業(yè)現(xiàn)狀分析及未來三至五年行業(yè)發(fā)展報告
- 電動三輪車購銷合同
- 淋巴瘤的免疫靶向治療
評論
0/150
提交評論