opencv+c++实现掩膜操作

目录

  • 掩膜操作
  • 代码实现
  • 直接filter2D()实现
  • 总结

掩膜操作

掩膜操作是指根据掩膜矩阵重新计算图像中每个像素的像素值,掩膜(mask)也被叫做Knernel.
以下面的常见掩膜矩阵为例:
[ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] \begin{bmatrix} 0&-1&0\\ -1&5&-1\\ 0&-1&0 \end{bmatrix} 010151010
I ( i , j ) I(i,j) I(i,j)表示第 i i i行,第 j j j列的像素值,则:
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(i+1,j)+I(i1,j)+I(i,j+1)+I(i,j1)]
也就是说掩膜操作根据我们所给的权重对像素邻域内的值做了个加权平均

代码实现

代码如下:

#include
using namespace cv;
int main(int argc,char **argv)
{
     
	Mat img = cv::imread("01.jpg");
	int rows = img.rows;//图像行数
	int cols = img.cols;//图像列数
	int  channel = img.channels();//图像通道数
	Mat output_img = Mat::zeros(img.size(),img.type());
	for (int i= 1; i < rows - 1; i++ ) {
     
		const uchar *current = img.ptr<uchar>(i);//获取当前行的像素值
		const uchar* previous = img.ptr<uchar>(i-1);
		const uchar* next = img.ptr<uchar>(i + 1);
		uchar* output = output_img.ptr<uchar>(i);
		for (int j = channel; j < (cols - 1) * channel; j++) {
     
			output[j] = saturate_cast<uchar>(5 * current[j] - (current[j - channel] + current[j + channel] + previous[j] + next[j]));
			//saturate_cast把值限制在0~250
		}
	}
	imshow("原图", img);
	imshow("掩膜后的图",output_img);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

实现的效果:

opencv+c++实现掩膜操作_第1张图片
opencv+c++实现掩膜操作_第2张图片

直接filter2D()实现

如果每一次掩膜操作都需要如此复杂的步骤,那么作为开源的计算机视觉库opencv就没有充分发挥它的价值。以上操作可由filter2D函数实现。

filter2D()实现代码如下:

Mat Knernel = (Mat_<char>(3, 3)<<0,-1,0,-1,5,-1,0,-1,0);//掩膜矩阵
	filter2D(img,output_img,img.depth()/*直接填-1也行*/, Knernel);
	imshow("原图", img);
	imshow("fileter2D掩膜操作后的图", output_img);

filter2D()实现效果如下:
opencv+c++实现掩膜操作_第3张图片

opencv+c++实现掩膜操作_第4张图片

总结

可以看出上述两种操作都实现了相同的掩膜操作,都凸显了图像细节,但第二种方法更简单一点。

你可能感兴趣的:(图像处理笔记,opencv,c++)