OpenCV学习之矩阵的掩膜操作

获取图像像素指针

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) = currenr[col]

像素范围处理saturate_cast

saturate_cast(-100),返回0

saturate_cast(288),返回255

saturate_cast(100),返回100

这个函数的功能是确保RGB值得范围在0~255之间

函数调用filter2D功能

定义掩膜:Mat kernel = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

filter2D(src,dst,src.depth(),kernel);其中src与dst是Mat类型变量、src.depth表示位图深度有32、24、8等。

代码演示

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
using namespace cv;

int main(int argc,char** argv)
{
	Mat src,dst;
	src = imread(C:/Users/26444/Desktop/testopencvinstall/OIP.jpg");
	if(src.empty())
	{
		printf("could not load image.....\n");
		return -1;
	}
	namedWindow("input image",WINDOW_AUTOSIZE);
	imshow("input image",src);
	
	//矩阵掩膜运算
	int cols=(src.cols -1) * src.channels();//实际列cols长度 = 图像的cols * 图像通道数
	int offsetx = src.channels();
	int rows = src.rows; // 获取图像行数
	dst = Mat::zeros(src.size(),src.type());//生成一个和源图像大小相等类型相同的全0矩阵
	for(int row = 1;row < rows -1 ; row++)
	{
		const uchar* precious = src.ptr<uchar>(row -1);
		const uchar* current = src.ptr<uchar>(row);
		const uchar* next = src.ptr<uchar>(row +1);
		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]));
		}
	}
	namedWindow("demo1",WINDOW_AUTOSIZE);
	imshow("demo1",dst);

//Opencv自带的函数filter2D演示
	Mat ken=rnel = (Mat_<char>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);
	filter2D(src,dst,src.depth(),kernel);
	namedWindow("demo2",WINDOW_AUTOSIZE);	
	imshow("demo2",dst);
	
	waitKey(0);
	return 0;
}

在这里插入图片描述
可以看到saturate_cast后的图片是很有立体感的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值