Open CV 学习开发笔记之图像的输入、输出(二)

来源:互联网 发布:国外视频软件 编辑:程序博客网 时间:2024/06/05 03:17

图像的表示

日常开发中,我们可以看到各种各样的美丽图像,但是在计算机看来,这幅图像只是一堆亮度各异的点。例如:一副尺寸为M×N的图像可以用一个M×N的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。
一般来说,灰度图用2维矩阵表示:
灰度图像的存储示意图
这里写图片描述
lij 表示第i行j列的像素值
彩色(多通道)图像用3维矩阵表示,目前大部分设备都是用无符号8位整数(类型为 CV_8U)表示像素亮度。
多通道图像,比如RGB图像,则每个像素用三个字节表示,RGB图像的通道顺序为BGR。存储示意图如下:
这里写图片描述

图像的显示

构建Mat对象,创建图像
    /*     创建一个行数为320,列数为480,图像元素是8位无符号整数类型,且有三个通道。图像的初始值为(255,0,0)     图像的实际尺寸为宽480 高320     */  cvImage = Mat(320, 480, CV_8UC3,Scalar(255, 0, 0));  UIImage * tmpImage = MatToUIImage(cvImage);  self.imageV.image = tmpImage;  [self.view addSubview:self.imageV];

这里写图片描述

  • Mat::Mat() 无参数构造方法
  • Mat::Mat(int rows,int cols,int type) 创建行数为rows,列数为cols,类型为type的图像
  • Mat::Mat(Size size,int type) 创建大小为size ,类型为type的图像。
  • Mat::Mat(int rows,int cols, int type, const Scalar &s) 创建行数为rows,列数为cols,类型为type的图像,并将所有的元素值初始化为s.

备注:在这些构造函数中,很多设计到类型type. type可以是CV_8UC1、CV_16SC1,…CV_64FC4等。里面的8U表示8位无符号整数,16S表示16位有符号整数,64F表示浮点数。C后面跟的数字表示是通道数,例如C1表示一个通道的图像,C4表示的4个通道的图像,一次类推。
如果你需要更多的通道数,可以用上宏CV_8UC(n). n为整数。

图片的读取,以及显示
 UIImage* image = [UIImage imageNamed:@"lena.png"]; UIImageToMat(image, cvImage); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; [self.view addSubview:self.imageV];

效果如下:
这里写图片描述

其他读取方式:

   UIImage* image = [UIImage imageNamed:@"lena.png"];   NSData* data = UIImagePNGRepresentation(image);       /*     InputArray  buf :输入图像     int flags      flags > 0 该函数返回3通道图像,如果磁盘上的图像文件时单通道的灰度图像,则会被强制转为3通道     flags = 0 该函数返回单通道图像,如果磁盘的图像文件时多通道图像,则会被强制转换为单通道     flags < 0 该函数下不对图像进行通道转换     CV_LOAD_IMAGE_UNCHANGED,这个标识在新版本中被废置了,可以忽略。     CV_LOAD_IMAGE_ANYDEPTH ,  如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回     CV_LOAD_IMAGE_COLOR, 如果取这个标识的话,总是转换图像到彩色一体     CV_LOAD_IMAGE_GRAYSCALE, 如果取这个标识的话,始终将图像转换成灰度1     如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3通道图。     如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。     输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。     */   cvImage = cv::imdecode(Mat(1, [data length], CV_8UC1,(void*)data.bytes),CV_LOAD_IMAGE_UNCHANGED);  UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; [self.view addSubview:self.imageV];

图像的输出

引用示例

 UIImage* image = [UIImage imageNamed:@"lena.png"]; UIImageToMat(image, cvImage); UIImage * tmpImage = MatToUIImage(cvImage); self.imageV.image = tmpImage; //图像的输出  BOOL isSussess = imwrite("/Users/BruceLv/Desktop/demo/lena.png", cvImage); [self.view addSubview:self.imageV];
    /*     filename: 文件的格式由filename参数指定的文件的扩展名。推荐使用png文件格式。 bmp格式是无损格式,但是一般不进行压缩,文件尺寸非常大。 jpeg格式的文件较小,但是属于有损压缩,会丢失一些信息。png是无损压缩,推荐使用。     image 输入图像     params 可以指定文件格式的一些信息。 这个参数的数值跟文件的格式有关系。     jpeg:表示图像的质量。取值范围是0-100.数值越大表示图像的质量越高,当然文件也就越大。默认是95     png 表示压缩的级别 取值范围是0-9 数值越大表示的文件就越小,但是花费的压缩的时间就越长 默认是3     ppm pgm pbm 表示文件是以二进制还是纯文本方式存储,取值为0或1.如果取值为1,则表示以二进制方式存储。默认值是1.     并不是所有的Mat对象都可以存储为图像文件,目前支持的格式只有8U类型的单通道和3通道矩阵。如果需要保存16U格式图像,只能使用png jpeg tiff格式。如果希望其他的格式可以保存为图像文件,可以先用Mat::convertTo()函数或者是cvtColor函数将矩阵转换为可以保存的格式     */bool imwrite( const String& filename, InputArray img,              const std::vector<int>& params = std::vector<int>());
阅读全文
0 0
原创粉丝点击