這一章談的是圖形的處理
blurring(平滑):用以去除雜訊或者讓影像模糊,基本原理是平均mask/filter內的pixel values
void cvSmooth(const CvArr* scr, CvArr* dst, int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, int param3=0, int param4=0);
平滑的type有: CV_BLUR(簡單模糊)、CV_BLUR_NO_SCALE(簡單無縮放模糊)、CV_MEDIAN(中值法)、CV_GUASSIAN(高斯模糊)、CV_BILATERAL(雙邊濾波)
其中簡單與高斯支援in-place,也就是destination或取代source
對於高斯而前param1與param2分別是mask/filter的width與height,第三個參數為sigma,如果要讓xy方向不同的sigma可以使用第四個參數
形態學(Morphology)
Erode(膨脹)與Dilate(侵蝕)是兩個常見的手法,用以將影像的一個部分與kernel(核)做convolution運算,每個kernel有個anchor point(通常位於中心)。膨脹求取局部最大值,使圖形中明亮的區域擴大,侵蝕則是求取區域最小值,侵蝕可以將一些斑點的noise去除
void cvErode(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
void cvDilate(IplImage *src, IplImage *des, IplConvKernel *B=NULL, int iteration=1);
這兩個運算都支援in-place,若是kernel不指定,則使用3x3的kernel,iteration則表示執行的次數
建立kernel的方式為
IplConvKernel * cvCreateStructuringElementEx(int cols, inr rows, int anchor_x,int anchor_y, int shape, int* values)
望文生義,前面四個參數就不解說了,第五個參數表示形狀有CV_SHAPE_RECT、CV_SHAPE_CROSS、CV_SHAPE_ELLIPSE、CV_SHAPE_CUSTOM
第五個參數表示特定的形狀
在Morphology往往反覆使用上面兩個運算,達到一些特殊目的
void cvMorphologyEx(
const CvArr* src,
CvArr* dst,
CvArr* temp,
IplConvKernel* element,
int operation,
int iterations = 1
);
OpenCV預設支援幾種常見的operator(CV_MOP_OPEN、CV_MOP_CLOSE、CV_MOP_GRADIENT、CV_MOP_TOPHAT、CV_MOP_BLACKHAT)
Open先Dilate再Erode,去除小型的高亮度區域
Close先Erode再Dilate,去除低亮度區域的孤立點
Gradient=dilate(src)-erode(src),邊界
TopHat=src-open(src)
BlackHat=close(src)-src
Flood Fill,就如小畫家的油漆桶一般
void cvFloodFill(
IplImage* img,
CvPoint seedPoint,
CvScalar newVal,
CvScalar loDiff = cvScalarAll(0),
CvScalar upDiff = cvScalarAll(0),
CvConnectedComp* comp = NULL,
int flags = 4,
CvArr* mask = NULL
);
調整大小
void cvResize(
const CvArr* src,
CvArr* dst,
int interpolation = CV_INTER_LINEAR
);
其中調整的時候是如何處理過多或者刪減的pixels,由最後一個參數指定,有CV_INTER_NN (Nearest neighbor)、CV_INTER_LINEAR(Bilinear)、CV_INTER_AREA(Pixel area re-sampling)、CV_INTER_CUBIC(Bicubic interpolation)
Image Pyramids看不懂,orz
取Threshold,運算有
double cvThreshold(
CvArr* src,
CvArr* dst,
double threshold,
double max_value,
int threshold_type
);
相對應的type為CV_THRESH_BINARY、CV_THRESH_BINARY_INV、CV_THRESH_TRUNC
CV_THRESH_TOZERO_INV、CV_THRESH_TOZERO
取threshold是一種技巧,友人發展出自動化的技巧,透過加權平均的方式自行取得threshold
void cvAdaptiveThreshold(
CvArr* src,
CvArr* dst,
double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 = 5
);
這個function並不支援in-place
以上的函數都是OpenCV已經幫忙實作完畢,只要直接套用就可以,相當方便,但是重點應該是何時該使用何種運算,以及運算背後代表的意義,才是我們要學習的重點(還是直接去翻閱Digital Image Processing的書XD)
沒有留言:
張貼留言