1.掩膜(mask)的定义
用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片,滤光片等。
掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值,数据范围,有限或无限值,感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。
2.掩膜的用途
数字图像处理中,掩模为二维矩阵数组,有时也用多值图像数字图像处理中,图像掩模主要用于:
- 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
- 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
- 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
- 特殊形状图像的制作
掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个N * N的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。
在OpenCV的中,掩模操作是相对简单的。大致的意思是,通过一个掩模矩阵,重新计算图像中的每一个像素值。掩模矩阵控制了旧图像当前位置以及周围位置像素对新图像当前位置像素值的影响力度。用数学术语讲,即我们自定义一个权重表。
掩膜操作实现图像对比度调整
矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask)也被称为内核。
通过掩膜操作实现图像对比度提高。I(i,j) = 5*I(i,j) - [I(i-1,j) + I(i+1,j) + I(i,j-1) + I(i,j+1)]
Mat kern = (Mat_<char>(3,3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像垫对象。
kernel.png
像素范围处理saturate_cast <typename _Tp>()
- saturate_cast <UCHAR>( - 100),返回0
- saturate_cast <UCHAR>(288),返回255
- saturate_cast <UCHAR>(100),返回100
这个函数的功能是确保RGB值范围在0〜255之间。
函数调用filter2D功能
filter2D函数的定义如下:
void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor=Point(-1,-1),
double delta=0, int borderType=BORDER_DEFAULT );
其中SRC与DST是垫类型变量,ddepth表示位图深度,有32,24,8等。
示例代码
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("C:\\Users\\马迎伟\\Desktop\\heibao.jpg"/*IMREAD_GRAYSCALE*/);
namedWindow("游戏原画", CV_WINDOW_AUTOSIZE);
imshow("游戏原画", img);
namedWindow("输出图像", CV_WINDOW_AUTOSIZE);
Mat output_img;
//定义掩膜kernel
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
//获取时间
double t = getTickCount();
filter2D(img, output_img, img.depth(), kernel);
double timeconsume = (getTickCount() - t)/getTickFrequency();
imshow("输出图像", output_img);
printf_s("time is %.2f",timeconsume);
//保存算法
//imwrite("C:\\Users\\马迎伟\\Desktop\\a1a.jpg", output_img);
waitKey(0);
return 0;
}