矩阵的Mask操作是非常简单的.就是我们根据掩码矩阵(Kernel矩阵)重新计算图像总每个像素的值.此Mask值用于调整相邻像素对新像素的影响程度.从数学的角度来看,是用我们指定的值做了一个加权平均数.
测试用例
要实现对图像对比度的增强,基本上我们会对图像中的每一个像素应用下面的公式:
上图中第一种表示方式是使用公式,第二种表示法是使用Mask,其是第一种表示法的压缩版本.你可以通过将Mask矩阵的中心((由0 - 0索引标记的大写字母))放在你想计算的像素上,然后将像素值与重叠部分矩阵值相乘.以上两种表示方法是一样的,但是在大型矩阵的情况下,使用后一种表示法更容易理解.
实例源码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
static void help(char* progName)
{
cout << endl
<< "This program shows how to filter images with mask: the write it yourself and the"
<< "filter2d way. " << endl
<< "Usage:" << endl
<< progName << " [image_path -- default lena.jpg] [G -- grayscale] " << endl << endl;
}
void Sharpen(const Mat& myImage,Mat& Result);
int main( int argc, char* argv[])
{
help(argv[0]);
const char* filename = argc >=2 ? argv[1] : "../sky.jpg";
Mat src, dst0, dst1;
if (argc >= 3 && !strcmp("G", argv[2]))
src = imread( samples::findFile( filename ), IMREAD_GRAYSCALE);
else
src = imread( samples::findFile( filename ), IMREAD_COLOR);
if (src.empty())
{
cerr << "Can't open image [" << filename << "]" << endl;
return EXIT_FAILURE;
}
namedWindow("Input", WINDOW_AUTOSIZE);/**创建自适应图