【OpenCv】掩膜操作

掩膜操作主要是用来增加图像的对比度,在实现掩膜操作的时候需要掩膜(mask也称为kernel),一般来讲掩膜都是奇数*奇数如3*3,5*5等。下面给出的是一个3*3的掩膜(图1)、掩膜的具体数值如图2所示和一个图像的部分像素值(图2)。

                                                                          

                                                     图1                          图2                                  图3

图2中第一行第一列为106,用上图给的掩膜对图3进行操作,就是将图1覆盖到图3上去,对应位置的数值相乘然后求和。

0*106+(-1)*111+0*109+(-1)*120+5*112+(-1)*115+0*118+(-1)*118+0*115=96,将得到的数值替换红色位置的数值,即用96替换112,。替换结束后就完成了一次掩膜操作。

在实际应用的过程中是对整副图像进行掩膜操作,掩膜不停地往下移动直到整副图像都完成掩膜操作。代码操作如下分步叙述:

1、首先定义一个掩膜:Mat kernel=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0),<<后面跟的数字代表掩膜的矩阵元素,对应图2。

2、使用filter2D函数进行掩膜操作:filter2D(src,dst,src.depth(),kernel),其中src代表原图像,dst代表输出的图像,src.depth()代表图像深度(有32、24、8等),src和dst均为Mat形式。

具体代码如下:

#include<opencv2\opencv.hpp>
#include<highgui.h>
using namespace cv;
int main(int argc, char** argv)
{
	// 加载图像
	Mat testImage = imread("D:/lena.png");
	CV_Assert(testImage.depth() == CV_8U);
	namedWindow("test_image", CV_WINDOW_AUTOSIZE);
	imshow("test_image", testImage);

	// 使用Filter2D函数进行掩膜操作
	Mat result;
	Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(testImage, result, testImage.depth(), kern);

	// 显示结果
	namedWindow("result_image", CV_WINDOW_AUTOSIZE);
	imshow("result_image", result);
	waitKey(0);
	return 0;
}

运行后的结果对比图:


猜你喜欢

转载自blog.csdn.net/qq_41480046/article/details/86563247