矩阵的掩膜操作


掩膜操作的数学表示

  • 公式:
    I ( i , j ) = 5 ∗ I ( i , j ) − [ I ( i − 1 , j ) + I ( i + 1 , j ) + I ( i , j − 1 ) + I ( i , j + 1 ) ] I(i,j)=5∗I(i,j)−[I(i−1,j)+I(i+1,j)+I(i,j−1)+I(i,j+1)] I(i,j)=5I(i,j)[I(i1,j)+I(i+1,j)+I(i,j1)+I(i,j+1)]
    I ∗ [ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] = O I* \left[ \begin{matrix} 0 &-1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 &0 \end{matrix} \right] =O I010151010=O

注意:如果是多通道,那么是对应通道进行掩膜操作,不同通道之间不进行任何运算。



代码:

#include <iostream>
#include <opencv2/opencv.hpp>



using namespace std;
using namespace cv;


void Sharpen(const Mat& myImage, Mat& Result);

int main(void)
{
	Mat src ,dst0,dst1;

	src=imread("../res/fruits.jpg",IMREAD_COLOR);

	namedWindow("Input");
	namedWindow("Output");
	imshow("Input",src);
	
	


	double t=(double)cv::getTickCount();
	Sharpen(src,dst0);
	t=((double)getTickCount()-t)/getTickFrequency();
	cout << "Hand Witten function time passed in "<< t << "seconds"<< endl;


	imshow("Output",dst0);


	///用库函数

	Mat kernel =(Mat_<char>(3,3) << 0,-1,0,
									-1,5,-1,
									0,-1,0); //定义一个Mask

	t= (double)getTickCount();
	cv::filter2D(src,dst1,src.depth(),kernel);
	t=((double)getTickCount()-t)/getTickFrequency();
	cout << "build in filter2D time passed in" << t << "seconds" << endl;

	namedWindow("Output1");
	imshow("Output1",dst1);
	waitKey();

	return 0;
}


void Sharpen(const Mat& myImage,Mat& Result)
{
	CV_Assert(myImage.depth() == CV_8U);
	const int nChannels = myImage.channels();
	Result.create(myImage.size(),myImage.type());


	for(int i=1; i<myImage.rows-1;++i)
	{
		const uchar* previous = myImage.ptr<uchar>(i-1); //得到三个相邻行的首地址
		const uchar* current = myImage.ptr<uchar>(i);
		const uchar* next = myImage.ptr<uchar>(i+1);

		uchar* output = Result.ptr<uchar>(i);

		for(int j=nChannels;j<nChannels*(myImage.cols-1);++j)
		{
			*output++=saturate_cast<uchar>(5*current[j]
										   -current[j-nChannels]
										   -current[j+nChannels]
										   -previous[j]
										   -next[j]);
		}

	}
//边界置0
	Result.row(0).setTo(Scalar(0));
	Result.row(Result.rows-1).setTo(Scalar(0));
	Result.col(0).setTo(Scalar(0));
	Result.col(Result.cols-1).setTo(Scalar(0));

}


结果:

input:
在这里插入图片描述
手写output
在这里插入图片描述
Filter2D:
在这里插入图片描述

方法运行时间
手写掩膜0.01237ms
Filter2D0.00288ms

可见:两种方法效果差不多,但是运行时间差距很大,Opencv对Filter2D函数做了优化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值