图像的像素点操作

图像的像素点操作

 

  1. /*   
  2. 功能:读入图像文件,做图像反转,然后显示图像在屏幕上 
  3. */  
  4. #include "stdafx.h"  
  5. #include <stdlib.h>  
  6. #include <stdio.h>  
  7. #include <math.h>  
  8. #include <cv.h>  
  9. #include <highgui.h>  
  10. int main(int argc, char *argv[])  
  11. {  
  12.     IplImage* img = 0;   
  13.     int height,width,step,channels;  
  14.     uchar *data;  
  15.     int i,j,k;  
  16.     if(argc<2)  
  17.     {  
  18.         printf("Usage: main <image-file-name>/n/7");  
  19.         exit(0);  
  20.     }  
  21.     // 载入图像    
  22.     img=cvLoadImage(argv[1],-1);  
  23.     if(!img)  
  24.     {  
  25.         printf("Could not load image file: %s/n",argv[1]);  
  26.         exit(0);  
  27.     }  
  28.     // 获取图像信息  
  29.     height    = img->height;    
  30.     width     = img->width;    
  31.     step      = img->widthStep;    
  32.     channels  = img->nChannels;  
  33.     data      = (uchar *)img->imageData;  
  34.     printf("Processing a %dx%d image with %d channels/n",height,width,channels);   
  35.     // 创建窗口  
  36.     cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);   
  37.     cvMoveWindow("mainWin", 100, 100);  
  38.     // 反转图像  
  39.     for(i=0;i<height;i++)   
  40.         for(j=0;j<width;j++)   
  41.             for(k=0;k<channels;k++)  
  42.                 data[i*step+j*channels+k]=255-data[i*step+j*channels+k];  
  43.     // 显示图像  
  44.     cvShowImage("mainWin", img );  
  45.     cvWaitKey(0);  
  46.     cvReleaseImage(&img );  
  47.     printf("height=%d  width=%d step=%d channels=%d",height,width,step,channels);  
  48.     return 0;  
  49. }  
  50.   
  51. //  
  52. //IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );  
  53. //filename   
  54. //要被读入的文件的文件名。  
  55. //flags   
  56. //指定读入图像的颜色和深度:  
  57. //指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),   
  58. //单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)。  
  59. //深度指定输入的图像是否转为每个颜色信道每象素8位,(OpenCV的早期版本一样),或者同输入的图像一样保持不变。  
  60. //选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。  
  61. //如果输入有冲突的标志,将采用较小的数字值。  
  62. //比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3信道图。  
  63. //CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。  
  64. //但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,  
  65. //所以CV_LOAD_IMAGE_UNCHANGED不再使用了。  
  66. //如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。  
  67. //函数cvLoadImage从指定文件读入图像,返回读入图像的指针。目前支持如下文件格式:  
  68. //Windows位图文件 - BMP, DIB;  
  69. //JPEG文件 - JPEG, JPG, JPE;  
  70. //便携式网络图片 - PNG;  
  71. //便携式图像格式 - PBM,PGM,PPM;  
  72. //Sun rasters - SR,RAS;  
  73. //TIFF文件 - TIFF,TIF;  
  74. //OpenEXR HDR 图片 - EXR;  
  75. //JPEG 2000 图片- jp2。  
  76. //=======================================================================================  
  77. //IplImage  
  78. //  
  79. //IPL 图像头  
  80. //typedef struct _IplImage  
  81. //    {  
  82. //        int  nSize;         /* IplImage大小,=sizeof(IplImage)*/  
  83. //        int  ID;            /* 版本 (=0)*/  
  84. //        int  nChannels;     /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */  
  85. //        int  alphaChannel;  /* 被OpenCV忽略 */  
  86. //        int  depth;         /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,  
  87. //                               IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */  
  88. //        char colorModel[4]; /* 被OpenCV忽略 */  
  89. //        char channelSeq[4]; /* 被OpenCV忽略 */  
  90. //        int  dataOrder;     /* 0 - 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR;  
  91. //                                     1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。  
  92. //                                  cvCreateImage只能创建交叉存取图像 */  
  93. //        int  origin;        /* 0 - 顶—左结构,  
  94. //                               1 - 底—左结构 (Windows bitmaps 风格) */  
  95. //        int  align;         /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */  
  96. //        int  width;         /* 图像宽像素数 */  
  97. //        int  height;        /* 图像高像素数*/  
  98. //        struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */  
  99. //        struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */  
  100. //        void  *imageId;     /* 同上*/  
  101. //        struct _IplTileInfo *tileInfo; /*同上*/  
  102. //        int  imageSize;     /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/  
  103. //        char *imageData;  /* 指向排列的图像数据 */  
  104. //        int  widthStep;   /* 排列的图像行大小,以字节为单位 */  
  105. //        int  BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */  
  106. //        int  BorderConst[4]; /* 同上 */  
  107. //        char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */  
  108. //    }  
  109. //    IplImage;  
  110. //IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集:  
  111. //alphaChannel 在OpenCV中被忽略。  
  112. //colorModel 和channelSeq 被OpenCV忽略。  
  113. //OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。  
  114. //dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),  
  115. //然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。  
  116. //align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。  
  117. //不支持maskROI 。处理MASK的函数把他当作一个分离的参数。  
  118. //MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。  
  119. //tileInfo 不支持。  
  120. //BorderMode和BorderConst是不支持的。  
  121. //每个 OpenCV 函数处理像素的邻近的像素,  
  122. //通常使用单一的固定代码边际模式。  
  123. //除了上述限制,OpenCV处理ROI有不同的要求。  
  124. //要求原图像和目标图像的尺寸或 ROI的尺寸必须  
  125. //(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1)  
  126. //精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。  
  127. //======================================================================  
  128. //Processing a 512x512 image with 3 channels  
  129. //height=512  width=512 step=1536 channels=3请按任意键继续. . .  
  130. //从上述关系可以看出  
  131. //在C++内图像的存储是与Matlab不一样的  
  132. //是在C++内存储的方式是按照行列方式,每一行内存储了该列(所有层)的信息。  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值