///*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()的更多相关文章

  1. 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()

    7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...

  2. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  3. 基于opencv的小波变换

    基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...

  4. 基于OpenCV的火焰检测(一)——图像预处理

    博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...

  5. 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  6. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

  7. 每日一练之自适应中值滤波器(基于OpenCV实现)

    本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...

  8. Csharp调用基于Opencv编写的类库文件

    现在将Csharp调用基于Opencv编写的类库文件(Dll)的方法定下来,我取名叫做GreenOpenCsharpWarper,简称GOCW. 一.CLR编写的DLL部分 1.按照正常方法引入Ope ...

  9. 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)

    本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比.最后,对中值滤波器的优缺点了进行了总结. 空间滤 ...

随机推荐

  1. MySQL 关于自定义函数的操作

    -- 函数 --> 模块化,封装,代码复用 create function 函数名([参数列表]) returns 数据类型 begin SQL语句: return 值: end; 示例: -- ...

  2. Linux-Shell编程之创建shell脚本并执行

    1.创建文件 touch myFirst.sh 2.编辑文件 vi myFirst.sh 点击键盘的字母 I 进行编辑,输入一下内容 #!/bin/bash # My First script ls ...

  3. 【备忘录】ORACLE数据库每日计划EXPDP备份

        1.OracleBackup_expdp版本|oracle.bat文件 还需手动更改的内容如下: 调用格式需改成call %~dp0\OracleBackup 数据库 用户名 密码 文件夹名称 ...

  4. 题解 【NOIP2010】关押罪犯

    [NOIP2010]关押罪犯 Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突 ...

  5. 【C#-导出Excel】DataSet导出Excel

    1.添加引用 2.封装方法 using System; using System.Data; using System.IO; using NPOI.HSSF.UserModel; using NPO ...

  6. HDU 5335 Walk Out BFS 比较坑

    H - H Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  7. Codevs 4019 想越狱的小明

    4019 想越狱的小明 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题目描述 Description 这次小明来到了经典美剧<越狱>的场景里-- 它 ...

  8. 微信小程序_(案例)简单中国天气网首页

    Demo:简单中国天气网首页 Page({ data:{ name:"CynicalGary", temp:"4", low:"-1°C", ...

  9. R-aggregate()

    概述 aggregate函数应该是数据处理中常用到的函数,简单说有点类似sql语言中的group by,可以按照要求把数据打组聚合,然后对聚合以后的数据进行加和.求平均等各种操作. x=data.fr ...

  10. [BZOJ4033]:[HAOI2015]树上染色(树上DP)

    题目传送门 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加 ...