OPENCV学习笔记(二)zeros、filter2D、saturate_cast

获取图像像素指针
CV_Assert(myImage.depth() == CV_8U);
Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获得当前行指针const uchar* current= myImage.ptr(row );
获取当前像素点P(row, col)的像素值 p(row, col) =current[col]

像素范围处理saturate_cast
saturate_cast(-100),返回 0。
saturate_cast(288),返回255
saturate_cast(100),返回100
这个函数的功能是确保RGB值得范围在0~255之间

data:uchar类型的指针,指向Mat数据矩阵的首地址。可以理解为标示一个房屋的门牌号;
dims:Mat矩阵的维度,若Mat是一个二维矩阵,则dims=2,三维则dims=3,大多数情况下处理的都是二维矩阵,是一个平面上的矩阵。
可以理解为房屋是一个一层的平房,三维或更多维的则是多层楼房;
rows:Mat矩阵的行数。可理解为房屋内房间行数;
cols:Mat矩阵的列数。可理解为房屋内房间列数;
size():首先size是一个结构体,定义了Mat矩阵内数据的分布形式,数值上有关系式:
image.size().widthimage.cols; image.size().heightimage.rows
可以理解为房屋内房间的整体布局,这其中包括了房间分别在行列上分布的数量信息;

channels():Mat矩阵元素拥有的通道数。例如常见的RGB彩色图像,channels3;而灰度图像只有一个灰度分量信息, channels1。
可以理解为每个房间内放有多少床位,3通道的放了3张床,单通道的放了1张床;
depth:用来度量每一个像素中每一个通道的精度,但它本身与图像的通道数无关!depth数值越大,精度越高。
在Opencv中,Mat.depth()得到的是一个0~6的数字,分别代表不同的位数,对应关系如下:
enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6},其中U是unsigned的意思,S表示signed,也就是有符号和无符号数。
可以理解为房间内每张床可以睡多少人,这个跟房间内有多少床并无关系;
elemSize:elem是element(元素)的缩写,表示矩阵中每一个元素的数据大小,如果Mat中的数据类型是CV_8UC1,那么 elemSize1;
如果是CV_8UC3或CV_8SC3,那么elemSize
3;如果是CV_16UC3或者CV_16SC3,那么 elemSize==6;即elemSize是以8位(一个字节)为一个单位,乘以通道数和8位的整数倍;
可以理解为整个房间可以睡多少人,这个时候就得累计上房间内所有床位数(通道)和每张床的容纳量了;

elemSize1:elemSize加上一个“1”构成了elemSize1这个属性,1可以认为是元素内1个通道的意思,这样从命名上拆分后就很 容易解释这个属性了:
表示Mat矩阵中每一个元素单个通道的数据大小,以字节为一个单位,所以有:
eleSize1elemSizeannels;
step:可以理解为Mat矩阵中每一行的“步长”,以字节为基本单位,每一行中所有元素的字节总量,是累计了一行中所 有元素、所有通道、所有通道的elemSize1之后的值;
step1():以字节为基本单位,Mat矩阵中每一个像素的大小,累计了所有通道、所有通道的elemSize1之后的值,所以有:
step1
step/elemSize1;
type:Mat矩阵的类型,包含有矩阵中元素的类型以及通道数信息,type的命名格式为CV_(位数)+(数据类型)+(通道 数)

函数调用filter2D功能
定义掩膜:Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);


```cpp
int main(int argc, char** argv)
{
	Mat src, dst;
	src = imread("test.jpg");
	if (!src.data) {                                       
		printf("could not load...\n ");
		return -1;
	}
	namedWindow("intput image", WINDOW_AUTOSIZE);
	imshow("intput image", src);

	int cols = src.cols  * src.channels()-1;
	//cout << cols<<endl;
	int offsetx = src.channels();
	int rows = src.rows;
	//cout << src.rows<<endl<< src.cols << endl << src.size() << endl<< src.type() << endl;
	dst = Mat::zeros(src.size(), src.type());      //图片全部赋值为0,相当于一张黑色图片;
	for (int row = 1; row < (rows - 1); row++) {
		const uchar* previous = src.ptr<uchar>(row - 1);    //opencv中的Ptr指其使用的智能指针,指的是Template class for smart reference-counting pointers(智能指针模板类)ptr是在访问图片中像素时的操作,如image.ptr<uchar>(5),指的是访问image图片的第6行像素值。
		const uchar* current = src.ptr<uchar>(row);
		const uchar* next = src.ptr<uchar>(row + 1);
		//cout << int(*previous)<<int(*next) << endl;
		uchar* output = dst.ptr<uchar>(row);
		for (int col = offsetx; col < cols; col++) {
			output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));     //previous[col]为指针,*previous[col]=*(previous+col);
			//cout << previous[col]<<      next[col] << endl;
		}
	}
	namedWindow("contrast image demo1", WINDOW_AUTOSIZE);
	imshow("contrast image demo1", dst);


	double t = getTickCount();
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(src, dst, src.depth(), kernel);
	double timeconsume = (getTickCount() - t) / getTickFrequency();
	printf("tim consume %.2f\n", timeconsume);

	namedWindow("contrast image demo2", WINDOW_AUTOSIZE);
	imshow("contrast image demo2", dst);

	waitKey(6000);
	//getchar();
	return 0;
}	
函数
zeros:图片全部赋值为0,相当于一张黑色图片;
Mat::zeros(src.size(), src.type())

filter2D
filter2D(src, dst, src.depth(), kernel);
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
saturate_cast是一个OpenCV库中的函数,用于将数据类型转换为指定的数据类型,并在转换过程中进行饱和处理。它的作用是确保转换后的值在指定的数据类型范围内,避免溢出或超出范围的情况发生。\[1\] 在图像处理中,saturate_cast通常用于对像素进行线性操作。例如,在对图像进行加减乘除等运算时,结果可能会超出像素灰度值的范围(0~255)。使用saturate_cast函数可以确保运算结果不会超出指定的数据类型范围,如果结果为负数,则转为0,如果结果超出最大值,则为最大值。\[2\] 举个例子,如果我们对像素进行线性操作,不使用saturate_cast函数,结果可能会超出范围。而使用saturate_cast函数,可以确保结果在指定的数据类型范围内,避免溢出或超出范围的情况发生。\[3\] #### 引用[.reference_title] - *1* [opencv函数之saturate_cast(防止溢出)](https://blog.csdn.net/piaoxuezhong/article/details/60570919)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【OpenCV】中saturate_cast的含义和用法是什么?](https://blog.csdn.net/qq_15698613/article/details/84557588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值