什么是掩膜
首先我们从物理的角度来看看mask到底是什么过程。
在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形“底片”称为掩膜(也称作“掩模”),其作用是:在硅片上选定的区域中对一个不透明的图形模板遮盖,继而下面的腐蚀或扩散将只影响选定的区域以外的区域。
图像掩膜与其类似,用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。
掩膜的用法
掩膜主要有以下用途:
- 提取感兴趣区,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
- 屏蔽作用,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
- 结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
- 特殊形状图像的制作。
掩膜操作实现图像对比度调整
用此掩膜从上至下,从左至右对图像进行操作,得到的图像就是增强对比度的图像。
需要用到的函数
(1)获取图像像素指针
img.ptr<uchar>(int i=0);
//获取行的指针,i表示第几行,从0开始计数const uchar* current = img.ptr<uchar>(row);
//获取当前行的指针- 获取当前点p(row,col)的像素
p(row,col)=current[col]
(2)像素范围处理
saturate_cast<uchar>
代码实现
int main(int argc, char** argv)
{
//读取本地的一张图片便显示出来
Mat img, dst;
img = imread("D:\\learn_CV\\image\\xxd.jpg");
if (img.empty()) {
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input window", CV_WINDOW_AUTOSIZE);
imshow("input window", img);
int offsetx = img.channels();
int cols = (img.cols - 1)*img.channels(); //获取图像的列数、注意还有图像的通道数
int rows = img.rows; //获取图像的行数
dst = Mat::zeros(img.size(),img.type()); //创建一个和源图像大小相同,类型相同的全0矩阵
for (int row = 1; row < (rows - 1); row++) {
const uchar* previous = img.ptr<uchar>(row - 1);//上
const uchar* current = img.ptr<uchar>(row); //获取当前行的指针
const uchar* next = img.ptr<uchar>(row+1); //下
uchar* output = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++) {
output[col] =saturate_cast<uchar> (5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
}
}
namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);
imshow("contrast image demo", dst);
waitKey(0);
}
前后对比图
掩膜操作后
调用filter2D函数实现
调用opencv自带的filter2D函数也可以实现上述功能,更方便。
int main(int argc, char** argv)
{
//读取本地的一张图片便显示出来
Mat img, dst;
img = imread("D:\\learn_CV\\image\\xxd.jpg");
if (img.empty()) {
cout << "could not load image..." << endl;
return -1;
}
namedWindow("input window", CV_WINDOW_AUTOSIZE);
imshow("input window", img);
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义掩膜
//调用filter2D
filter2D(img, dst, img.depth(), kernel);
namedWindow("掩膜操作后", CV_WINDOW_AUTOSIZE);
imshow("掩膜操作后", dst);
imwrite("D:\\learn_CV\\image\\contrast.jpg", dst);
waitKey(0);
}