基于OpenCV的循环行、列移动函数circShift()
///*12 在Matlab中有个circShift()函数,可以实现行、列的循环移动
/// 在返卷积运算中,会用到这个函数。所以,在Opencv中我也定义同样
/// 功能的函数
/// 该函数有3个参数,第1个src是输入矩阵或图像,第2、3个参数分别是
/// 沿着'行'方向移动的函数,和沿着‘列’方向移动的列数。
在主函数circShift()中分别调用了两个子涵数:
circRowShift(Mat&src,int shift_m_rows)、
void circColShift(Mat& src,int shift_n_cols)
这两个函数分别实现了行循环移动和列循环移动,函数代码如下:
//*11.循环行、列移动函数circshift():
inline void circRowShift(Mat&src,int shift_m_rows)
{
int m=shift_m_rows;
int rows=src.rows;
//‘行’循环移动
if(m%rows==)
{
return;
} Mat mrows(abs(m),src.cols,src.type());//用于暂时保存末尾的m行数据
if(m>)
{
src(Range(rows-m,rows),Range::all()).copyTo(mrows);
src(Range(,rows-m),Range::all()).copyTo(src(Range(m,rows),Range::all()));
mrows.copyTo(src(Range(,m),Range::all()));
}else
{
src(Range(,-m),Range::all()).copyTo(mrows);
src(Range(-m,rows),Range::all()).copyTo(src(Range(,rows+m),Range::all()));
mrows.copyTo(src(Range(rows+m,rows),Range::all()));
}
}
inline void circColShift(Mat& src,int shift_n_cols)
{
int n=shift_n_cols;
int cols=src.cols;
int rows=src.rows;
if(n%cols==)
{
return;
}
///ncols,如果n>0,用于暂时保存末尾的n列数据
///ncols,如果n<0,用于暂时保存起始的n列数据
Mat ncols(rows,abs(n),src.type());
if(n>)
{
src(Range::all(),Range(cols-n,cols)).copyTo(ncols);
src(Range::all(),Range(,cols-n)).copyTo(src(Range::all(),Range(n,cols)));
ncols.copyTo(src(Range::all(),Range(,n)));
}
else
{
src(Range::all(),Range(,-n)).copyTo(ncols);
src(Range::all(),Range(-n,cols)).copyTo(src(Range::all(),Range(,cols+n)));
ncols.copyTo(src(Range::all(),Range(cols+n,cols)));
} } void circShift(Mat&src,int shift_m_rows,int shift_n_cols)
{
int m=shift_m_rows;
int n=shift_n_cols;
//‘行’循环移动
circRowShift(src,m);
//‘列’循环移动
circColShift(src,n);
}
//*11.行、列循环移动函数circshift() 结束
测试程序,对imgc移动3列:
int main()
{
// Mat img1=imread("D:/CodeWork/MyImage/baboon.jpg",0);
Mat imgc=(Mat_<uchar>(,)
<<,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,);
Mat imgr=imgc.t();
cout<<"original imgc="<<endl<<imgc<<endl;
circShift(imgc,,);
// circShift(imgc,0,3);
cout<<"3 cols-shifted imgc="<<endl<<imgc<<endl;
waitKey();
return ;
}
运行结果如下:

测试程序,对imgr移动3行:
int main()
{
// Mat img1=imread("D:/CodeWork/MyImage/baboon.jpg",0);
Mat imgc=(Mat_<uchar>(,)
<<,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,);
Mat imgr=imgc.t();
cout<<"original imgr="<<endl<<imgr<<endl;
circShift(imgr,,);
cout<<"3 rows-shifted imgr="<<endl<<imgr<<endl;
waitKey();
return ;
}
运行结果如下:

基于OpenCV的循环行、列移动函数circShift()的更多相关文章
- 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()
7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之一
基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...
- 基于opencv的小波变换
基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...
- 基于OpenCV的火焰检测(一)——图像预处理
博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...
- 每日一练之自适应中值滤波器(基于OpenCV实现)
本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
- Csharp调用基于Opencv编写的类库文件
现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW. 一.CLR编写的DLL部分 1.按照正常方法引入Ope ...
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...
随机推荐
- DNS如何工作
上一篇文章(什么是DNS)中,我们解释了 DNS 所涉及到的一些术语,接下来我们来看看 DNS 这个系统是如何工作的? 从高层次上看,这个系统非常简单,但是当你关注细节时,它又非常复杂.总的来说,它是 ...
- 06 saltstack生产实例-需求
https://github.com/unixhot/saltbook-code .Cobbler 1.15 统一网卡名 .Zabbix 系统已经安装好了! base .手动实现 .需要使用salt的 ...
- flask框架(十一): 蓝图
蓝图用于为应用提供目录划分: 一:上目录结构 二:上代码 <!DOCTYPE html> <html lang="en"> <head> < ...
- “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学) E 小花梨的数组 线段树
题意 分析 预处理出每个数的最小素因子,首先可以知道\(minprime(x*minprime(x))=minprime(x)\),我们用线段树维护区间最大值\(mx[p]\),注意这里的最大值并不是 ...
- 一、MySQL一些简述
概述 数据库(database) : 保存有组织的数据的容器(通常是一个文件或一组文件). 主键(primary key): 唯一标识表中每行的这个列(或这组列)称为主键.主键用表示一个特定的行.没有 ...
- EasySwoole 在mac上装虚拟机centos共享mac目录报错处理
[2019-09-26 21:37:09][DEBUG][ERROR] : [listen /media/psf/Home/wwwroot/myobj/easyswoole/Temp/TaskWork ...
- JavaWeb_ Servlet API(中文)
Java Servlet 中文API Java Servlet API由两个软件包组成:一个是对应HTTP的软件包,另一个是不对应HTTP的通用的软件包.这两个软件包的同时存在使得Java Se ...
- HDU 5884 Sort ——(K叉哈夫曼树)
这题真心比较奥义,先见这个人的博客:http://blog.csdn.net/libin66/article/details/52565484 补0的方法是使得其满足成为满K叉树,而其博客中所说的“所 ...
- [CSP-S模拟测试]:走路(期望DP+分治消元)
题目传送门(内部题100) 输入格式 第一行两个整数$n,m$,接下来$m$行每行两个整数$u,v$表示一条$u$连向$v$的边.不保证没有重边和自环. 输出格式 $n-1$行每行一个整数,第$i$行 ...
- __new()__与__init__()
1. __new__:创建对象时调用,会返回当前对象的一个实例.(默认情况下也就是你在类中没有没有重新这个方法,会默认返回当前类的示例,如果你重写了这个方法,但是在方法中没有返回当前类的示例,那么也就 ...