IplImage访问图像像素值

OpenCV 中Iplimage结构详解 第一部分、Iplimage数据结构 阅读详情
opencv2.1版本之前使用IplImage*数据结构来表示图像,2.1之后的版本使用图像容器Mat来存储。IplImage结构体如下所示。
复制代码
 1 typedef struct _IplImage  
 2     {  
 3         int  nSize;         /* IplImage大小 */  
 4         int  ID;            /* 版本 (=0)*/  
 5         int  nChannels;     /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */  
 6         int  alphaChannel;  /* 被OpenCV忽略 */  
 7         int  depth;         /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, 
 8                                IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */  
 9         char colorModel[4]; /* 被OpenCV忽略 */  
10         char channelSeq[4]; /* 同上 */  
11         int  dataOrder;     /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. 
12                                cvCreateImage只能创建交叉存取图像 */  
13         int  origin;        /* 0 - 顶—左结构, 
14                                1 - 底—左结构 (Windows bitmaps 风格) */  
15         int  align;         /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */  
16         int  width;         /* 图像宽像素数 */  
17         int  height;        /* 图像高像素数*/  
18         struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */  
19         struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */  
20         void  *imageId;     /* 同上*/  
21         struct _IplTileInfo *tileInfo; /*同上*/  
22         int  imageSize;     /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/  
23         char *imageData;  /* 指向排列的图像数据 */  
24         int  widthStep;   /* 排列的图像行大小,以字节为单位 */  
25         int  BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */  
26         int  BorderConst[4]; /* 同上 */  
27         char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */  
28     }  
29     IplImage;  
复制代码

1、使用指针遍历图像像素

(1)单通道字节型图像像素访问

复制代码
 1 /*
 2 @author:CodingMengmeng
 3 @theme:Read the image pixel values
 4 @time:2017-3-16 11:27:31
 5 @blog:http://www.cnblogs.com/codingmengmeng/
 6 */
 7 #include <cv.h>  
 8 #include <highgui.h>  
 9 using namespace std;
10 using namespace cv;
11 int main(void)
12 {
13     IplImage* imgSrc = cvLoadImage("./inputData\\shuke1.jpg",0);
14     uchar* pixel = new uchar;
15     for (int i = 0; i < imgSrc->height; i++)
16     {
17         for (int j = 0; j < imgSrc->width; j++)
18         {
19             pixel = (uchar*)(imgSrc->imageData + i*imgSrc->widthStep+j);
20             cout << "pixel=" <<(*pixel)+0<< endl;//+0隐式转换为整型,否则会打印出字符
21         }
22     }
23     delete pixel;
24     return 0;
25 }
复制代码

输出结果是0-255灰度级的灰度值。

其中(uchar*)(imgSrc->imageData + i*imgSrc->widthStep+j)的具体含义:

(a)imgSrc->imageData指向图像第一行的首地址,i是指当前像素点所在的行,widthStep是指图像每行所占的字节数;所以imgSrc->imageData + i*imgSrc->widthStep表示该像素点所在行的首地址;j表示当前像素点所在列,所以imgSrc->imageData + i*imgSrc->widthStep+j即表示该像素点的地址。而因为IplImage->ImageData 的默认类型是 char 类型,所以再对图像像素值进行操作时,要使用强制类型转换为unsigned char,再对其进行处理。否则,图像像素值中,会有负值出现。

(b)widthStep表示存储一行像素需要的字节数

一个m*n的单通道字节型图像,其imageData排列如下:

因为opencv分配的内存是按4字节对齐的,所以widthStep必须是4的倍数,如果8U图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空在那儿不用。也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。

 

(2)三通道字节型图像像素访问

多通道字节型图像的imageData排列如下:

其中(Bi,Bj)(Gi,Gj)(Ri,Rj)表示图像(i,j)处BGR分量的值。

复制代码
 1 /*
 2 //@author:CodingMengmeng
 3 //@theme:Read the image pixel values
 4 //@time:2017-3-16 11:59:17
 5 //@blog:http://www.cnblogs.com/codingmengmeng/
 6 */
 7 #include <cv.h>  
 8 #include <highgui.h>  
 9 using namespace std;
10 using namespace cv;
11 int main(void)
12 {
13     IplImage* imgSrc = cvLoadImage("./inputData\\shuke1.jpg");
14     uchar* b_pixel = new uchar;
15     uchar* g_pixel = new uchar;
16     uchar* r_pixel = new uchar;
17     for (int i = 0; i < imgSrc->height; i++)
18     {
19         for (int j = 0; j < imgSrc->width; j++)
20         {
21             b_pixel = (uchar*)(imgSrc->imageData + i*imgSrc->widthStep + (j*imgSrc->nChannels + 0));
22             g_pixel = (uchar*)(imgSrc->imageData + i*imgSrc->widthStep + (j*imgSrc->nChannels + 1));
23             r_pixel=(uchar*)(imgSrc->imageData + i*imgSrc->widthStep + (j*imgSrc->nChannels + 2));
24             cout << "b_pixel=" << *b_pixel+0 << endl;
25             cout << "g_pixel=" << *g_pixel+0 << endl;
26             cout << "r_pixel=" << *r_pixel+0 << endl;
27             cout << "/********************************************/" << endl;
28         }
29     }
30     delete b_pixel;
31     delete g_pixel;
32     delete r_pixel;
33     return 0;
34 }
复制代码

 

运行结果:

 

2、使用cvGet2D()函数访问

cvGet*D系列函数可以用来返回特定位置的数组元素(一般使用cvGet2D),原型如下:

1 CvScalar cvGet1D( const CvArr* arr, int idx0 );  
2 CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );  
3 CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );  
4 CvScalar cvGetND( const CvArr* arr, int* idx );  

(1)单通道图像像素访问

复制代码
 1 /*
 2 @author:CodingMengmeng
 3 @theme:Read the image pixel values
 4 @time:2017-3-16 15:12:57
 5 @blog:http://www.cnblogs.com/codingmengmeng/
 6 */
 7 #include <cv.h>  
 8 #include <highgui.h>  
 9 using namespace std;
10 using namespace cv;
11 int main(void)
12 {
13     IplImage* imgSrc = cvLoadImage("./inputData\\shuke1.jpg",0);
14     CvScalar pixel_v;
15     /*
16     CvScalar是一个可以用来存放4个double数值的数组
17     一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的
18     如何赋值:
19     a) 存放单通道图像中像素:cvScalar(255);
20     b) 存放三通道图像中像素:cvScalar(255,255,255);
21     c)只使用第一个通道,val[0]=val0;等同于cvScalar(val0,0,0,0);
22     */
23     for (int i = 0; i < imgSrc->height; i++)
24     {
25         for (int j = 0; j < imgSrc->width; j++)
26         {
27             pixel_v = cvGet2D(imgSrc, i, j);
28             cout << "pixel=" << pixel_v.val[0] << endl;
29         }
30     }
31     return 0;
32 }
复制代码

注意:

对于图像中的某一像素点 P(x, y), 在我们正常的坐标系中,x代表其横坐标,y代表其纵坐标;而在opencv的函数cvGet2D()的函数原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1); 函数返回的是一个CvScalar 容器,其参数中也有两个方向的坐标,但跟我们平常习惯的坐标不一样的是,idx0代表是的行,即高度,对应于我们平常坐标系的y, idx1代表的是列,即宽度,对应于我们平常坐标系的x使用时请千万别弄反,否则容易出现溢出引发异常。

(2)多通道字节型/浮点型图像像素访问

复制代码
 1 /*
 2 @author:CodingMengmeng
 3 @theme:Read the image pixel values
 4 @time:2017-3-16 15:18:29
 5 @blog:http://www.cnblogs.com/codingmengmeng/
 6 */
 7 #include <cv.h>  
 8 #include <highgui.h>  
 9 using namespace std;
10 using namespace cv;
11 int main(void)
12 {
13     IplImage* imgSrc = cvLoadImage("./inputData\\shuke1.jpg");
14     CvScalar pixel_v;
15     /*
16     CvScalar是一个可以用来存放4个double数值的数组
17     一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的
18     如何赋值:
19     a) 存放单通道图像中像素:cvScalar(255);
20     b) 存放三通道图像中像素:cvScalar(255,255,255);
21     c)只使用第一个通道,val[0]=val0;等同于cvScalar(val0,0,0,0);
22     */
23     for (int i = 0; i < imgSrc->height; i++)
24     {
25         for (int j = 0; j < imgSrc->width; j++)
26         {
27             pixel_v = cvGet2D(imgSrc, i, j);
28             cout << "b_pixel=" << pixel_v.val[0] << endl;//B分量
29             cout << "g_pixel=" << pixel_v.val[1] << endl;//G分量
30             cout << "r_pixel=" << pixel_v.val[2] << endl;//R分量
31             cout << "/********************************************/" << endl;
32         }
33     }
34     return 0;
35 }
复制代码

运行结果:

opencv中图像数据结构总结 opencv中常见的与图像操作有关的数据结构有Mat,cvMat和IplImage. 阅读详情

相关推荐

OpenCV IplImage 结构详解

IplImage 结构是 OpenCV 早期版本中使用的图像表示方式,它已被新的 Mat 数据结构所取代。然而,了解 IplImage 结构仍然有助于理解 OpenCV 的历史和一些遗留代码库。IplImage 是 OpenCV 中用于表示图像的重要数据结构之一。在本文中,我们将详细讨论 IplImage 结构,包括其成员变量和用法,并提供相应的源代码示例。这是一个简单的示例,演示了如何使用 IplImage 结构加载和显示图像。希望本文能够帮助你理解和使用 OpenCV 中的 IplImage 结构。

UtiExamples的博客 276

CvMat、Mat、IplImage之间的转换详解及实例

IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构; 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口; Mat: Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数; 在...

u011555996的博客 4281

【笔记整理】轻量级神经网络 MobileNetV3

【笔记整理】轻量级神经网络 MobileNetV3

qq_33934427的博客 4274

Opencv IplImage 和 Mat 使用介绍

IplImage是OpenCV中CxCore部分基础的数据结构,用来表示图像,其中Ipl是Intel Image Processing Library的简写。以下是IplImage的结构分析。OpenCV中文网站/* IplImage大小 */ int ID;/* 版本 (=0)*/ int nChannels;/* 大多数OPENCV函数支持1,2,3 或 4 个通道 */ int alphaChannel;/* 被OpenCV忽略 */ int depth;

@bangbang的博客 2704

单机多环境部署apollo 2.3.0

理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在

Life is a starting point everywhere 1300

动态掩码语言模型(MLM)优化策略:效率提升与最新技术实践

本文深入探讨了动态掩码语言模型(MLM)的优化策略与技术实践,涵盖核心原理、效率优化及2025年最新突破。重点解析了动态掩码在提升模型性能中的关键作用,包括工程实现、掩码策略演进及混合专家动态掩码等创新技术,为自然语言处理领域的研究与应用提供实用指南。

vscode5coder的博客 231

opencv笔记(九)——Mat和IPLImage

       OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘记释放内存,就会造成内存泄漏。从OpenCV2开始,开始使用Mat类存储图像,其新的C++接口,cv::Mat代替了原来c风格的CvMat和IplImage。目前,2.0版本对c的接口也是支持的。          相对于c的接口,c++的cv::Mat统一了矩阵和图像这两个概念。事实上,矩阵和图像其实...

qq_37764129的博客 1万+

音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

本文主要1-3部分介绍AAC封装格式ADIF,ADTS和LATM,同时因为从mp4等封装容器有extradata模式,故也第4部分介绍extradata模式。最后第5部分介绍AAC压缩数据存储方式。

littlezls的博客 4938

【OpenCV】访问图像像素值并修改--IplImage

访问图像像素值并修改【IplImage】

summer的博客 4757

python123题目——判断火车票座位B(异常)

类型:流程控制。

m0_62488776的博客 3569

SAP BOM批量反查代码分享

SAP BOM反查批量查询代码分享

我小时候很黑的博客 4973

【OpenCV】访问图像中每个像素的值

转载请注明出处:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7557063 !!此篇是基于IplImage* (C接口或者说2.1之前版本的接口,新的Mat的访问方式请参考博文: 《访问Mat图像中每个像素的值》) IplImage是OpenCV中CxCore部分基础的数据结构,用来表示图像,其中Ipl是Intel Image P

小魏的修行路 10万+

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7473

访问Mat图像中的每个像素的值和IplImage格式图像中每个像素的值

访问Mat图像中的每个像素的值:见大神的http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7771760 访问IplImage格式图像中每个像素的值:见大神的http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7557063

drrlalala的专栏 803

推荐系统(一)概述

在互联网领域,推荐系统(Recommendation Systems)的应用非常广泛。在音视频方面,如抖音、快手、哔哩等;在电商平台方面,如京东、淘宝、拼多多等。推荐有助于帮助用户快速发现潜在感兴趣的内容(音视频、商品、新闻等信息流),从而提升用户体验,同时有助于提升商业效率。从本文开始,笔者将结合自身在信息流推荐领域的经验,通过系列文章对推荐系统展开介绍。

Jin_Kwok的博客 6085

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

简单总结下OPENCV访问像素值的方法

OPENCV 访问图像像素值简单总结下OPENCV中几种数据类型访问图片像素值的方法,有Mat类型,IplImage类型,CvMat 类型。以下均是针对灰度图,彩色图其实就是对应三个通道的操作。 1. Mat 类型 for (int i = 0; i < img.rows; i++) { for (int j = 0; j < img.cols; j++) { cout << (int

IT花生的博客 468

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【OpenCV】访问图像中每个像素的值 (I)

最近要做opencv的

This is bill的专属博客 2057

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

opencv获取像素值

1. 通过指针访问像素值 IplImage *Temp=*iterIplOri; uchar *dataaa=(uchar*)Temp->imageData; int step=Temp->widthStep/sizeof(uchar); int channals=Temp->nChannels; int r=0,g=0,b=0; for (int jj=Temp->heig...

zhaoyan123477的博客 1613

opencv 表示图像的IplImage

一、IplImage 大部分内容摘抄自http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7557063 OpenCV资料:http://blog.youkuaiyun.com/to_utopia/article/details/4856171 IplImage是表示一个图像的结构体,因为之前的OpenCV是用C语言编写的,所以IplImage提供的接口是C语

Summer的博客 831

Opencv得到图像(IplImage)中的像素

IplImage结构来自于 Intel Image Processing Library(是其本身所具有的)。OpenCV 只支持其中的一个子集: 来自于http://wiki.opencv.org.cn/index.php/Cxcore%e5%9f%ba%e7%a1%80%e7%bb%93%e6%9e%84 typedef struct _IplImage {

vivian187的博客 4531

opencv学习(六)书本《学习Opencv》(中文版)第四章的作业答案第二题(opencv3.0.0+VS2012+win7)

显示坐标很简单,但是显示RGB就必须要非常了解IPlImage结构如何获取数据了,书上讲的非常繁杂,下面仔细分析一下IPlImage结构, opencv最重要的结构体是IplImage结构。从本质上讲,这是一个CvMat对象,但它还有一些其他成员变量将矩阵解释为图像 IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* I

liulj95的博客 996

IplImage访问图像中每个像素的值

转载请注明出处:http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7557063 !!此篇是基于IplImage* (C接口或者说2.1之前版本的接口,新的Mat的访问方式请参考博文: 《访问Mat图像中每个像素的值》) IplImage是OpenCV中CxCore部分基础的数据结构,用来表示图像,其中Ipl是Intel Image P

lien0906的专栏 5822

opencv访问图像中每个像素的值

【OpenCV】访问图像中每个像素的值 分类: 【图像处理】 struct数据结构processinglibrarywindowsimage 目录(?)[+] http://blog.youkuaiyun.com/xiaowei_cqu/article/details/7557063 !!此篇是基于IplImage* (C接口或者说2.1之前版本的接口,新

s12244315的博客 1012

OpenCV中读取图像像素值

OpenCV中用于读取图像像素点的值的方法很多,这里主要提供了两种常用的方法。 方法一 利用IplImage数据类型的imageData定位数据缓冲区来实现,imageData包含指向图像第一个像素数据的指针 例: If( imgSource != 0 )//imgSource为IplImage* { for ( int i = 0; i height; ++i ) {

没有蛀牙lm的博客 2811
上一篇: Mat类详解
下一篇: CreateThread函数
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值