如何在openCV中使用掩膜来完成对图像的处理

什么是掩膜?

在本篇文章开始前我们需要先来了解一下什么是掩膜,掩膜就是用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。

掩膜通常是个n*n的矩阵,我们可以通过掩膜来更好地处理图像。

代码解析

首先贴上源码,关于代码的解析我已经写好了注释:

#include<opencv2/opencv.hpp>
#include<stdc++.h>

using namespace std;
using namespace cv;
int main() {
  Mat jun = imread("D:\\壁纸\\jun.png");//读取图片
  namedWindow("junbian", CV_WINDOW_AUTOSIZE);//创建窗口
  imshow("junbian", jun);//在窗口上显示图片

  Mat bian;
/* 创建一个掩膜 */
  Mat kernel = (Mat_<char>(3,3)<<0, -1,  0,
                              -1, 5, -1, 
                               0,-1, 0);
/* 使用filter2D来对图像进行处理 */
  filter2D(jun, bian, -1, kernel);

  namedWindow("cool jun", CV_WINDOW_AUTOSIZE);
  imshow("cool jun", bian);

  waitKey(0);
  return 0;
}

让我们来看看结果:

我们会发现处理过后的图像相较于原图对比度增强了。

接下来让我们来换一个掩膜试试看:

#include<opencv2/opencv.hpp>
#include<stdc++.h>

using namespace std;
using namespace cv;
int main() {
  Mat jun = imread("D:\\壁纸\\jun.png");//读取图片
  namedWindow("junbian", CV_WINDOW_AUTOSIZE);//创建窗口
  imshow("junbian", jun);//在窗口上显示图片

  Mat bian;
/* 创建一个掩膜 */
  Mat kernel = (Mat_<char>(3,3)<<-1, 0, -1,
                                  0, 4, 0, 
                                  -1,0,-1);
/* 使用filter2D来对图像进行处理 */
  filter2D(jun, bian, -1, kernel);

  namedWindow("cool jun", CV_WINDOW_AUTOSIZE);
  imshow("cool jun", bian);

  waitKey(0);
  return 0;
}

运行后的结果:

我们可以看到图像的轮廓被描绘了出来,在这里我们使用的掩膜是拉普拉斯滤波器,它可以将画面轮廓清晰地描绘出来。

发表评论

邮箱地址不会被公开。 必填项已用*标注

9 − 7 =