网站o2o,wordpress字典插件,深圳平湖网站开发,广州天府路一栋楼外墙脚手架坍塌前言#xff1a;前面学习了数组和指针在C中的处理原理#xff0c;本文通过自己编写一个图像处理的函数实例来加深对数组和指针的理解。为什么是图像处理呢#xff0c;因为图像数据是一个二维矩阵#xff0c;相当于一个二维数组#xff0c;前面学习了一维数组#xff0c;现…前言前面学习了数组和指针在C中的处理原理本文通过自己编写一个图像处理的函数实例来加深对数组和指针的理解。为什么是图像处理呢因为图像数据是一个二维矩阵相当于一个二维数组前面学习了一维数组现在可以看看指针是怎么来处理二维数组的。
目录
遍历OpenCV中图像像素方法一
遍历OpenCV中图像像素方法二
总结 正文我们首先使用opencv图像处理库读入一张图像然后对图像进行二值化opencv库中已经集成了此功能此处自己编写仅仅为了巩固指针和数组的知识。
遍历OpenCV中图像像素方法一
代码如下
#include iostream
#include cstring
#include opencv2/opencv.hpp
using namespace std;
using namespace cv;int main()
{Mat srcImage imread(test.jpg);Mat srcGray;cvtColor(srcImage, srcGray, COLOR_BGR2GRAY);Mat outputImage srcGray.clone();int rows outputImage.rows;int cols outputImage.cols*outputImage.channels();int threshold 50;for (int i 0; i rows; i){uchar* data outputImage.ptruchar(i);///获取第i行的首地址for (int j 0; j cols; j){if (data[j] threshold){data[j] 255;}else{data[j] 0;}}}imshow(src, srcImage);imshow(binary, outputImage);waitKey();return 0;
}
该方法中最重要的是这条语句uchar* data outputImage.ptruchar(i);Mat类中的ptr函数返回的是某一行的首地址ptr是一个模板函数代码中它返回的是第i行的首地址。
第一个循环体内获取每行的首地址第二个循环体内获取每行的每个像素值并做阈值划分。前面文章《使用new创建动态数组》讲过访问数组中的元素既可以用指针访问也可以用数组的方括号表示法来访问此处用的是方括号表示法data[j]代表的是第i行中的第j1个像素通过双层循环对图像中每一行的每个像素做阈值划分就完成了图像的二值化。
也可以通过指针的方式来访问图像中的每个像素将上面代码中的循环体换成以下代码运行的结果是一样的。
for (int i 0; i rows; i){uchar* data outputImage.ptruchar(i);///获取第i行的首地址for (int j 0; j cols; j){if ((*(dataj)) threshold){*(data j) 255;}else{*(data j) 0;}}}
遍历OpenCV中图像像素方法二
方法一中通过获取每行的首地址来访问每行中的每个像素。也可以直接通过二维数组的整个数组的首地址来访问每个像素代码如下
#include iostream
#include cstring
#include opencv2/opencv.hpp
using namespace std;
using namespace cv;int main()
{Mat srcImage imread(test.jpg);Mat srcGray;cvtColor(srcImage, srcGray, COLOR_BGR2GRAY);Mat outputImage srcGray.clone();int rows outputImage.rows;int cols outputImage.cols*outputImage.channels();int threshold 50;uchar* data outputImage.data;for (int i 0; i rows; i){for (int j 0; j cols; j){if (data[i*colsj] threshold){data[i*cols j] 255;}else{data[i*cols j] 0;}}}imshow(src, srcImage);imshow(binary, outputImage);waitKey();return 0;
}
方法二中最重要的是这条语句uchar* data outputImage.data; Mat类中的data指针指向的就是图像数据二维数组的首地址该方法用的是数组的方括号表示法来访问每个像素。同理循环体中也可以换成指针的方式来访问每个像素。循环体中的代码换成指针的方式如下
for (int i 0; i rows; i){for (int j 0; j cols; j){if (*(datai*cols j) threshold){*(data i * cols j) 255;}else{*(data i * cols j) 0;}}}
总结
opencv中遍历图像像素的方法有十几种本文通过4种遍历图像像素的方式编写了一个简单的图像二值化函数既巩固了指针和数组的知识又掌握了遍历opencv中图像像素的方法。