opencv图像处理教程C++(三)矩阵的掩膜操作

矩阵掩膜:用一个矩阵和原图像作卷积操作,重新计算像素值。有以下作用:

  1. 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内 图像值保持不变,而区外图像值都为0。
  2. 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
  3. 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
  4. 特殊形状图像的制作。

掩膜操作可以提高图像对比度,对比度提高可以增加图像感官度、锐化,让看起来有点模糊的图像更清晰。

掩膜操作公式:
┌ 0 -1 0 ┐
│ -1 5 -1 │
└ 0 -1 0 ┘
例如:掩膜矩阵 3*3 在图像矩阵上移动与图像重合,与每一个重合的像素点做掩 膜操作,公式:中心点掩膜后的颜色数据 I(i,j) = 5*I(i,j) - [I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]
这里是3*3的矩阵,所以图像数据的第一行倒数第一行,第一列倒数第一列不做掩膜操作 i,j表示像素的位置,第i行,第j列,I(i,j) 表示每个通道颜色数据掩膜操作不是矩阵乘法。用此掩膜从上至下,从左至右对图像进行操作,得到的图像就是增强对比度的图像。

代码实现:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include<opencv2/face.hpp>
#include<iostream>
#include<math.h>
#include <string> 
#include<fstream> 
using namespace cv::face;
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;

int main() {
Mat src, dst;
src = imread("C:/Users/Administrator/Desktop/pic/5.jpg");
imshow("input", src);
//函数调用filter2D功能
//1,定义掩摸:Mat kernel=(Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
//filter2D(src,dst,src.depth(),kernel);//其中src与dst是Mat类型变量,src.depth表示图深度,有32,24,8等

Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义掩膜
filter2D(src, dst, src.depth(), kernel);
imshow("output", dst);
waitKey(0);
}

结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26907755/article/details/81663436