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深度轉成8(pImgPlanes)
}
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之圖片釋放
}
Q1:高斯平滑?(cvSmooth)
回覆刪除Q2:創造3個等空間?
(for(i=0;i<3;i++)
pImgPlanes[i] = cvCreateImage(cvSize(pImage->width,pImage->height),8,1)
)
Q3:將圖分成3等份?(cvCvtPixToPlane)
補充:
回覆刪除Q1所提到的意思是,根據我上網查的資料sobel是已經包含了平滑跟微分 但為什麼程式裡又還要再做一次呢?
(http://www.opencv.org.cn/index.php/Cv图像处理#CvtColor)
Q2怎會要創造3個等空間然後再去做
Q3又怎會要分成3等份後去做
我的意思是這樣~