C++下OpenCV学习笔记
----访问图像中的像素
文章目录
一.像素的储存方式
- 图像矩阵的大小取决于所用的颜色模型,进一步地说,取决于所用的通道数。
- OpenCV中子列的通道顺序为BGR。
- 判断矩阵是否连续储存:isContinuous( )函数
(1)连续存储是返回true,否则返回false。
(2)Mat的数据部分存储是按照行进行存储的,相同行内的数据是连续存储,行与行之间的存储是否有间隙,可以通过isContinuous函数来判断。对于1*1或1*N矩阵总是连续的,一般使用Mat::create创建的矩阵总是连续的,而如果使用Mat::col,Mat::diag等提取的矩阵一部分,或者外部分配的数据构造矩阵头,则此类矩阵可能不再连续存储。
(3)代码实现
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat src = imread("C:\\Users\\441\\Desktop\\ZL\\夏目\\1.jpg");
cout << "Is continuous? ";
if (src.isContinuous())
cout << "YES." << endl;
else
cout << "NO." << endl;
Mat src1(src, Rect(250, 125, 250, 150));
cout << "Is continuous? ";
if (src1.isContinuous())
cout << "YES." << endl;
else
cout << "NO." << endl;
return 0;
}
(4)运行结果
二.颜色空间缩减(color space reduction)
- 定义:将现有颜色空间值除以某个输入值,以获得较少的颜色数。即做减法,比如颜色值0到9可取为新值0, 10到19可取为10,以此类推。
- 意义:可大大降低运算的复杂度。
- 简单的算法组成:
(1)遍历图像矩阵的每一个像素
(2)对像素运用缩减公式 - 代码实现(主函数)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void colorReduce(Mat& inputImage, Mat& outputImage, int div)
int main()
{
Mat src = imread("C:\\Users\\441\\Desktop\\ZL\\夏目\\1.jpg");
imshow("原始图像",src);
Mat dst;
dst.create(src.rows, src.cols, src.type());
double time = static_cast<double>(getTickCount());
colorReduce(src, dst, 128); //缩减128倍
time