矩阵的掩膜操作
(也可以成为锐化)首先介绍一下什么是掩膜:用选定的对象去覆盖修饰另一个目标对象,使其达到想要的效果。
掩膜操作有两种方法,一种是使用函数filter2D,另一种是遍历数组进行修改。下边分别记忆这两种方法(在这里我省去了一些常规操作,直接开始写关键代码)
int main()
{
Mat src;
src=imread("图片位置");
if(!src.data)
{
prinft("could not the picture");
return -1;
}
Mat dst;
dst=Mat::zeros(src.size(),src.type());
Mat kernal=(Mat_<uchar>(3,3)<<0.-1,0,-1,5,-1,0,-1,0);//这里使用的是Mat_模板类。创建了一个卷积核
filter2D(src,dst,-1,kernal);
//......
//输出代码的省略不写
waitKey(0);
return 0;
}
掩膜操作就是用一个卷积核矩阵,然后对比目标矩阵,然后依次惊醒运算你,把结果放在卷积核中心对应的位置,卷积核矩阵是可以移动的,且中心的位置依次对准目标矩阵的元素,运算后替换掉原元素
顺便介绍一下Mat_模板类的使用,可以是代码更加简洁,减少代码编写过程中的误操作,下面用两个例子来说明
Mat M(200,300, CV_8UC1);
for(int i=;i<M.rows;i++)
//获取指针时需要指定类型
uchar *p=M.ptr<i>;
for(int j=0j<M.cols;j++)
{
double d1 = (double)((i + j) % 255);
//用at获取像素时需要指定数据类型
M.at<uchar>(i,j)=d1;
double d2 = M.at<uchar>(i, j);
}
以上是没有使用Mat_类模板
//在变量声明时,指定矩阵元素类型
Mat_<uchar> M1== (Mat_<uchar>&)M;
for(int i=0;i<rows;i++)
uchar*p=M1.ptr<i>;
for(int j=0;j<M1.cols;++j)
{
double d1=(double)((i+j)%255);
//直接使用matlab风格的矩阵元素读写,简洁
M1(i,j) = d1;
double d2 = M1(i,j);
}
}