1.案例作用
利用掩膜操作实现加强图像对比度
2.案例实现
掩膜操作是指根据掩膜矩阵(也称作核kernel)重新计算图像中每个像素的值。 掩膜矩阵中的值表示了邻近像素值(包括该像素自身的值)对新像素值有多大的影响。从数学的观点来看,我们用自己设置的权值,对像素领域内的值做了个加权平均。
比如,下面这个公式表示用5倍当前像素的值减去该像素上、下、左、右四个像素值和,得到的结果赋值给当前像素。使用该公式可以用于提升图像的对比度。调节I(i,j)I(i,j)的系数权重可以得到不同的对比度提升效果。
I
(
i
,
j
)
=
5
?
I
(
i
,
j
)
?
[
I
(
i
?
1
,
j
)
+
I
(
i
+
1
,
j
)
+
I
(
i
,
j
?
1
)
+
I
(
i
,
j
+
1
)
]
I(i,j)=5?I(i,j)?[I(i?1,j)+I(i+1,j)+I(i,j?1)+I(i,j+1)]
I(i,j)=5?I(i,j)?[I(i?1,j)+I(i+1,j)+I(i,j?1)+I(i,j+1)] 上面的公式可以用掩膜矩阵表示成如下的形式。
3.代码部分
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
string path = "xxxx.jpg";
Mat img, dest;
img = imread(path);
if (!img.data)
{
cout << "add img error!" << endl;
return -1;
}
imshow("img", img);
Mat kernel = (Mat_<char>(3, 3) << 0,-1, 0, -1, 5, -1, 0, -1, 0);
filter2D(img,dest,img.depth(),kernel);
namedWindow("img_next", CV_WINDOW_AUTOSIZE);
imshow("img_next", dest);
waitKey(0);
return 0;
}
4.总结
1.掩膜操作简洁说法
将某一块的像素值*同样大小一个矩阵并将值赋作为像素值赋值给中间的那一个点。 改变了那一个点的像素和周围点(包括自己)的像素的关系
2.改变对比度只是掩膜操作的功能之一
掩膜还有很多其他的作用 改变对比度也可以不止用掩膜这一种操作(而且没搜到掩膜可以动态调整图像的对比度,有兄弟感兴趣可以搜搜然后告诉我哇 ^ - ^ )
|