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

网站制作如皋兰州疫情最新情况

网站制作如皋,兰州疫情最新情况,wordpress和phpwind,资阳市住房和城乡建设局网站前言:前面学习了数组和指针在C中的处理原理,本文通过自己编写一个图像处理的函数实例来加深对数组和指针的理解。为什么是图像处理呢,因为图像数据是一个二维矩阵,相当于一个二维数组,前面学习了一维数组,现…

前言:前面学习了数组和指针在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.ptr<uchar>(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.ptr<uchar>(i);Mat类中的ptr函数返回的是某一行的首地址,ptr是一个模板函数,代码中它返回的是第i行的首地址。

第一个循环体内获取每行的首地址,第二个循环体内获取每行的每个像素值,并做阈值划分。前面文章《使用new创建动态数组》讲过,访问数组中的元素既可以用指针访问,也可以用数组的方括号表示法来访问,此处用的是方括号表示法,data[j]代表的是第i行中的第(j+1)个像素,通过双层循环对图像中每一行的每个像素做阈值划分,就完成了图像的二值化。

也可以通过指针的方式来访问图像中的每个像素,将上面代码中的循环体换成以下代码,运行的结果是一样的。

for (int i = 0; i < rows; i++){uchar* data = outputImage.ptr<uchar>(i);///获取第i行的首地址for (int j = 0; j < cols; j++){if ((*(data+j)) < 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*cols+j] < 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 (*(data+i*cols + j) < threshold){*(data + i * cols + j) = 255;}else{*(data + i * cols + j) = 0;}}}

总结

opencv中遍历图像像素的方法有十几种,本文通过4种遍历图像像素的方式编写了一个简单的图像二值化函数,既巩固了指针和数组的知识,又掌握了遍历opencv中图像像素的方法。

 

http://www.dt0577.cn/news/57898.html

相关文章:

  • 深圳网站策划推广seo搜索排名优化
  • 石家庄seo网站推广外贸建站服务推广公司
  • 安徽建设工程信息网新网站哪儿登陆seo关键词优化工具
  • 做汽车售后的网站网络优化培训
  • 网站上传用什么软件做视频教程国内新闻最新5条
  • 电商网站建设存在哪些问题品牌营销推广
  • 专门做考研的网站设计网站免费素材
  • 手机软件制作和做网站相同网站建设百度推广
  • 三合一网站建设北京网站优化技术
  • 巴中做网站的公司最近最新的新闻
  • html框架布局实例代码什么叫seo网络推广
  • wordpress 主题备份seo高效优化
  • 淮南今日头条新闻seo公司培训课程
  • 如何制作响应式网站seo如何快速排名百度首页
  • 找外包做网站不给代码seo是什么级别
  • 有没有交流做服装的网站汕头网站关键词推广
  • 去国外做外卖网站好企业官网网站
  • 一套企业vi设计需要多少钱seo高端培训
  • wordpress insert河北百度seo关键词
  • 手机网站设计知识百度广告电话号码是多少
  • 做网站推广话术百度推广开户代理
  • 中山专业网站建设价格百度热门关键词排名
  • 河北省住房和城乡建设厅信用网站郑州计算机培训机构哪个最好
  • 网站建设我们的优势各种手艺培训班
  • 做企业网站代码那种好深圳网站制作公司
  • 华为荣耀官网入口seo搜索引擎优化排名哪家更专业
  • 防止入侵网站搜索引擎优化的报告
  • 网站制作的要求南宁百度首页优化
  • 电商公司组织架构seo网站分析报告
  • 西安做网站哪家公司好电商网