您的位置:首页 > 运维架构

理解矩阵的掩码操作 使用opencv锐化图片

2017-09-08 15:58 288 查看
关于opencv的矩阵掩码的操作其他博客已经讲了很多了,他们基本上都是抄opencv中文社区的,本文跟他们的区别是,这里只具体解释公式

I(i,j) = 5*I(i,j) - [ I(i-1,j) + I(i+1,j) + I(i,j-1) + I(i,j+1)],也就是本人对这个公式的理解。

引用opencv中文社区的一句话:

矩阵掩码的思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响。从数学观点看,我们用自己设置的权值,对像素邻域内的值做了个加权平均。

也就是对一个图片中的每一个像素点重新赋值。值的大小受到该像素点周围4个像素点的影响。

看上面公式,I(i,j)表示目标像素点,i和j分别表示像素点的横纵坐标。 I(i-1,j) 、I(i+1,j) 、 I(i,j-1) 、 I(i,j+1)分别表示目标像素点周围的四个像素点了。上面公式的作用就是,让自己增加4倍,然后减去周围像素点的值,所得到的值便是自己新的值。为什么要这样子做呢?假设b = [ I(i-1,j) + I(i+1,j) + I(i,j-1) + I(i,j+1)],如果目标像素颜色很鲜艳,它周围的像素点颜色不鲜艳,那么通过公式,也就是`5*I(i,j)-b >I(i,j)`,得到的值比原来的值大,也就是目标点会变得更加鲜艳。相反,目标像素点会变得更加不鲜艳。所以,这个掩码操作的作用就是突出像素点,让鲜艳的点更加鲜艳,让昏暗的点更加昏暗。这样操作之后从整个图片上看,图片就有了锐化的效果了。

下面是本人使用opencv程序处理后的照片:

图片1:未经处理的图片。(本文非商用,贴上菲姐的图片应该没有什么问题吧!)



下面是锐化之后的图片:



第二张图片明显比第一张清晰和鲜艳很多。

最后还是贴一下代码吧,虽然其他博客都有这样的代码。不过,貌似中文社区里面没有完整的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

int main(int argc, char * argb[]) {
Mat I = imread("C:\\Users\\liangyh\\Desktop\\timg.jpg");
if (I.empty()) {
cout << "cannot read the image!" << endl;
return 0;
}
Mat K;
Mat kernel = (Mat_<char>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(I, K, I.depth(), kernel);

imshow("original", I);
imshow("sharpen", K);

waitKey(0);
return 0;
}


本人拙见,欢迎指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: