发布时间:2022-08-19 14:17
1、先补充几点opencv的相关知识点
1.1 通过Scalar来设置颜色
Scalar(b1, b2, b3, b4),前面的三个参数是依次设置BGR的,和RGB相反,第四个参数设置图片的透明度。 如果不需要 设置透明度,则可以把第四个参数去掉。
1.2 Vec3b类型的使用
Vec3b
就是一个uchar
类型的数组
,长度为 31.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
(row, col)[0] = 255; //修改点 (row, col) 的 B 通道数据 mat.at (row, col)[1] = 255; //修改点 (row, col) 的 G 通道数据 mat.at (row, col)[2] = 255; //修改点 (row, col) 的 R 通道数据 再如下例,返回值为
<>
中的类型:
Mat mat; mat.at
(row, col); //单通道,返回一个 uchar 类型值 mat.at (row, col); //三通道,返回 ,即返回一个 uchar 数组,长度为 3 mat.at(row, col); //四通道 需要注意的是,上例中返回的都是
uchar
类型,直接使用cout
输出为字符格式,需要强制转换为int
类型之后输出:
Vec3b bgr = frame.at
(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
(row, col)[0] = (p1[0] + p2[0]); 使用后:
dst.at
(row, col)[0] = saturate_cast (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);//乘法操作 api imshow("乘法操作", dst); add(image, m, dst);//加法操作 api imshow("加法操作", dst); subtract(image, m, dst);//减法操作 api imshow("减法操作", dst); divide(image, m, dst);//除法操作 api namedWindow("加法操作", 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
(row, col); //opencv特定的类型,获取三维颜色,3个值 Vec3b p2 = m.at (row, col); dst.at (row, col)[0] = saturate_cast (p1[0] + p2[0]);//saturate_cast用来防爆,小于0就是0,大于255就是255 dst.at (row, col)[1] = saturate_cast (p1[1] + p2[1]); dst.at (row, col)[2] = saturate_cast (p1[2] + p2[2]);//对彩色图像读取它的像素值,并且对像素值进行改写。 } } imshow("加法操作", dst); }