矩阵的掩膜操作
根据掩膜重新计算每个像素的像素值
1、掩膜的定义
用选定的图像、图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以是胶片、滤光片等。数字图像处理中,掩模为二维矩阵数组,有时也用多值图像。
2
、数字图像处理中
,图像掩模主要用于
:
①
提取感兴趣区
,用预先制作的感兴趣区掩模与待处理图像相乘,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。
掩膜是一种图像滤镜的模板,实用掩膜经常处理的是遥感图像。当提取道路或者河流,或者房屋时,通过一个n*n的矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。这个矩阵就是一种掩膜。
②
屏蔽作用
,用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。
③
结构特征提取
,用相似性变量或图像匹配方法检测和提取图像中与掩模相似的结构特征。
④
特殊形状图像的制作。
5 实现图像对比度调整
3、各种掩膜有不同的作用
3x3
邻域平均 全是1
3x3高斯均值滤波器
filters(0) = 1: filters(1) = 2:filters(2) = 1
filters(3) = 2: filters(4) = 4: filters(5) = 2
filters(6) = 1: filters(7) = 2: filters(8) = 1
拉普拉斯1型滤波器 高通边缘检测器掩膜
filters(0) = -1: filters(1) = 0: filters(2) = -1
filters(3) = 0: filters(4) = 4: filters(5) = 0
filters(6) = -1: filters(7) = 0: filters(8) = -1
锐化 (中锐化:filters(4) = 5 , 高锐化:filters(4) = 6)
filters(0) = 0: filters(1) = -1: filters(2) = 0
filters(3) = -1: filters(4) = 6: filters(5) = -1
filters(6) = 0: filters(7) = -1: filters(8) = 0
垂直掩膜
filters(0) = 3: filters(1) = -6: filters(2) = 3
filters(3) = 3: filters(4) = -6: filters(5) = 3
filters(6) = 3: filters(7) = -6: filters(8) = 3
水平掩膜
filters(0) = 3: filters(1) = 3: filters(2) = 3
filters(3) = -6: filters(4) = -6: filters(5) = -6
filters(6) = 3: filters(7) = 3: filters(8) = 3
对角线掩膜
filters(0) = 3: filters(1) = 3: filters(2) = -6
filters(3) = 3: filters(4) = -6: filters(5) = 3
filters(6) = -6: filters(7) = 3: filters(8) = 3
高斯滤镜5x5
f(0) = 1: f(1) = 4: f(2) = 6: f(3) = 4: f(4) = 1
f(5) = 4: f(6) = 16: f(7) = 24: f(8) = 16: f(9) = 4
f(10) = 6: f(11) = 24: f(12) = 36: f(13) = 24: f(14) = 6
f(15) = 4: f(16) = 16: f(17) = 24: f(18) = 16: f(19) = 4
f(20) = 1: f(21) = 4: f(22) = 6: f(23) = 4: f(24) = 1
4、 用编程定义掩膜(kernel) :通过指定的数据值、数据范围、有限或无限值、感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模。
Mat src = (Mat_<uchar>(3,3) << 1,26,7,
4,3,1,
3,45,6); //常用此函数来定义吧
//对于小的矩阵来说你可以使用逗号隔开的初始化函数:
注意事项:1、
括号一定括上,否则报错。
2、
定义多少,<<后面的数字就填多少,不能多填也不能少填。
filter2D 一个函数即可搞定
掩
膜操作
参数介绍:
第一个参数为源图像。
第二个参数为最终输出的图像,需要再定义一个Mat类变量。
第三个参数为像素深度,两个像素深度一定要相同,否则出错。
src.depth() 或者 -1
第四个参数为掩膜。
代码示例如下:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread("liaowenbin.bmp");
namedWindow("open picture",WINDOW_AUTOSIZE);
imshow("open picture",src);
double t = getTickCount(); //***计算时间语句
Mat kernel = (Mat_<char>(3,3) << //定义一个掩膜
0,-1,0,
-1,5,-1,
0,-1,0);
Mat dst;
filter2D(src,dst,src.depth(), kernel);//掩膜操作
double time = (getTickCount()-t) / getTickFrequency();//***
std::cout << "usetime : " << time << std::endl;//***
//printf("usetime :%0.2f \n",time);
namedWindow("Output Picture",WINDOW_AUTOSIZE);
imshow("Output Picture", dst);
waitKey(0);
return 0;
}