可以通过掩模矩阵(通常来讲叫核)对图像的每个图像像素值重新计算。这个掩模板能够调整临近像素包括当前像素对新像素的影响程度。从数学的角度来讲,我们用特殊的值对当前的值做了一个加权平均的操作。举个例子,设想一个图像对比度增强的方法,基本上,我们要将下面的公式应用到每一个像素上:

第一个公式是用数学公式,第二个是用一个掩模板。将掩模板中心放到你想计算像素上,将像素值累加并乘以与重叠矩阵值想成。对于较大的矩阵来看,后一种表达方式更容易理解。

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>using namespace std;
using namespace cv;void Sharpen(const Mat& myImage, Mat& Result);int main()
{Mat srcImage = imread("lena.jpg");//判断图像是否加载成功if(srcImage.data)cout << "图像加载成功!" << endl << endl;else{cout << "图像加载失败!" << endl << endl;return -1;}namedWindow("srcImage", WINDOW_AUTOSIZE);imshow("srcImage", srcImage);Mat dstImage;dstImage.create(srcImage.size(), srcImage.type());Sharpen(srcImage, dstImage);namedWindow("dstImage",WINDOW_AUTOSIZE);imshow("dstImage",dstImage);waitKey(0);return 0;
}void Sharpen(const Mat& myImage, Mat& Result)
{CV_Assert(myImage.depth() == CV_8U);        //判断函数CV_Assertconst int nChannels = myImage.channels();for(int j = 1; j < myImage.rows - 1; ++j){const uchar* precious = 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]-precious[i]-next[i]);}}Result.row(0).setTo(Scalar(0));                 //设置第一行所有元素值为0Result.row(Result.rows-1).setTo(Scalar(0));     //设置最后一行所有元素值为0Result.col(0).setTo(Scalar(0));                 //设置第一列所有元素值为0Result.col(Result.cols-1).setTo(Scalar(0));     //设置最后一列所有元素值为0
}

运行结果如图所示:

对上述程序简单做个分析。
(1). main()函数中加载图像后一定要判断图像是否加载成功,这是良好的编程习惯。判断图像是否加载成功有两种方式如下:

//图像为空即加载失败
if(srcImage.empty())
{//...处理方法...
}
else        //图像加载成功
{//...图像加载成功...
}//图像是否有数据
if(srtImage.data)
{//...处理方法...
}
else        //即图像加载失败
{//...处理方法...
}

注意:在使用empty()函数时其带后面的”()”而使用data判断时不带”()”,这是两者的区别。
(2). 加载图像成功后使用CV_Assert()函数判断图像是否unsigned char 类型。
(3). 通过create()函数创建一个和原图像尺寸和类型相同的目标图像。对于create()等函数的用法可以参考opencv学习(一)之Mat类,里面有具体叙述,在此不过多介绍!
(4). 此程序是利用上述第一个数学公式对图像像素进行重新计算和处理,通过其上下左右四个邻域像素和其本身像素值通过计算得到新的像素值。在本程序中利用C语言[]操作符来读取像素。因为我们需要同事读取多行,所以提前获取当前行,上一行和下一行的指针(previous、current、next).行指定完后还需要定义一个指针存储计算结果(output).
(5). 对于列的处理先获取当前图像的通道数,然后对每个像素的每个通道上的数值进行计算: current[i - nChannels]和current[i + nChannels]两个为当前像素左右两个像素相同通道的值,而previous[i]和next[i]为上下两个像素值相同通道的像素值.
(6). 利用本方法计算时,对于图像的上下左右四条边最外面的像素点无法计算,故在最后利用四行代码对其进行认为赋值为0,这样得到的计算结果与原图像相比,四周会出现黑线!!!

opencv学习(六)之掩膜版相关推荐

  1. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  2. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  3. OpenCV学习笔记(六)(七)(八)(九)(十)

    OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...

  4. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

  5. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  7. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  8. opencv学习笔记21:直方图和掩膜 原理及其应用

    直方图概念 如图:下面黑色图为上面图的直方图 横坐标:图像中各个像素点的灰度级 纵坐标:具有该灰度级的像素个数. 归一化直方图 横坐标:图像中各个像素点的灰度级 纵坐标:出现该灰度级的概率. DIMS ...

  9. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

最新文章

  1. 2020-10-29Ubuntu20.04将软件添加至桌面
  2. Triangular Sums http://acm.nyist.net/JudgeOnline/problem.php?pid=122
  3. Java多线程知识小抄集(三)
  4. 软件测试文档在哪里,软件测试报告技术文档
  5. Mac OS使用技巧之八:Dock栏使用技巧
  6. sklearn.neighbors.kneighbors_graph的简单属性介绍
  7. 力扣算法题—095不同的二叉搜索树【二叉树】
  8. 《笨办法学Python》笔记33-----一个项目骨架(转)
  9. ehcache 实现缓存共享
  10. 关于InnerHTML存在的问题
  11. 员工离职时,主管应该问相关竞业的两个问题
  12. 浅分享一下zzulioj刷题总结
  13. ios 启动图一键生成工具_APP启动图生成
  14. ubuntu 安装matlab+matconvnet
  15. [亲自试过有效] 错误1606。无法访问网络位置
  16. 斯坦福 计算机音乐 访问学者,韩宝强
  17. 计算机科学与技术b类大学名单,双一流a类大学和b类大学名单及学科
  18. oracle00312,ORA-00322 ORA-00312 恢复
  19. 注解的写法格式与作用
  20. 一、<a>标签如何实现下载

热门文章

  1. 深读源码-java集合类总结篇
  2. 高防CDN、高防服务器以及高防IP怎么选择
  3. Salient Object Detection: A Benchmark (显著性目标检测的一个基准)
  4. matlab中的repmat函数
  5. 【短视频运营】短视频剪辑 ⑤ ( 视频素材使用 | 设置插入后的视频素材属性 | 设置画面 | 设置音频 | 设置变速 | 设置动画 | 设置调节 )
  6. 有限元:有限元法概述
  7. 使用WMI来得到系统的服务
  8. 网络安全领域中八大类CISP证书
  9. pdf文件转换成jpg图片格式的四种方法
  10. 学习OMO游戏管理驾驶舱的设计