/*
矩阵的掩膜操作 0 掩膜mask 在这里进行增强对比度:
[
[ 0,-1, 0 ],
[-1, 5, -1],
[ 0,-1, 0 ]
]
使用mask滑动图片每一个位置,进行卷积运算
这里这个mask会增强图片的对比度 1 获取图像指针
const uchar* current = Mat对象.ptr<uchar>(row)
获取了 当前图像的 第row行像素的数组 p(row, col) = current[col]
获取了第row行第col列的点 2 像素范围处理 确保值在0到255之间
saturate_cast<uchar>(值)
传入值小于0时候返回0
大于255时候 返回255
在0-255之间 返回正常数 3 定义掩膜
Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
定义了一个3*3大小的掩膜,里面的内容:
[
[ 0,-1, 0 ],
[-1, 5, -1],
[ 0,-1, 0 ]
]
4 掩膜运算
filter2D(src, dst, src.depth(), kernel)
src: 原图像
dst: 输出图像
src.depth() 原图像的深度 32 24 8 等
kernel: 掩膜核
*/ #include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv; int main() {
Mat src, dst;
src = imread("d:/图片/m2.jpg"); // 载入原图像
if (!src.data) { // 如果有读取到
printf("没有找到图片");
return -;
}
// 显示原始图像
namedWindow("输入图片", CV_WINDOW_AUTOSIZE);
imshow("输入图片", src); // 输出图像的初始化 与原图像相同,像素值初始化为0
dst = Mat::zeros(src.size(), src.type()); /*
// 手动实现一个掩膜操作 // 图像的宽度 为 宽度*通道数
int cols = (src.cols) * src.channels(); // 列数 宽度
int rows = src.rows; // 行数 高度
int offsetx = src.channels(); // 通道数 存在列里面 // 掩膜操作没有从0 0 开始是为了把边界让开,掩膜是3*3的, 中间一个是目标位置。
for (int row = 1; row < rows - 1; row++) {
// 获取通道对应的指针
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = offsetx; col < cols - offsetx ; col++) {
// 掩膜运算 并且控制像素值在0到255之间
output[col] = saturate_cast<uchar>( // 控制像素值0到255之间
5 * current[col] - // 当前像素值
(
current[col - offsetx] + // 左边像素值
current[col + offsetx] + // 右边像素值
previous[col]+next[col] // 上合下的像素值
)
);
}
} */
// 计算时间花费
double t = getTickCount(); // 调用掩膜运算
// 初始化一个掩膜
Mat kernel = (Mat_<char>(, ) <<
, -, ,
-, , -,
, -, );
filter2D(src, dst, src.depth(), kernel); // 计算时间花费
double time_cost = (getTickCount() - t) /getTickFrequency();
printf("花费时间:%f", time_cost); namedWindow("掩膜操作", CV_WINDOW_AUTOSIZE);
imshow("掩膜操作", dst); waitKey();
return ;
}

opencv 掩膜操作 滤波 卷积核定义 增强对比度 掩膜运算的更多相关文章

  1. OpenCV计算机视觉学习(2)——图像算术运算 & 掩膜mask操作(数值计算,图像融合,边界填充)

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底是什么呢,下面我们从图像基本运算开始,一步一步学习掩膜. 1,图像算术运算 图像的算术运算有很多种,比 ...

  2. 跟我一起学opencv 第二课之图像的掩膜操作

    1.掩膜(mask)概念 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程.用于覆盖的特定图像或物体称为掩模或模板.光学图像处理中,掩模可以足胶片,滤光片等 ...

  3. openCV - 2. 矩阵的掩膜操作

    获取图像像素指针.掩膜操作解释 获取图像像素指针 CV_Assert(myImage.depth() == CV_8U); Mat.ptr<uchar>(int i=0) 获取像素矩阵的指 ...

  4. opencv掩膜操作

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  5. 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践

    <在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波>                                          --Gabor增强的具体实践     一.问 ...

  6. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...

  7. OpenCV探索之路(十三):详解掩膜mask

    在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...

  8. opencv 矩阵操作

    OpenCv矩阵操作 有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等 大多数函数支持ROI,如果图像ROI被设置,那么只处 ...

  9. Java 8新特性-2 接口定义增强

    为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的  ...

随机推荐

  1. Celery异步任务队列/周期任务+ RabbitMQ + Django

    一.Celery介绍和基本使用  Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celer ...

  2. QByteArray储存二进制数据(包括结构体,自定义QT对象)

    因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 //自定义person结构体 typede ...

  3. 【Java基础】JAVA不可变类(immutable)机制与String的不可变性

    一.不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值.如JDK内部自带的很多不可变类:Interger.Long和String(8种基本数据类型的包装类和S ...

  4. oracle主键约束、唯一键约束和唯一索引的区别

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除: (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空: (3)相同字段序 ...

  5. Docker Compose practice

    Docker Compose 什么是 Docker-Compose? Compose 可以让用户在集群中部署分布式应用.简单的说,Docker Compose 属于一个"应用层"的 ...

  6. java 一个函数如何返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  7. 洛谷P1186玛丽卡

    传送门啦 先跑一遍最短路,将最短路的路径记录下来,然后枚举每一条最短路的边,将其断掉,记录此时的1-n的时间,取其中最大的一个时间即为所求. (通过 $ cut[][] $ 和 $ f[] $ 进行操 ...

  8. MySQL学习笔记:生成时间维度表

    # ---- 对应时间戳怎么生成的? ---- /*TIME_CD TIME_CD1000000 000005000001 000005000002 000005000003 000005000004 ...

  9. 20165333 2017-2018-2《Java程序设计》课程总结

    一.每周作业链接汇总 1.预备作业一:我期望的师生关系 简要内容: 印象深刻的老师 我期望的师生关系 关于JAVA学习 2.预备作业二:学习基础和C语言学习基础 简要内容: 技能学习 C语言学习 关于 ...

  10. MATLAB读写Excel文件中的数据

    读取: %读取filename文件中指定表的数据,存入dataRead矩阵中 dataRead=xlsread('filename.xls',sheet); 写入: %将矩阵dataWrite中的数据 ...