2009年7月14日 星期二

HW6-1

void CMainFrame::OnSobel()

{

IplImage * pImage = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImgSobelgray = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImg8u = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImg8uSmooth = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImgColor = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImgSobelcolor = NULL;//建立一IplImage之指標變數並設值為NULL

IplImage * pImgPlanes[3]={0,0,0};//建立一IplImage之指標陣列並設值為0

pImage = cvCloneImage(img);//img複製一份圖片

pImg8u = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);//創造一個大小等於pImage且深度為8(無符號)的圖

pImg8uSmooth = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);//創造一個大小等於pImage且深度為8(無符號)的圖

cvCvtColor(pImage,pImg8u,CV_BGR2GRAY);//pImage轉成只有灰色的圖給pImage8u

cvSmooth(pImg8u,pImg8uSmooth,CV_GAUSSIAN,3,0,0);//做高斯平滑

pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1); //創造一個大小等於pImage且深度為16(有符號)的圖

cvSobel(pImg8uSmooth,pImgSobelgray,0,1,3);//pImage8u轉成pImageSobelgray並做sobel運算

cvConvertScaleAbs(pImgSobelgray,pImg8u,1,0);//強制將pImgSobelgray轉成深度為8

cvvNamedWindow("Sobel gray Image",1);//視窗名稱為Sobel gray Image

cvvShowImage("Sobel gray Image",pImg8u);//顯現出pImage8u的圖片

int i;

for(i=0;i<3;i++)

pImgPlanes[i] = cvCreateImage(cvSize(pImage->width,pImage->height),8,1);//運用陣列創造3個和pimage大小相同的空間

pImgSobelcolor = cvCreateImage(cvSize(pImage->width,pImage->height),8,3);//創造一個大小和pimage大小的空間深度為8

cvCvtPixToPlane(pImage,pImgPlanes[0],pImgPlanes[1],pImgPlanes[2],0);//將一圖分成3等份

for(i=0;i<3;i++)

{

cvSobel(pImgPlanes[i],pImgSobelcolor,0,1,3);//對每一等份做sobel運算

cvConvertScaleAbs(pImgSobelcolor,pImgPlanes[i],1,0);//pImgSobelcolor深度轉成8pImgPlanes

}

cvCvtPlaneToPix(pImgPlanes[0],pImgPlanes[1],pImgPlanes[2],0,pImgColor);//3等份圖合成為一個圖

cvvNamedWindow("Sobel color Image",1);//視窗名稱為Sobel color Image

cvvShowImage("Sobel color Image",pImgColor);//顯現出pImagColor的圖片

cvWaitKey(0);//等待key按下之時間(<=0為無線等待)

cvDestroyWindow("Sobel gray Image");//銷毀Sobel gray Image之視窗

cvDestroyWindow("Sobel color Image");//銷毀Sobel color Image之視窗

cvReleaseImage(& pImage);//pImage之圖片釋放

cvReleaseImage(& pImgSobelgray);//pImgSobelgray之圖片釋放

cvReleaseImage(& pImgSobelcolor);//pImgSobelcolor之圖片釋放

cvReleaseImage(& pImg8u);//pImg8u之圖片釋放

cvReleaseImage(& pImg8uSmooth);//pImg8uSmooth之圖片釋放

}

2 則留言:

  1. Q1:高斯平滑?(cvSmooth)
    Q2:創造3個等空間?
    (for(i=0;i<3;i++)
    pImgPlanes[i] = cvCreateImage(cvSize(pImage->width,pImage->height),8,1)
    )
    Q3:將圖分成3等份?(cvCvtPixToPlane)

    回覆刪除
  2. 補充:
    Q1所提到的意思是,根據我上網查的資料sobel是已經包含了平滑跟微分 但為什麼程式裡又還要再做一次呢?
    (http://www.opencv.org.cn/index.php/Cv图像处理#CvtColor)
    Q2怎會要創造3個等空間然後再去做
    Q3又怎會要分成3等份後去做
    我的意思是這樣~

    回覆刪除