cvCreateStructuringElementEx
創建結構元素
IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y,
int shape, int* values=NULL );
cols
結構元素的列數目
rows
結構元素的行數目
anchor_x
錨點的相對水平偏移量
anchor_y
錨點的相對垂直偏移量
shape
結構元素的形狀,可以是下列值:
CV_SHAPE_RECT, 長方形元素;
CV_SHAPE_CROSS, 交錯元素 a cross-shaped element;
CV_SHAPE_ELLIPSE, 橢圓元素;
CV_SHAPE_CUSTOM, 用戶自定義元素。這種情況下參數 values 定義了 mask,即象素的那個鄰域必須考慮。
values
指向結構元素的指針,它是一個平面數組,表示對元素矩陣逐行掃描。(非零點表示該點屬於結構元)。如果指針為空,則表示平面數組中的所有元素都是非零的,即結構元是一個長方形(該參數僅僅當shape參數是 CV_SHAPE_CUSTOM 時才予以考慮)。
函數 cv CreateStructuringElementEx 分配和填充結構 IplConvKernel, 它可作為形態操作中的結構元素。舉個例子比較好說清楚
比如一個圖
00000
01110
00000
用一個cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)的元素來腐蝕,則結果為
00000
01000
00000
而用一個cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)的元素來腐蝕,則結果為
00000
00100
00000
理解:cvCreateStructuringElementEx( 3,1,0 0,CV_SHAPE_RECT)中的3,1表示要腐蝕的對象是一個3列1行的矩陣,如果該矩陣里元素全為非零,則將其轉化為同樣大小只包含一個非零元素,而該非零元素的位置是(0,0)。同理cvCreateStructuringElementEx( 3,1,1 0,CV_SHAPE_RECT)中的3,1表示要腐蝕的對象是一個3列1行的矩陣,如果該矩陣里元素全為非零,則將其轉化為同樣大小只包含一個非零元素,而該非零元素的位置是(1,0)
假如用下面這個去腐蝕圖像,中心是在右下角1 0 01 1 01 1 1 那么應該怎么表示呢?
理論上應該是int mask[9] = {1, 0, 0, 1, 1, 0, 1, 1, 1}; IplConvKernel* strel = cvCreateStructuringElementEx( 3, 3, 0, 2, CV_SHAPE_CUSTOM, mask );其中0,2可按自己要求設置。
8)
cvSetImageROI
功能:
基於給定的矩形設置圖像的ROI(感興趣區域,region of interesting)
格式:
void cvSetImageROI(IplImage* image,CvRect rect);
參數
image 圖像頭,待處理圖像
rect ROI 矩形
說明:
如果ROI為NULL並且參數rect的值不等於整個圖像,則ROI被分配。大多數OpenCV函數都支持ROI,並將它作為一個獨立
圖像進行處理,所有像素坐標都是從ROI的左上角或者左下角(基於圖像結構)開始計算的。
9)
cvResetImageROI
功能: 釋放基於給定的矩形設置圖像的ROI(感興趣區域,region of interesting)
格式: void cvResetImageROI(IplImage* image)
參數: image 圖像頭,待處理圖像
說明: 釋放圖像image中被設定的感興趣區域ROI,與cvSetImageROI相對應。
10)
cvNot
函數cvNot(const CvArr* src,CvArr* dst)會將src中的每一個元素的每一位取反,然后把結果賦給dst。因此,一個值為0x00的8位圖像將被映射到0xff,而值為0x83的圖像將被映射到0x7c。
void cvNot(
const CvArr* src,
CvArr* dst
);
11)
CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1);
對於圖像中的某一像素點 P(x, y), 在我們正常的坐標系中,x代表其橫坐標,y代表其縱坐標,而在opencv的函數 cvGet2D()與cvSet2D() 中,卻行不通。cvGet2D() 的函數原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1); 函數返回的是一個CvScalar 容器,其參數中也有兩個標的目標的坐標,但跟我們通俗習慣的坐標不一樣的是,idx0代表是的行,即高度,對應於我們通俗坐標系的y, idx1代表的是列,即寬度,對應於我們通俗坐標系的x,cvSet2D() 也類似。所以在應用cvSet2D() 與 cvGet2D() 時,切切要重視坐標的次序。
cvGet?D用於獲取數組中指定下標的元素值,cvSet?D用於為數組中指定下標的元素賦予值。
以cvGet2D和cvSet2D為例:
CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1);
void cvSet2D (const CvArr * arr, int idx0, int idx1, CvScalar value);
索引值idx0代表數組元素的行下標,idx1代表數組元素的列下標。
與OpenCV中圖像坐標系相對應,idx0,idx1表示的是圖像上指定高度和寬度值位置處所對應的像素值。
因此,在使用時,需要依照如下的方式進行:
1 for (int y = 0; y < height; y++) {
2
3 for (int x = 0; x < width; x++)
4
5 CvScalar cs = cvGet2D(img, y, x);
6
7 cvSet2D(img, y, x, cs);
8
9 }
12) cvMat
OpenCV 中重要的矩陣變換函數,使用方法為cvMat* cvCreateMat ( int rows, int cols, int type ); 這里type可以是任何預定義類型,預定義類型的結構如下:CV_<bit_depth> (S|U|F)C<number_of_channels>。於是,矩陣的元素可以是32位浮點型數據(CV_32FC1),或者是無符號的8位三元組的
整型數據(CV_8UC3),或者是無數的其他類型的元素。一個CvMat的元素不一定就是個單一的數字。在矩陣中可以通過單一(簡單)的輸入來表示多值,這樣我們可以在一個三原色圖像上描繪多重色彩通道。對於一個包含RGB通道的簡單圖像,大多數的圖像操作將分別應用於每一個通道(除非另有說明)。
13)
cvGetSubRect
openCV里面用來創建一定的區域
cvGetSubRect(mat,submat,mat_rect);
用法:
第一個mat指的是源矩陣或者圖像
第二個submat用來存儲從原矩陣中提取的區域
第三個mat_rect用來指定區域的范圍
cvGetSubRect作用是從一個圖像中提取出來一部分,比如將一幅圖像的一部分提取加到另外一幅圖像上,就需要先使用這個函數提取源圖像的需要部分。然后利用cvCopy.
14)
cvLoadImage
函數原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
filename :要被讀入的文件的文件名(包括后綴);
flags :指定讀入圖像的顏色和深度:
指定的顏色可以將輸入的圖片轉為3信道(CV_LOAD_IMAGE_COLOR), 單信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保持不變(CV_LOAD_IMAGE_ANYCOLOR)。
深度指定輸入的圖像是否轉為每個顏色信道每象素8位,(OpenCV的早期版本一樣),或者同輸入的圖像一樣保持不變。
選中CV_LOAD_IMAGE_ANYDEPTH,則輸入
圖像格式可以為8位無符號,16位無符號,32位有符號或者32位
浮點型。
如果輸入有沖突的標志,將采用較小的數字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 將載入3信道圖。CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同時使用的優點,所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
如果想要載入最真實的圖像,選擇CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。
函數cvLoadImage從指定文件讀入圖像,返回讀入圖像的
指針。目前支持如下
文件格式:
Windows
位圖文件 - BMP, DIB;
JPEG文件 - JPEG, JPG, JPE;
便攜式網絡圖片- PNG;
便攜式圖像格式 - PBM,PGM,PPM;
Sun rasters - SR,RAS;
TIFF文件 - TIFF,TIF;
OpenEXR HDR 圖片 - EXR;
JPEG 2000 圖片- jp2。
cvSaveImage
保存圖像到文件
int cvSaveImage( const char* filename, const CvArr* image );
filename
文件名。
image
要保存的圖像。
函數cvSaveImage保存圖像到指定文件。圖像格式的的選擇依賴於filename的擴展名,請參考cvLoadImage。只有8位單通道或者3通道(通道順序為'BGR' )可以使用這個函數保存。如果格式,深度或者通道不符合要求,請先用cvCvtScale 和
cvCvtColor轉換;或者使用通用的cvSave保存圖像為XML或者YAML格式。
特別提醒!由於TIFF文件格式比較混亂,難以統一,此函數讀取TIFF圖片可能會失敗。
cvLoadImage( filename, -1 ); 默認讀取圖像的原通道數
cvLoadImage( filename, 0 ); 強制轉化讀取圖像為灰度圖
cvLoadImage( filename, 1 ); 讀取彩色圖
例:將讀入圖像強制轉換為
灰度圖像顯示
1 #include <highgui.h>
2
3 #include <cv.h>
4
5 int main(int argc, char **argv)
6
7 {
8
9 if (argc != 2)
10
11 return -1;
12
13 /*強制轉換為灰度圖像*/
14
15 IplImage *img = cvLoadImage(argv[1], 0);
16
17 cvNamedWindow("example");
18
19 cvShowImage("example", img);
20
21 cvWaitKey(0);
22
23 cvReleaseImage(&img);
24
25 cvDestroyWindow("example");
26
27 return 0;
28
29 }