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 }