opencv读取,显示,写入图片(关于imwrite函数)

转载于:http://windrocblog.sinaapp.com/?p=465

OpenCV学习笔记(一):读取、显示、保存图片

OpenCV中最基本的操作:读取、显示、保存图片。

OpenCV2.0版本引入与Matlab命令相同的函数,imread、imshow、imwrite,获取图片更将方便。

读取文件 imread

其中flags表示载入后图片的颜色模式。

CV_LOAD_IMAGE_UNCHANGED (0) 以RGB模式载入图片

显示图片需要一个窗口。

创建窗口 namedWindow

CV_WINDOW_AUTOSIZE 窗口大小自动调整到显示图片的大小
CV_WINDOW_NORMAL 只在Qt中使用,可以改变窗口大小

显示图片 imshow

在窗口中显示图片,对于NORMAL的窗口,把图片缩放到窗口固定大小,再显示。根据图像数据的深度,对图像进行下面的处理:

8-bit unsigned 直接显示
16-bit unsigned or 32-bit integer 像素点值除以256,即把[0,255*256] 映射到 [0,255]
32-bit floating-point 像素点值乘以255,即把[0,1] 映射到 [0,255]

所以,imshow可以正常显示取值范围[0,255]的uchar型图像、取值范围[0,1]的float或double类型图像,中间一种数据格式没用过。

显示图像后,为了避免程序向下运行以致窗口一闪而过,需要等待一旦时间,waitKey正是这个功能。

等待键盘按键 waitKey

delay小于等于0时,一直等待,只到用户按键,再继续执行。
delay大于0时,在delay微秒内等待用户按键。

处理过的图像需要保存到文件中。

保存图像 imwrite

params中的每个参数成对出现,即paramId_1, paramValue_1, paramId_2, paramValue_2, … ,当前支持如下参数:

JPEG:压缩质量 ( CV_IMWRITE_JPEG_QUALITY ),从0到100(数值越高质量越好),默认值为95。
PNG:compression level ( CV_IMWRITE_PNG_COMPRESSION ) 从0到9。 数值越高,文件大小越小,压缩时间越长。默认值为3。
PPM, PGM, or PBM:二进制标志 ( CV_IMWRITE_PXM_BINARY ),0 或 1。默认值为1。

还有一组函数,用于从内存读取数据和向内存写入数据。

从内存读图片 imdecode

写图片到内存 imencode

ext – 图片的扩展名
img – 要保存的图片
buf – 输出缓存,改变大小以适应数据
params – 格式相关的参数,参见imwrite。

上面两个函数的示例代码如下所示,来自http://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63 。

#include <iostream>
#include <fstream>
#include <cv.h>
#include <highgui.h>
using namespace std ;
using namespace cv ;
 
double getPSNR ( Mat & src1 , Mat & src2 , int bb = 0 ) ;
 
int main ( int argc , char * * argv )
{
         Mat src = imread ( "lenna.png" ) ;
 
         //(1) jpeg compression
         vector < uchar > buff ; //buffer for coding
         vector < int > param = vector < int > ( 2 ) ;
         param [ 0 ] = CV_IMWRITE_JPEG_QUALITY ;
         param [ 1 ] = 95 ; //default(95) 0-100
 
         imencode ( ".jpg" , src , buff , param ) ;
         cout << "coded file size(jpg)" << buff . size ( ) << endl ; //fit buff size automatically.
         Mat jpegimage = imdecode ( Mat ( buff ) , CV_LOAD_IMAGE_COLOR ) ;
 
         //(2) png compression
         param [ 0 ] = CV_IMWRITE_PNG_COMPRESSION ;
         param [ 1 ] = 3 ; //default(3)  0-9.
         imencode ( ".png" , src , buff , param ) ;
         cout << "coded file size(png)" << buff . size ( ) << endl ;
         Mat pngimage = imdecode ( Mat ( buff ) , CV_LOAD_IMAGE_COLOR ) ;
 
         //(3) intaractive jpeg compression
         char name [ 64 ] ;
         namedWindow ( "jpg" ) ;
         int q = 95 ;
         createTrackbar ( "quality" , "jpg" , &q , 100 ) ;
         int key = 0 ;
         while ( key != 'q' )
         {
                 param [ 0 ] = CV_IMWRITE_JPEG_QUALITY ;
                 param [ 1 ] = q ;
                 imencode ( ".jpg" , src , buff , param ) ;
                 Mat show = imdecode ( Mat ( buff ) , CV_LOAD_IMAGE_COLOR ) ;
 
                 double psnr = getPSNR ( src , show ) ; //get PSNR
                 double bpp = 8.0 * buff . size ( ) / ( show . size ( ) . area ( ) ) ; //bit/pixe;
                 sprintf ( name , "quality:%03d, %.1fdB, %.2fbpp" , q , psnr , bpp ) ;
                 putText ( show , name , Point ( 15 , 50 ) , FONT_HERSHEY_SIMPLEX , 1 , CV_RGB ( 255 , 255 , 255 ) , 2 ) ;
                 imshow ( "jpg" , show ) ;
                 key = waitKey ( 33 ) ;
 
                 if ( key == 's' )
                 {
                         //(4) data writing
                         sprintf ( name , "q%03d_%.2fbpp.png" , q , bpp ) ;
                         imwrite ( name , show ) ;
 
                         sprintf ( name , "q%03d_%.2fbpp.jpg" , q , bpp ) ;
                         param [ 0 ] = CV_IMWRITE_JPEG_QUALITY ;
                         param [ 1 ] = q ;
                         imwrite ( name , src , param ) ; ;
                 }
         }
}
double getPSNR ( Mat & src1 , Mat & src2 , int bb )
{
         int i , j ;
         double sse , mse , psnr ;
         sse = 0.0 ;
 
         Mat s1 , s2 ;
         cvtColor ( src1 , s1 , CV_BGR2GRAY ) ;
         cvtColor ( src2 , s2 , CV_BGR2GRAY ) ;
 
         int count = 0 ;
         for ( j = bb ; j < s1 . rows - bb ; j ++ )
         {
                 uchar * d = s1 . ptr ( j ) ;
                 uchar * s = s2 . ptr ( j ) ;
 
                 for ( i = bb ; i < s1 . cols - bb ; i ++ )
                 {
                         sse += ( ( d [ i ] - s [ i ] ) * ( d [ i ] - s [ i ] ) ) ;
                         count ++ ;
                 }
         }
         if ( sse == 0.0 || count == 0 )
         {
                 return 0 ;
         }
         else
         {
                 mse = sse / ( double ) ( count ) ;
                 psnr = 10.0 * log10 ( ( 255 * 255 ) / mse ) ;
                 return psnr ;
         }
}

释放窗口 destroyWindow  destroyAllWindow


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值