OpenCV中的mask操作具有几个意义,以下列出:
①对兴趣区提取,用&的概念,过滤掉其他区外图像,设定值为0。
②屏蔽作用,与①类似操作。
③结构特征提取,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④特殊形状图像的制作。
个人觉得掩膜处理应用有两方面(可能现阶段水平就这个高度),一是兴趣区域提取,二是增强图像的对比度。
下面主要就增强图像对比度进行说明。
上图是掩膜的一个数学基础公式,就是为了增强中间红色区域与周围的对比度,下面贴代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat src, dest;
src = imread("D:/test/b.jpg");
if (!src.data)
{
cout << "文件打开失败" << endl;
return -1;
}
namedWindow("掩膜操作前", WINDOW_AUTOSIZE);
imshow("掩膜操作前", src);
dest = Mat::zeros(src.size(), src.type());//生成一个和源图像大小相等类型相同的全0矩阵
int cols = (src.cols - 1)*src.channels();//获取图像的列数,一定不要忘记图像的通道数
int rows = src.rows;//获取图像的行数
int offsetx = src.channels();
for (int row = 1; row < rows - 1; row++)
{
uchar* previous = src.ptr<uchar>(row - 1);
uchar* current = src.ptr<uchar>(row);//获取当前所在行的指针
uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dest.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++)
{
output[col] = saturate_cast<uchar>(5 * current[col] - (previous[col] + next[col] + current[col - 1] + current[col + 1]));//应用掩膜算法,并使用saturate_cast,目的在于对像素值进行操作,0~255之间就返回对应值,小于0返回0,大于255返回255
}
}
// Mat kern = (Mat_<char>(3, 3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
//filter2D(src, dest, src.depth(), kern); //另一种掩膜处理方式
namedWindow("掩膜操作后", WINDOW_AUTOSIZE);
imshow("掩膜操作后", dest);
cvWaitKey();
system("pause");
return 0;
}
生成的图片就不贴出来了,简单的一个mask处理,希望在Opencv上可以渐行渐远~