理解矩阵的掩码操作 使用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:未经处理的图片。(本文非商用,贴上菲姐的图片应该没有什么问题吧!)
下面是锐化之后的图片:
第二张图片明显比第一张清晰和鲜艳很多。
最后还是贴一下代码吧,虽然其他博客都有这样的代码。不过,貌似中文社区里面没有完整的代码:
本人拙见,欢迎指教。
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; }
本人拙见,欢迎指教。
相关文章推荐
- android使用opencv之图片颜色分离与合并操作
- opencv 保存图片操作:sprintf连续保存文件命名的使用
- OpenCV(5)-图像掩码操作(卷积)-锐化
- OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
- linux下使用opencv接口函数对图片边缘化操作
- BCB中使用opencv显示图片
- 在Android中使用OpenCv 来处理图片
- c#使用指针快速操作图片
- WINCE图片使用类,支持各种格式,支持旋转缩略图缩放等操作
- 使用opencv比较两个图片的相似性
- 使用ImageMagick 、Jmagick进行图片操作
- JAVA操作图片裁切与缩放的一个工具类,个人收藏使用
- 使用openCv从avi视频提取照片图片
- Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
- 使用GetThumbnailImage进行图片缩放操作
- 图片颜色掩码操作
- 使用ImageMagick + Jmagick进行图片操作(续2)——实现高质量的图片处理
- 使用ImageMagick + Jmagick进行图片操作(续)
- Flex与.NET互操作(十五):使用FluorineFx中的字节数组(ByteArray)实现图片上传
- 杂记之对位操作--掩码的使用