OpenCV(四)图像的基本操作

1.读取图片

Mat image_mat = imread("F:\\a.jpg");  //缺省条件3通道
Mat img = imread(filename, 0);  //单通道(灰度)

1) CV_LOAD_IMAGE_UNCHANGED (<0),以原始图像读取(包括alpha通道),
2) CV_LOAD_IMAGE_GRAYSCALE ( 0),以灰度图像读取
3) CV_LOAD_IMAGE_COLOR (>0),以RGB格式读取
———————————————————————————————————————————————
enum {
/* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED  =-1, //废弃
/* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */CV_LOAD_IMAGE_COLOR      =1,  //
/* any depth, ? */CV_LOAD_IMAGE_ANYDEPTH   =2 //如果不是16或32为返回8位图像
/* ?, any color */  CV_LOAD_IMAGE_ANYCOLOR   =4
};
——————————————————————————————————————————————

2.保存图片(写入)

Mat img = imwrite(filename); 
imwrite函数用于将图像保存到指定的文件。
图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名一样.。
Windows位图 - *.bmp, *.dib
JPEG文件 - *.jpeg, *.jpg, *.jpe
JPEG 2000文件- *.jp2
PNG图片 - *.png
便携文件格式- *.pbm, *.pgm, *.ppm
Sun rasters光栅格式 - *.sr, *.ras
TIFF 文件 - *.tiff, *.tif

3.将RGB图像转换成灰度图像

cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 );
cvtColor(image0,gray,CV_RGB2GRAY,0);
参数code:颜色空间转换代码;
参数dstCn:目标图像的通道数,如果该参数为0,则通道数可由src和code自动获得;

对于一个原图像或目标图像是RGB的转换,我们需要详细地指定通道的顺序(RGB or BGR)。
我们注意到,OpenCV默认情况下的颜色格式一般是指RGB,但实际上却进行了一个反转变成BGR,
因此对一个标准的24位图像来说,其第一个字节为8位的蓝色部分,其次是绿色,接着是红色,
再然后就是第二个像素,同样以BGR的通道顺序排列。

常规的RGB通道的值的范围如下:
对于8位无符号精度图像(CV_8U Images),其范围是0~255
对于16位无符号精度图像(CV_16U Images),其范围是0~65535
对于32位单精度浮点型图像(CV_32F Images),其范围是0~1

在线性变换的情况下,我们可以不用考虑其通道的取值范围,
但对于非线性变换(Non-Linear Transformation),
一个RGB输入图像应该先做规格化处理(Normalized),以便得到一个合适的范围来获取正确的结果。

比如对于一个RGB颜色空间到LUV颜色空间的变换,如果我们需要将一副8位图像转换到一副32位的浮点型精度图像而不进行任何缩放,
也就是说,我们将一个从0~255的范围替换成0~1的范围,那么我们首先要将图像按比例缩小(Scale the Image Down):
img *= 1./255;
cvtColor(img, img, CV_BGR2Luv);
如果我们采用8位的图像进行转换,该过程中可能会有信息的丢失,尽管在一般的应用中,
这种丢失并不明显(Noticeable),但我们强烈建议使用一个32位的图像或者在变换之前先转换成32位。

4.图像的显示

void imshow(const string&winname, InputArray mat); 

imshow 函数用于在指定的窗口中显示图像。
说道这个函数不得不提另外一个函数创建一个命名的窗口
void  namedWindow( const  string& winname, int  flags=WINDOW_AUTOSIZE );
第二个参数:  
  • WINDOW_NORMAL   用户便可以改变窗口的大小(没有限制)
  • WINDOW_AUTOSIZE  窗口大小会自动调整以适应所显示的图像,大小固定。
  • WINDOW_OPENGL    窗口创建的时候便会支持OpenGL。
然后,回到imshow()函数,第一个参数指定命名的窗口,如果不存在则新建一个(默认指定固定大小的窗口)
对于函数对图像的缩放,取决于图像的深度:

  • 如果载入的图像是8-bit unsigned,就显示图像本来的样子。
  • 如果图像是6-bit unsigned 或32-bit integer,便用像素值除以256。
  • 如果图像是32-bit floating-point,像素值便要乘以255。

5. 查看图片在MAT中的存储

image.data 是指向已分配的内存块的指针,当图片没有加载进来,则为NULL
image.size()返回的是一个结构体,实际上包括width和height这两个成员变量。

6.图片的翻转

flip(image,result,0); 
//其中正数表示水平反转
//0表示垂直反转
//负数表示既有水平又有垂直反转


7.深拷贝和浅拷贝

只有通过clone 和copyTo才是深拷贝
Mat B,C;
B = image.clone();       // 第一种方式
image.copyTo(C); // 第二种方式

//浅拷贝, 共享内存空间
Mat B;
B= image ; // 第一种方式
Mat C(image); // 第二种方式



IplImage装换为Mat

IplImage*iplImage = cvLoadImage( "F:\\11.jpg",1); 
Mat image2(iplImage,false);
// 其中false为浅拷贝,而true为深拷贝,默认为false。此时注意需要释放iplImage

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值