OpenCV学习之基本概念

OpenCV学习之基本概念

文章目录

    • OpenCV学习之基本概念
      • 1.访问像素级
      • 2.基本API概念-Mat
      • 3.直方图

1.访问像素级

方法一:使用模板函数at<>,必须指出矩阵单元类型

Mat src1=imread("lena.jpg",IMREAD_GRAYSCALE);
uchar pixel1=src1.at<uchar>(0,0);
Mat src2=imread("lena.jpg",IMREAD_COLOR);
Vec3b pixel2=src2.at<Vec3b>(0,0);

请注意:at<>方法并不是很有效,因为必须从像素的行列计算出精确的内存位置。当逐个处理整幅图像中的像素是非常费时的。
方法二:使用函数ptr<>,它返回指向图像特定行的一个指针。

uchar R,G,B;
Mat src3=imread("lena.jpg",IMREAD_COLOR);
for(int i=0; i<src3.rows; i++)
{
	Vec3b *pixrow=src3.ptr<Vec3b>(i);
	for(int j=0; j<src3.clos; j++)
	{
		R=pixrow[j][0];
		G=pixrow[j][1];
		B=pixrow[j][2];
	}
}

2.基本API概念-Mat

Mat类是存储和操作OpenCV中图像的主要数据结构。
这个类是在core模块中定义的。OpenCV已经实现了对这些数据结构自动分配和释放内存的机制。
Mat类用于密集的n维单通道或多通道数组。实际上它可以存储实数或复数值向量和矩阵、彩色图像或灰度图像、直方图、点云等。
有许多种不同的方式可以用来创建一个Mat对象,最流行的方法是构造函数,其数组大小和类型被指定为:

Mat(nrows,nclos,type,fillValue)

数组元素的初始值可以由Scalar类设置为一个典型的四元素向量(对于存储在数组中的图像的每个RGB和透明度分量)如:

Mat img_A(4, 4, CV_8U, Scalar(255));
//白色图像
//具有8位无符号整数的4*4单个通道数组
//

任何基本类型都可以用一个标识符以下面的形式定义:

CV_<bit depth>{U|S|F}C(<number of channels>)

在上面代码中,U,S,F分别代表unsigned、signed、float数据类型。

此外,需要注意的是,这3个声明是等价的:CV_8U 、CV_8UC1 、 CV_8UC(1);均表示8位无符号单通道数组,最适合于灰度图像的整形数组。
更多参考博客

3.直方图

对直方图建模使图像可以改变其对比度,这称为直方图的均衡化
直方图建模对于以对比度变化的方式进行图像增强是一种非常有用的技术。直方图均衡化允许低对比度的图像区域获取更高的对比度。
在OpenCV中,使用函数void calcHist可以计算图像直方图;
使用函数void equalizeHist可进行直方图均衡化。

void calcHist(const Mat* images,  //集合中第一幅图像的地址
              int nimages,  //原图像的数量
              const int* channels,  //用来计算直方图的通道列表,通道数0~2
              InputArray mask, //可选项mask,用来指示直方图中图像像素的个数
              OutputArray hist, //输出直方图
              int dims, //直方图的维数
              const int* histSize, //每一维度上直方图大小的数组。
              const float** ranges, //每一维度上直方图bin边界维度数组的数组
              bool uniform=true, //默认情况true表示直方图是均匀的
              bool accumulate=false) //默认情况false表示直方图是不叠加的。
void equalizeHsit(InputArray src, OutputArray dst)

你可能感兴趣的:(OpenCV,opencv)