(5)opencv的基础操作和矩阵的掩模操作

不懂的,可以简单,看看这个网址:https://blog.csdn.net/xiongwen_li/article/details/78503491

图片放到了桌面,所以,图片的路径就是桌面了,剩余的代码如下

 1 #include<iostream>
 2 #include<opencv.hpp>
 3
 4 using namespace std;
 5 using namespace cv;
 6
 7 int main()
 8 {
 9     //定义两个位图的类
10     Mat sour, dest;
11     //将你要弄的图片读进来
12     sour=imread("C:\\Users\\32829\\Desktop\\aa.jpg");
13     if (!sour.data)//这里还可以用sour.empty()来检验图片读入是否正确
14     {
15         cout << "图片读入失败" << endl;
16         return -1;
17     }
18     //创建一个要展示图片的窗口
19     namedWindow("原图片展示", 1);
20     imshow("原图片展示", sour);//进行图片展示
21
22     //创建一个空的和原图片大小一样的图,并把它赋值给dest
23     dest = Mat::zeros(sour.size(), sour.type());
24     //图片的宽度,注意是原图片的列数减了1,为啥减一,暂时理解为是不考虑图片的第一列,还得乘以他的管道数
25     int cols = (sour.cols - 1)*sour.channels();
26     //因为你不考虑他的第一列,所以就设置了一个偏移量,这个变量
27     int offsets = sour.channels();
28     //图片的宽度
29     int rows = sour.rows;
30
31     for (int row = 1; row < (rows-1); row++)
32     {
33         const uchar* current = sour.ptr<uchar>(row);//获取当前图片当前行的指针
34         const uchar*privious = sour.ptr<uchar>(row - 1);//获取图片上一行行的指针
35         const uchar* next = sour.ptr<uchar>(row + 1);//获取当前图片下一行行的指针
36         uchar* output = dest.ptr<uchar>(row);//获取目标图片当前行的指针
37         for (int col = offsets; col < cols; col++)
38         {
39             //目的图片的当前像素点的计算。 saturate_cast<uchar>,这个就是保证你的RGB不溢出,范围都控制在0-255
40             output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsets] + current[col + offsets] + next[col] + privious[col]));
41         }
42     }
43     namedWindow("新的图片展示");
44     imshow("新的图片展示",dest);
45
46
47
48
49
50     waitKey(0);
51     return 1;
52 }

还有一个简单的代码,用opencv自己带的一个函数实现掩膜操作

 1 #include<iostream>
 2 #include<opencv.hpp>
 3
 4 using namespace std;
 5 using namespace cv;
 6
 7 int main()
 8 {
 9     //定义两个位图的类
10     Mat sour, dest;
11     //将你要弄的图片读进来
12     sour=imread("C:\\Users\\32829\\Desktop\\aa.jpg");
13     if (!sour.data)//这里还可以用sour.empty()来检验图片读入是否正确
14     {
15         cout << "图片读入失败" << endl;
16         return -1;
17     }
18     //创建一个要展示图片的窗口
19     namedWindow("原图片展示", 1);
20     imshow("原图片展示", sour);//进行图片展示
21
22
23
24
25     // 使用Filter2D函数
26     Mat result;
27     Mat kern = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
28     filter2D(sour, dest, sour.depth(), kern);
29
30
31     namedWindow("新的图片展示");
32     imshow("新的图片展示", dest);
33
34     waitKey(0);
35     return 1;
36 }

原文地址:https://www.cnblogs.com/xiaoyoucai/p/10178533.html

时间: 2024-10-12 07:11:00

(5)opencv的基础操作和矩阵的掩模操作的相关文章

OpenCV实践(2)- 矩阵的掩码操作

1 描述 在对数字图像进行处理时,我们一般都会在空间域(spatial domain)或者频域(frequency domain)中进行.所谓"空间域",实际上指的是图像本身,在空间域上的操作常常是改变像素点的值,也就是经过一个映射(我们所做的变换,如滤波等),将原来的f(x,y)变换为新的g(x,y).而"频域",它的数学基础是法国学者傅里叶提出的傅里叶级数和随后发展起来的傅里叶变换.在这其中起到重要作用的,就是电子计算机的不断完善和快速傅里叶变换(FFT)算法的

《学习opencv》笔记——矩阵和图像操作——cvGEMM,cvGetCol,cvGetCols and cvGetDiag

矩阵和图像的操作 (1)cvGEMM函数 其结构 double cvGEMM(//矩阵的广义乘法运算 const CvArr* src1,//乘数矩阵 const CvArr* src2,//乘数矩阵 double alpha,//1号矩阵系数 const CvArr* src3,//加权矩阵 double beta,//2号矩阵系数 CvArr* dst,//结果矩阵 int tABC = 0//变换标记 ); tABC变换标记及其对应的含义 CV_GEMM_A_T 转置 src1 CV_GE

《学习opencv》笔记——矩阵和图像操作——cvDet,cvDit,cvDotProduct,cvEigenVV and cvFlip

矩阵和图像的操作 (1)cvDet函数 其结构 double cvDet(//计算矩阵的行列式 const CvArr* mat ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { double va[] = {1,0,0,0,2,0,0,0,3}; CvMat Va=cvMa

OpenCV &mdash;&mdash; 矩阵和图像操作

cvAbs , cvAbsDiff , cvAbsDiffS cvAdd , cvAddS , cvAddWeighted(可添加权重) #include <cv.h> #include <highgui.h> int main(int argc,char** argv) { IplImage *s1,*s2; s1=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_COLOR); s2=cvLoadImage("test.

《学习opencv》笔记——矩阵和图像操作——cvSetIdentity,cvSolve,cvSplit,cvSub,cvSubS and cvSubRS

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

《学习opencv》笔记——矩阵和图像操作——cvAdd、cvAddS and cvAddWeighted

矩阵和图像的操作 (1)cvAdd函数 其结构 void cvAdd(//图像加和 const CvArr* src1,//第一个原矩阵 const CvArr* src2,//第二个原矩阵 CvArr* dst, //存放矩阵 const CvArr* mask = NULL: //控制点 ); 就是单纯的将两个图像加和,mask变量控制加和的元素点,相当于"开关的作用"; 程序实例 #include <cv.h> #include <highgui.h> #

《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor

矩阵和图像的操作 (1)cvCrossProduct函数 其结构 void cvCrossProdust(//计算两个三维向量的叉积 const CvArr* src1, const CvArr* src2, CvArr* dst ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main()

《学习opencv》笔记——矩阵和图像操作——cvCalcCovarMatrix,cvCmp and cvCmpS

矩阵和图像的操作 (1)cvCalcCovarMatrix函数 其结构 void cvCalcCovarMatrix(计算给定点的均值和协方差矩阵 const CvArr** vects,//给定向量 int count,//给定向量的组数 CvArr* cov_mat,//结果矩阵 CvArr* avg,//根据flag得到结果 int flags//标记位 ); 标记位参数值极其意义 标志参数的具体标志值 意义 CV_COVAR_NORMAL 计算均值和协方差 CV_COVAR__SCRAM

《学习opencv》笔记——矩阵和图像操作——cvSum,cvSVD,cvSVBkSb,cvTrace,cvTranspose,cvXor,cvXorS and cvZero

矩阵和图像的操作 (1)cvSum函数 其结构 CvScalar cvSum(//计算arr各通道所有像素总和 CvArr* arr//目标矩阵 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { IplImage *src1,*dst1,*dst2,*dst3,*dst4;