当前位置: 首页 > news >正文

图像的像素点操作【OpenCV学习笔记3】

/* 功能:读入图像文件,做图像反转,然后显示图像在屏幕上 */ #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k; if(argc<2) { printf("Usage: main <image-file-name>\n\7"); exit(0); } // 载入图像 img=cvLoadImage(argv[1],-1); if(!img) { printf("Could not load image file: %s\n",argv[1]); exit(0); } // 获取图像信息 height = img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels\n",height,width,channels); // 创建窗口 cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100, 100); // 反转图像 for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++) data[i*step+j*channels+k]=255-data[i*step+j*channels+k]; // 显示图像 cvShowImage("mainWin", img ); cvWaitKey(0); cvReleaseImage(&img ); printf("height=%d width=%d step=%d channels=%d",height,width,step,channels); return 0; } // //IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR ); //filename //要被读入的文件的文件名。 //flags //指定读入图像的颜色和深度: //指定的颜色可以将输入的图片转为3信道(CV_LOAD_IMAGE_COLOR)也即彩色(>0), //单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0), 或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)。 //深度指定输入的图像是否转为每个颜色信道每象素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。 //======================================================================================= //IplImage // //IPL 图像头 //typedef struct _IplImage // { // int nSize; /* IplImage大小,=sizeof(IplImage)*/ // int ID; /* 版本 (=0)*/ // int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */ // int alphaChannel; /* 被OpenCV忽略 */ // int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, // IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */ // char colorModel[4]; /* 被OpenCV忽略 */ // char channelSeq[4]; /* 被OpenCV忽略 */ // int dataOrder; /* 0 - 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR; // 1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。 // cvCreateImage只能创建交叉存取图像 */ // int origin; /* 0 - 顶—左结构, // 1 - 底—左结构 (Windows bitmaps 风格) */ // int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */ // int width; /* 图像宽像素数 */ // int height; /* 图像高像素数*/ // struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */ // struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */ // void *imageId; /* 同上*/ // struct _IplTileInfo *tileInfo; /*同上*/ // int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/ // char *imageData; /* 指向排列的图像数据 */ // int widthStep; /* 排列的图像行大小,以字节为单位 */ // int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */ // int BorderConst[4]; /* 同上 */ // char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */ // } // IplImage; //IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集: //alphaChannel 在OpenCV中被忽略。 //colorModel 和channelSeq 被OpenCV忽略。 //OpenCV颜色转换的唯一函数 cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。 //dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取), //然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。 //align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。 //不支持maskROI 。处理MASK的函数把他当作一个分离的参数。 //MASK在 OpenCV 里是 8-bit,然而在 IPL他是 1-bit。 //tileInfo 不支持。 //BorderMode和BorderConst是不支持的。 //每个 OpenCV 函数处理像素的邻近的像素, //通常使用单一的固定代码边际模式。 //除了上述限制,OpenCV处理ROI有不同的要求。 //要求原图像和目标图像的尺寸或 ROI的尺寸必须 //(根据不同的操作,例如cvPyrDown 目标图像的宽(高)必须等于原图像的宽(高)除以2 ±1) //精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。 //====================================================================== //Processing a 512x512 image with 3 channels //height=512 width=512 step=1536 channels=3请按任意键继续. . . //从上述关系可以看出 //在C++内图像的存储是与Matlab不一样的 //是在C++内存储的方式是按照行列方式,每一行内存储了该列(所有层)的信息。

相关文章:

  • 简单弹出视图
  • 文件的保存【OpenCV学习笔记4】
  • 清除vs2005、vs2008起始页最近打开项目
  • 51单片机-红外遥控解码
  • 汇编实验课程设计1
  • [转]实验室小科普之:方便又健康——洗水果的学问
  • C++ is on the way 8: 类初始化列表的分析总结
  • 异步DNS解析的实现
  • 图像绘制功能【OpenCV学习笔记5】
  • nopCommerce 3.3正式发布及新增功能改进
  • 对视频流进行边缘检测【OpenCV学习笔记6】
  • 发布一快速开发报表的类库,让报表的开发具有前所未有的方便和快速
  • 一个实用并且确实的内核补丁--关于桥接nat的
  • PHP数据连接主键与外键!
  • 封建制度的意义
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  •  D - 粉碎叛乱F - 其他起义
  • echarts的各种常用效果展示
  • ES6系统学习----从Apollo Client看解构赋值
  • Go 语言编译器的 //go: 详解
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • ViewService——一种保证客户端与服务端同步的方法
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 详解移动APP与web APP的区别
  • 小而合理的前端理论:rscss和rsjs
  • 正则与JS中的正则
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 如何正确理解,内页权重高于首页?
  • ​iOS实时查看App运行日志
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #if和#ifdef区别
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)nsfocus-绿盟科技笔试题目
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net环境下的缓存技术介绍
  • .php文件都打不开,打不开php文件怎么办
  • ::什么意思
  • [ C++ ] STL_list 使用及其模拟实现
  • [2018-01-08] Python强化周的第一天
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯