\tutorial_code\core\mat_mask_operations
2013-05-20 20:52
267 查看
【5】mat_mask_operations
OpenCV2.3.1\opencv\samples\cpp\tutorial_code\core\mat_mask_operations
名曰:矩阵的掩码操作
就是那个空間滤波啊。
上图就明白(图也是复制粘贴的。。)
基本方法
void Sharpen(const Mat& myImage,Mat& Result)
{
CV_Assert(myImage.depth() == CV_8U); // 仅接受uchar图像
Result.create(myImage.size(),myImage.type());
const int nChannels = myImage.channels();
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));
}
利用C语言的[]操作符,我们能简单明了地访问像素。因为要同时访问多行像素,所以我们获取了其中每一行像素的指针(分别是前一行、当前行和下一行)。此外,我们还需要一个指向计算结果存储位置的指针。有了这些指针后,我们使用[]操作符,就能轻松访问到目标元素。为了让输出指针向前移动,我们在每一次操作之后对输出指针进行了递增(移动一个字节):
在图像的边界上,上面给出的公式会访问不存在的像素位置(比如(0,-1))。因此我们的公式对边界点来说是未定义的。一种简单的解决方法,是不对这些边界点使用掩码,而直接把它们设为0:
filter2D函数
滤波器在图像处理中的应用太广泛了,因此OpenCV也有个用到了滤波器掩码(某些场合也称作核)的函数。不过想使用这个函数,你必须先定义一个表示掩码的 Mat 对象:
Mat kern = (Mat_<char>(3,3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
然后调用 filter2D 函数,参数包括输入、输出图像以及用到的核:
filter2D(I, K, I.depth(), kern );
它还带有第五个可选参数——指定核的中心,和第六个可选参数——指定函数在未定义区域(边界)的行为。
来吧 操起来。。。
操、?
操练哎 = =
这两种方法效果看起来真的很一样啊。。
然而OPENCV给的函数总是要给力那么多。。
相关文章推荐
- \tutorial_code\core\mat_the_basic_image_container
- OpenCV_Tutorials——CORE MODULE.THE CORE FUNCTIONALITY—— Mask operations on matrices
- \tutorial_code\core\how_to_scan_images
- mat_mask_operations
- \tutorial_code\core\Matrix
- \tutorial_code\core\discrete_fourier_transform
- \tutorial_code\core\file_input_output
- \tutorial_code\core\interoperability_with_OpenCV_1
- The Core MongoDB Operations with Native Java Driver
- 使用Visual Studio Code创建第一个ASP.NET Core应用程序
- .Net Core Linux centos7行—vscode开发,linux部署运行
- [EFCore]EntityFrameworkCore Code First 当中批量自定义列名
- opencv 笔记01Core_Mat
- \tutorial_code\ImgProc\BasicLinearTransforms.cpp
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试
- [Core] .NET Core & VS Code 之路(2) Web API
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
- ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
- VS Code开发调试ASP.NET Core 1.0
- \tutorial_code\ImgProc\Threshold.cpp