首页 > 其他 > 详细

2、图像处理基础

时间:2017-01-12 10:37:37      阅读:208      评论:0      收藏:0      [点我收藏+]

回顾

Mat

行 列 通道  维度

row col channel dim

技术分享

在Mat里面除了上面四个比较常用的量以外,还有flag变量,它是在Mat 的头里面,包含了图像的维度,深度(是short类型、char类型还是double类型的);除了flag还有一个data的指针,它是指向内存中数据所在地址的;还有一个referencecount指针,引用计数指针,看有多少指针指向了这个地址。

第二讲的内容开始

在Mat中有一个data指针,data指针指向的是数据在内存中的首地址,

技术分享

技术分享

例子:

Mat m(400,400,CV_8U,Scalar(0));

定义一个单通道的400*400大小的矩阵,矩阵元素初值为0,即全黑的图像

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

int main(int argc, char* argv[])

{

Mat m(400,400,CV_8U,Scalar(0));
 for (int col = 0; col < 400; col++)
 {
  for (int row = 195; row < 205; row++)
  {
   cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << "  ==>";
   //获取第[row,col]个像素点的地址并用*符号解析
   *(m.data + m.step[0] * row + m.step[1] * col) = 255;
   cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl;
  }
 }
 imshow("canvas",m);
 cvWaitKey();
 getchar();
 return 0;
}

例子:

Vec3i color定义一个变量,它是Vector类型的,有3个元素,且是int型的;

注意cvWaitKey()可以传参,单位是毫秒;

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

int main(int argc, char* argv[])

{

Mat m = imread("lena.jpg");
 int *p_address;
 Vec3i color;
 for (int col = 20; col < 40; col++)
 {
  for (int row = 2; row < 20; row++)
  {
   color[0] = (int)(*(m.data+m.step[0]*row+m.step[1]*col));
   color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col+m.elemSize1()));
   color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()*2));
   //获取第[row,col]个像素点的地址并用*符号解析
   cout << color[0] << "," << color[1] << "," << color[2] << "  ==>";
   color[0] = 255;
   color[1] = 0;
   color[2] = 0;
   *(m.data + m.step[0] * row + m.step[1] * col) = color[0];
   *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()) = color[1];
   *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2) = color[2];
   cout << (int)*(m.data + m.step[0] * row + m.step[1] * col) << (int)*(m.data + m.step[0] * row + m.step[1] * col + 1) << (int)*(m.data + m.step[0] + m.step[1] * col + 2) << endl;
  }
 }
 imshow("canvas",m);
 cvWaitKey();
 getchar();
 return 0;
}

结果:

技术分享

技术分享

opencv的模板类Mat_类

技术分享

例子:

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

int main(int argc, char* argv[]) {

Mat m = imread("lena.jpg");
 Mat_<Vec3b> m2 = m;
 //for()循环画一个红色的实心圆
 for (int y = 21; y < 42; y++)
 {
  for (int x = 2; x < 21; x++)
  {
   if (pow(double(x - 11), 2) + pow(double(y - 31), 2) - 64.0 < 0.00000000001)
   {
    //Mat_模板类实现了对()的重载,可以定位到一个像素
    m2(x, y) = Vec3b(0,0,255);
   }
  }
 }imshow("canvas",m);
 cvWaitKey();
 getchar();
 return 0;
}

结果如下:

技术分享

注意pow函数的含义:pow(src,double p,dst);//如果p是整数dst(I)=src(I)^p;其他|src(I)|^p

像素值的读写6

技术分享

在2.4以前,有这两种数据类型IplImage和CvMat,我们现在都用Mat,然后有一些例程,它的形式是IplImage *p,这种图像指针类型的,我们可以用&iplimg这种引用的方式转换为Mat类型。

技术分享

同时也支持这两种方式互转,

技术分享

关于图像的读取

imread()函数,返回值是一个Mat类型,它读取失败里面的*data是指向NULL的,建议不要使用判断是否为NULL来说明是否读取成功;它自己有一个成员函数来判断的isempty();

flags只要大于0就代表返回3通道图像,灰度图像就会强制转化为3通道,flag为0,强制转化为单通道;flag小于0,那么是什么就读什么,不进行转换;

有一种图像格式叫做PNM,PPM,PGM,可移植像素格式,它是纯文本的格式,常见的是PGM的格式;

imwrite()是存储文件

注意并不是所有的Mat都可以存储成图像,目前只支持8U的单通道或者3通道格式,如果想把16U的转换成功的话,就只能用PNG格式或者JPEG2000,注意一下。

如果这个文件夹下有这个文件,它是直接覆盖的,不会有任何提醒;

技术分享

介绍一下,打开外设,或者读取视频的一个例子

VideoCapture这样一个类,有一个构造函数直接指定设备的编号cap(0);

技术分享

上面的例子是读,下面的例子是写

技术分享

 技术分享

技术分享

本课程涉及到深度学习与机器学习相关的内容,所以要学习一下python

技术分享

 python环境的安装,建议Anaconda+Ipython+(PyScripter)(版本2.7比较流行或者3.5都可以)

在2.7版本

x=3,x/2=1,是整型

在3.5版本

x=3,x/2=1.5是浮点型

机器学习

技术分享

机器学习:要随机得观测数据,要随机得对观测数据进行采样,要学习数据的性质,其实也叫做特征feature,以及属性,属性通常叫做label,他是属于那一个类别,再来预测新的未知的数据的属性。在机器学习当中,我们通常要把数据分成两部分,一部分叫做training(训练集用来学习数据特征),另一部分叫做test(测试集用来测试算法是否准确)。机器学习的问题主要分为

监督学习和非监督学习

监督学习除了数据本身以外,还有额外的属性部分,也就是说会有一些feature,然后再额外的会有一些label,这样的问题分为分类和回归两部分;分类问题可以理解为输出是离散数据;回归问题输出的就是连续的,比如说根据年龄、体重,来预测身高。监督学习主要是分类,尽量把问题转化为分类问题。

如果输入没有额外的label等,那么就叫做非监督学习,主要分为聚类(kmeans)和核密度估计。

Knn-Grassroots Democracy

当有一个未知物体的时候,在我们做出推荐之前会考虑一下它周围的数据的label是属于那个类别,从而从而觉得这个数据是属于那个类别的。

技术分享

knn作为一种机器学习算法也分为两部分,训练算法识别特征的类别,然后在训练集上测试;KNN的训练部分就是把训练集和标签全部存储,比如说,给出5这样一个训练的图像

技术分享,它的label就是5。

会有一个其他图片比如说是0,它的label就是0,

KNN就会把这两个属性全都存储下来,它就学习完了,只要把数据全部喂给算法,它就已经完成识别了,什么操作都没有,接下来就是测试部分,只要提供测试集,没有标签,在指定K的大小之后,让算法来猜它是什么数据。它是没有训练的,平时不学习,等到测试的时候问题就来了,它就把所有的训练集跟测试数据进行一一比对,比对就涉及到一个距离问题,测试两个向量的距离distance。

K-means算法。

 

2、图像处理基础

原文:http://www.cnblogs.com/gary-guo/p/6274820.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!