矩阵的掩模操作(通常也叫做卷积操作)非常简单。本文的中心思想是基于掩模矩阵(也称为内核或者卷积核)重新计算图像每个像素的值。此掩模矩阵(卷积核)的值定义了当前像素和相邻像素对新像素值进行影响的值。From a mathematical point of view we make a weighted average, with our specified values.(从数学的角度来看,基于掩模矩阵指定的值进行mask操作后再进行加权平均)。具体(实现锐化效果的)描述如下:

第一个是公式的形式; 第二个是基于掩模矩阵的版本。两个等价。

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)∗M,其中M=0−10−15−10−10

实现锐化效果的例子代码如下:

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace std;
using namespace cv;static void help(char* progName)
{cout << endl<<  "This program shows how to filter images with mask: the write it yourself and the"<< "filter2d way. " << endl<<  "Usage:"                                                                        << endl<< progName << " [image_name -- default lena.jpg] [G -- grayscale] "        << endl << endl;
}void Sharpen(const Mat& myImage,Mat& Result);int main( int argc, char* argv[])
{help(argv[0]);const char* filename = argc >=2 ? argv[1] : "lena.jpg";Mat src, dst0, dst1;if (argc >= 3 && !strcmp("G", argv[2]))src = imread( filename, IMREAD_GRAYSCALE);elsesrc = imread( filename, IMREAD_COLOR);if (src.empty()){cerr << "Can't open image ["  << filename << "]" << endl;return -1;}namedWindow("Input", WINDOW_AUTOSIZE);namedWindow("Output", WINDOW_AUTOSIZE);imshow( "Input", src );double t = (double)getTickCount();Sharpen( src, dst0 );t = ((double)getTickCount() - t)/getTickFrequency();cout << "Hand written function times passed in seconds: " << t << endl;imshow( "Output", dst0 );waitKey();//掩模矩阵定义初始化,用于filter2D函数Mat kernel = (Mat_<char>(3,3) <<  0, -1,  0,-1,  5, -1,0, -1,  0);t = (double)getTickCount();filter2D( src, dst1, src.depth(), kernel );t = ((double)getTickCount() - t)/getTickFrequency();cout << "Built-in filter2D time passed in seconds:      " << t << endl;imshow( "Output", dst1 );waitKey();return 0;
}//基于公式计算的版本
void Sharpen(const Mat& myImage,Mat& Result)//公式计算方式
{CV_Assert(myImage.depth() == CV_8U);  // accept only uchar imagesconst int nChannels = myImage.channels();Result.create(myImage.size(),myImage.type());for(int j = 1 ; j < myImage.rows-1; ++j){const uchar* previous = myImage.ptr<uchar>(j - 1);const uchar* current  = myImage.ptr<uchar>(j    );const uchar* next     = myImage.ptr<uchar>(j + 1);uchar* output = Result.ptr<uchar>(j);for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i){*output++ = saturate_cast<uchar>(5*current[i]-current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);}}Result.row(0).setTo(Scalar(0));Result.row(Result.rows-1).setTo(Scalar(0));Result.col(0).setTo(Scalar(0));Result.col(Result.cols-1).setTo(Scalar(0));
}

矩阵的掩模操作(锐化举例)相关推荐

  1. 【OpenCV】矩阵掩模操作

      矩阵掩模操作是指根据一个掩码矩阵(也称为内核kernel)重新计算图像中每个像素的值.掩码可以控制改变相邻像素和当前像素对新像素值的影响,从而产生新的图像像素.   本节通过图像锐化来比较图像指针 ...

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

    关于opencv的矩阵掩码的操作其他博客已经讲了很多了,他们基本上都是抄opencv中文社区的,本文跟他们的区别是,这里只具体解释公式 I(i,j) = 5*I(i,j) - [ I(i-1,j) + ...

  3. opencv图像处理02-图像矩阵掩模操作

    1. 矩阵掩模原理: 矩阵掩模算法feic非常简单,例如将一个3X3的矩阵,一张图像,对图像的每个像素点进行如下操作: 1.分别从左到右,从上到下,每个通道,拿3X3矩阵和原图对应位置做内积,最后得到 ...

  4. 【OpenCV学习】第2课:图片锐化 - 矩阵的掩膜操作(卷积中的锐化算子)

    仅自学做笔记用,后续有错误会更改 理论 这里用到的掩膜,其实只是数学中卷积的概念的一个应用 上下左右4个像素值分别乘以-1,再加上中间像素值乘以5的值,最后得到的值再重新赋值给中间像素,这就是掩膜的一 ...

  5. 转载:矩阵的掩膜操作实现图像对比度调整

    矩阵的掩膜操作实现图像对比度调整 hb707934728 2017-07-04 13:54:17 1170 收藏 最后发布:2017-07-04 13:54:17首发:2017-07-04 13:54 ...

  6. OpenCV学习2——矩阵的掩模

    图像的掩模(Mask) 以RGB图像为例:RGB图像它分别用红(R).绿(G).蓝(B)三原色的组合来表示每个像素的颜色.RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每 ...

  7. OpenCV 【十三】矩阵的掩码操作

    目录 1 Mask掩膜/滤波核 1.1 原理 1.2 实例 1.3 结果对比 2. filter2D函数 2.1 原理 2.2 实例 2.3 结果 1 Mask掩膜/滤波核 1.1 原理 矩阵的掩码操 ...

  8. python数值运算实例_Python矩阵常见运算操作实例总结

    本文实例讲述了Python矩阵常见运算操作.分享给大家供大家参考,具体如下: python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包. 一.numpy的导入 ...

  9. 独家|OpenCV 1.3 矩阵的掩膜操作(附链接)

    翻译:陈之炎 校对:王可汗.林夕本文约1600字,建议阅读5分钟本文为大家介绍了 OpenCV 矩阵的官方教程. 矩阵的掩膜操作(mask)并不难.主要思路为:根据掩膜矩阵(也称为内核kernel)重 ...

最新文章

  1. mongodb yum 安装
  2. hc05与单片机连接图_单片机科普:单片机的IO口不够用了怎么办?如何扩展单片机的IO口...
  3. 树莓派4B安装系统及基础配置
  4. 【机器视觉】 convert_vector_to_tuple算子
  5. 基本系统设备感叹号_win7系统网络图标显示感叹号的问题
  6. 深耕一个行业有缺点?
  7. 服务器硬盘raid5扩容,超实用,物理服务器RAID扩容详解
  8. echarts 三环圆环_echarts实现环形进度图
  9. WSS(Windows Storage Server)2008R2使用指南(三)配置及使用篇
  10. 图像检索:图像相似性度量
  11. 还真碰到不会cd命令的同事
  12. 7纳米,80核:Ampere第二代云数据中心Arm芯片即将推出
  13. 基于FFmpeg的H265编码器
  14. 优酷KUX视频转换MP4工具,纯个人向分享
  15. 人件札记:团队的化学反应
  16. 设计一个电商平台积分兑换系统
  17. 常用元器件的识别(转载)
  18. matlab读入三维点云数据斯坦福兔子
  19. CTO成长之路(一):优秀的程序员
  20. 三维旋转(根据转轴和角度)的公式。罗德里格旋转公式

热门文章

  1. 详解图像直方图均衡化原理,附MATLAB、C、C++源码
  2. 荣耀20搭载鸿蒙,荣耀20系列刚发布,搭载鸿蒙系统新机来袭,余承东已准备好!...
  3. c语言将源文件拷贝到目的文件,C语言编译过程 简介和详解
  4. leetcode算法题--Decode String
  5. mysql 启动参数_MySQL启动相关参数 MySQL DBA学习
  6. mongodb内置角色
  7. 背水一战 Windows 10 (10) - 资源: StaticResource, ThemeResource
  8. Bootstrap-table学习笔记(二)——前后端分页模糊查询
  9. oracle em登陆不了,账户密码过期
  10. 项目问题思考之策略模式