1、先补充几点opencv的相关知识点

1.1  通过Scalar来设置颜色

Scalar(b1, b2, b3, b4),前面的三个参数是依次设置BGR的,和RGB相反,第四个参数设置图片的透明度。 如果不需要 设置透明度,则可以把第四个参数去掉。

1.2  Vec3b类型的使用

Vec3b就是一个uchar类型的数组,长度为 3

1.2.1  对Vec3b的定义

Vec3b color;  //变量 color 是一个长度为 3 的 uchar 数组,用于描述 RGB 颜色//在 OpenCV 中,颜色为 BGR,而不是 RGB
color[0] = 255;    // 0 是 B 通道,该句修改 B 通道数据
color[1] = 255;    // 1 是 G 通道,该句修改 G 通道数据
color[2] = 255;    // 2 是 R 通道,该句修改 R 通道数据

 1.2.2 使用vec3b读取像素

由于在OpenCV中,使用imread读取到的Mat图像数据,都是用uchar类型的数据存储,对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。

使用at定位方法如下:

Mat mat = imread("test.jpg");//(row, col)即所需要定位点的坐标
mat.at<Vec3b>(row, col)[0] = 255;  //修改点 (row, col) 的 B 通道数据
mat.at<Vec3b>(row, col)[1] = 255;  //修改点 (row, col) 的 G 通道数据
mat.at<Vec3b>(row, col)[2] = 255;  //修改点 (row, col) 的 R 通道数据

再如下例,返回值为<>中的类型:

Mat mat;mat.at<uchar>(row, col);    //单通道,返回一个 uchar 类型值
mat.at<Vec3b>(row, col);    //三通道,返回 <Vec3b>,即返回一个 uchar 数组,长度为 3
mat.at<Vec4b>(row, col);    //四通道

需要注意的是,上例中返回的都是uchar类型,直接使用cout输出为字符格式,需要强制转换为int类型之后输出:

Vec3b bgr = frame.at<Vec3b>(i, j);printf("b = %d, g = %d, r = %d\n", bgr[0], bgr[1], bgr[2]);
//或
cout << (int)bgr[0] << ", " << (int)bgr.val[1] << ", " << (int)bgr.val[2] << endl;

以上转载自:(79条消息) 【OpenCV】关于Vec3b类型的含义与使用_ReturnZC的博客-CSDN博客_opencv vec3b

2 、 图像像素的操作

本节主要实现对图像的各个像素点实现加减乘除的操作,可以起到改变图像亮度的作用,本节还会介绍并使用常用的saturate_cast函数,防止数值溢出。

2.1 补充saturate_cast函数

在图像处理方面,无论是加、减、乘、除,都会超出一个像素灰度值的范围(0~255),saturate_cast函数的作用即是:当运算完之后,结果为负,则转为0,结果超出255,则为255。

使用方法:

使用前:

dst.at<Vec3b>(row, col)[0] = (p1[0]    + p2[0]);

使用后:

dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0]    + p2[0])

2.2 加、减、乘、除 在代码中的表示方式

(1) 加 add(image, m, dst) ,其中 image 为输入的原图像,m为要对image进行操作的图像

dst为操作结束后的输出图像。

(2)减法:subtract()

(3)惩罚multiply()

 2.3 对图像像素进行操作代码实现

void QuickDemo::operators_demo(Mat &image)
{
Mat dst = Mat::zeros(image.size(), image.type());//把dst对象初始化,设置成image的大小和形式Mat m = Mat::zeros(image.size(), image.type());//把m对象初始化,设置成image的大小和形式dst = image - Scalar(50, 50, 50); //对image对Scalar做减法,可以降低图像亮度m = Scalar(50, 50, 50); multiply(image,m,dst);//乘法操作 apiimshow("乘法操作", dst);add(image, m, dst);//加法操作 apiimshow("加法操作", dst);subtract(image, m, dst);//减法操作 apiimshow("减法操作", dst);divide(image, m, dst);//除法操作 apinamedWindow("加法操作", WINDOW_FREERATIO);imshow("加法操作", dst);//加法操作底层  其原理就是将三个通道中的每个像素点做加减乘除操作,从而实现改变图像的亮度int dims = image.channels();int h = image.rows;int w = image.cols;for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){Vec3b p1 = image.at<Vec3b>(row, col); //opencv特定的类型,获取三维颜色,3个值Vec3b p2 = m.at<Vec3b>(row, col);dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0]   + p2[0]);//saturate_cast用来防爆,小于0就是0,大于255就是255dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);//对彩色图像读取它的像素值,并且对像素值进行改写。}}imshow("加法操作", dst);
}

opencv学习记录——(5)图像像素的操作相关推荐

  1. 【opencv学习】【图像的数值计算操作】

    import cv2# 展示图像,封装成函数 def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0) # 等待时间,单位是毫秒 ...

  2. OpenCV 学习记录7 图像实时磨皮及皮肤检测

    前言 今天学习了OpenCV里一些滤波的用法,感觉获益颇深,尤其是其中的双边滤波,完全可以达到磨皮的效果,原来还很纠结要如何实现磨皮美白,原来双边滤波就行了,当然如果要保留一些细节的话可能还需要用其他 ...

  3. youcans 的 OpenCV 学习课—5.图像的几何变换

    youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...

  4. youcans 的 OpenCV 学习课—4.图像的叠加与混合

    youcans 的 OpenCV 学习课-4.图像的叠加与混合 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的加法.叠加与混合,提供完整例程和运行结果:加法 ...

  5. youcans 的 OpenCV 学习课—3.图像的创建与修改

    youcans 的 OpenCV 学习课-3.图像的创建与修改 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. OpenCV 中图像的数据结构是 ndarray 多维数组, ...

  6. youcans 的 OpenCV 学习课—2.图像读取与显示

    youcans 的 OpenCV 学习课-2.图像读取与显示 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的读取.保存和显示.除基本方法和例程外,还给出了从 ...

  7. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  8. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  9. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

最新文章

  1. 智能路由器操作系统OpenWrt
  2. 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
  3. Python日志模块的两种用法
  4. 常用的函数式接口_Supplier接口
  5. ElasticSearch第一天
  6. fun是什么意思 python中def_【python】 numpy中的矩阵转置(ndarray.T)为什么不加括号却可以实现方法的功能...
  7. 前端人员如何在linux服务器上搭建npm私有库
  8. iOS开发UI篇—实现一个私人通讯录小应用(一)
  9. 理想更新“货车并线预警”遭用户吐槽 李想:仍在优化
  10. security框架工作笔记001--- Shiro和Spring Security对比_智慧城市项目中选型用Spring Security
  11. 实验吧web-易-what a fuck!这是什么鬼东西?
  12. hdu 3930 Broot 二次剩余
  13. 深入探究VC —— 资源编译器rc.exe(3)
  14. 转:工具类之SpannableStringUtils(相信你会爱上它)
  15. ELK+filebeat+kafka+zookeeper构建海量日志分析平台
  16. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。
  17. 计算机专业题库,计算机专业综合练习题库(附答案)
  18. hdu 1212 Big Number
  19. 【新书推荐】Interpretable Machine Learning with Python
  20. 使用drawio画地图

热门文章

  1. OSChina 周二乱弹 ——程序员在聊天中注意观察什么细节
  2. Computer Transformation UVA - 1647
  3. 智能家居服务发现实现
  4. (附源码)springboot高校社团管理系统的开发毕业设计231128
  5. 一款专业写公式的软件——MathType
  6. 研究生哪些行为可以在导师那超加分?
  7. Indexes in PostgreSQL — 7 (GIN)
  8. 门诊地图导航怎么做,零成本的医院室内导航解决方案
  9. 4.9 黑名单数据库的界面展示
  10. 机器学习和深度学习的主要术语(中英)