像素读取和操作

1. 利用cv::Matat函数,直接访问具体地址

void get_setImagePixel(char *imagePath, int x, int y){//  Mat image = imread(imagePath , 0);Mat image = imread(imagePath, 1);//得宽高int w = image.cols;int h = image.rows;int channels = image.channels();if (x < w && y < h){//灰度图,像素为单通道if (channels == 1){int pixel = image.at<uchar>(x, y);cout << "灰度图像,处的灰度值为" << pixel << endl;}else{//通过实验,彩色图像的默认存储是bgr, 且存储的格式如下//读取int b = image.at<Vec3b>(x, y)[0]; // b = image.at<uchar>(x,y*3);cout << b << endl;int g = image.at<Vec3b>(x, y)[1]; //g = image.at<uchar>(x, y * 3 + 1);cout << g << endl;int r = image.at<Vec3b>(x, y)[2]; //r = image.at<uchar>(x, y * 3 + 1);cout << r << endl;//设置像素值image.at<Vec3b>(x, y)[0] = 255;image.at<Vec3b>(x, y)[1] = 255;image.at<Vec3b>(x, y)[2] = 255;}}imshow("cc", image);}

2. 利用Mat prt 函数:行首地址访问

void get_setImagePixel2(char *imagePath, int x, int y){Mat image = imread(imagePath, 1);//得宽高int w = image.cols;int h = image.rows;int channels = image.channels();//如果图像连续 ,可以将数据转化为1维数组,提高访问效率,但对少量像素访问就没必要//if (image.isContinuous())//{//  //reshape函数用于改变矩阵维度 //  //图像行数为1,列数为原先的行数乘上列数 //  image.reshape(1, image.cols*image.rows);//}//获得第y行的首地址uchar *data = image.ptr<uchar>(y);int position = x*channels;if (channels == 1){int pixel = data[position];cout << "灰度图像,处的灰度值为" << pixel << endl;}else{//通过实验,彩色图像的默认存储是bgr, 且存储的格式如下//读取int b = data[position];cout << b << endl;int g = data[position+1];cout << g << endl;int r = data[position+2];cout << r << endl;//设置像素值data[position] = 255;data[position+1] = 255;data[position+2] = 255;}imshow("cc", image);}

3. 利用迭代器遍历图像

void get_setImagePixel3(char *imagePath, int x, int y){Mat image = imread(imagePath, 1);//得宽高int w = image.cols;int h = image.rows;int channels = image.channels();if (channels == 1){//得到初始位置的迭代器 Mat_<uchar>::iterator it = image.begin<uchar>();//得到终止位置的迭代器 Mat_<uchar>::iterator itend = image.end<uchar>();int pixel = *(it + y * w + x);cout << "灰度图像,处的灰度值为" << pixel << endl;}else{//得到初始位置的迭代器 Mat_<Vec3b>::iterator it = image.begin<Vec3b>();//得到终止位置的迭代器 Mat_<Vec3b>::iterator itend = image.end<Vec3b>();//读取it = it + y * w + x;int b = (*it)[0];cout << b << endl;int g = (*it)[1];cout << g << endl;int r = (*it)[2];cout << r << endl;//设置像素值(*it)[0] = 255;(*it)[1] = 255;(*it)[2] = 255;}imshow("cc", image);}

若是大量访问数据和更改数据时用第二种方式效率高。

Node: 在修改像素时候,最好先用变量存储,设定好了再赋值给Mat成员对象,如data,因为如果直接进行操作时,当一个分量值大于255时,向前进1的原则,则会修改前面像素的值,如下:

id colorReduce(cv::Mat&image, int div){int nl = image.rows; //图像的行数 //图像每行的像素数 int nc = image.cols * image.channels();for (int j = 0; j<nl; j++){//得到第j行的首地址 uchar* data = image.ptr<uchar>(j);//遍历每行的像素 for (int i = 0; i<nc; i++){//printf("%d    ", data[i]);//data[i] = data[i] / div*div + 6;// 这里需要用c来存储,因为如果大于255时会向前进1,则影响前面的像素,data[i] 会自己变得小255int c = data[i] / div*div + 100;       data[i] =  c > 255 ? 255 : c;    //将每个像素值都变为div的倍数,即将颜色数缩减了div倍                        }}

OpenCV 像素的读取与操作相关推荐

  1. 【机器学习入门笔记6:OpenCV像素的读取与写入】20190204

    2019-02-04  by 崔斐然 这个很简单,上代码就可以看明白: import cv2 ##像素的读取:读取第10行第10列的像素值,原点在左上角 img=cv2.imread('imgs/04 ...

  2. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

  3. 【OpenCV】cv::Mat对单个像素的访问和操作

    我们在使用OpenCV进行图像处理的过程中,经常会涉及到对指定位置像素的读取和修改,下面我们就介绍OpenCV中几种常用的对指定位置像素值的读取和修改操作. 一.at操作 at操作是一种直接简单的对单 ...

  4. Python图像处理丨OpenCV+Numpy库读取与修改像素

    本文分享自华为云社区<[Python图像处理] 二.OpenCV+Numpy库读取与修改像素>,作者: eastmount. 一.传统读取像素方法 1.灰度图像,返回灰度值. 返回值=图像 ...

  5. opencv学习—简单车牌识别操作(python)

    opencv学习-简单车牌识别操作(python) 目录 opencv学习-简单车牌识别操作(python) 利用opencv进行车牌识别的详细流程如下: 1.车牌检测 2.分割车牌号并进行识别 3. ...

  6. Ubuntu下使用Anaconda安装opencv 解决无法读取视频

    Ubuntu下使用Anaconda安装opencv 最近在Ubuntu16.04下使用Anaconda安装opencv,碰到很多坑,记录备忘. cv2.VideoCapture(filename) 返 ...

  7. OpenCV使用GDAL读取地理空间栅格文件

    OpenCV使用GDAL读取地理空间栅格文件 使用GDAL读取地理空间栅格文件 目标 代码 如何使用GDAL读取栅格数据 笔记 通常应避免纬度/经度(地理)坐标 寻找角坐标 结果 使用GDAL读取地理 ...

  8. OpenCV使用inRange的阈值操作Thresholding Operations

    OpenCV使用inRange的阈值操作Thresholding Operations 使用inRange的阈值操作 目标 理论 HSV色彩空间 代码 解释 结果 使用inRange的阈值操作 目标 ...

  9. OpenCV学习笔记之掩码操作

    一.掩码操作 矩阵的掩码操作很简单.其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值.掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响.从数学观点看,我们用自己设置的 ...

最新文章

  1. 如何在Centos 7上用Logrotate管理日志文件
  2. java:static关键字
  3. 【Java】I/O阻塞下的守护线程与程序计数
  4. 一些常用的辅助代码 (网络收藏)
  5. PyTorch学习笔记(七):PyTorch可视化
  6. 关于C++中的继承感悟
  7. generator config_springboot集成mybatis+Generator代码生成
  8. 专家访谈:谈谈数据挖掘技术
  9. 地学计算方法/地统计学(第一章绪论)
  10. 关于:在 Office 2021 中自定义模板
  11. ajax上传图片的方法,ajax上传图片的方法
  12. matlab语音合成技术,基于MATLAB的语音处理 语音合成..doc
  13. matlab处理各种数据、文件
  14. android摄影程序,手机影像魅力:10款最佳Android摄影程序
  15. 发那科机器人GI分配_发那科机器人应用-运动指令入门(1)
  16. echart旭日图_echarts(10):旭日图
  17. win7计算机启动修复,win7启动修复功能无法正常进入系统的解决方法
  18. 【编程初学者】创建自己的开源项目1-创建远程代码仓库
  19. Cesium地下管线信息系统(视频)
  20. 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)

热门文章

  1. 计算机主机箱外部介绍图,电脑的主机结构是怎样的 电脑主机结构图【图文】...
  2. 2019网络教育计算机统考模拟试题,最新2019年网络远程教育《计算机应用基础》统考模拟题库500题(含答案)...
  3. 【渝粤教育】国家开放大学2018年秋季 0273-22T中国现代文学 参考试题
  4. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(3)
  5. 【渝粤教育】电大中专学前儿童科学教育 (14)作业 题库
  6. 【渝粤题库】陕西师范大学200681C语言程序设计 作业(高起专、高起本)
  7. 电路设计之干扰问题总结与分析
  8. 让电流检测更精确的AMR技术
  9. prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别
  10. mysql 强制读主库_laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题...