1.学习图像数据格式Mat
像素就是把图形分割成很多大小相等的小正方形,其中每一个都是一个像素。我们常见的800*600的图形,800代表宽度,600代表高度。
灰度图像就是黑白灰,只有这三种颜色,其实就是不同程度的灰色。灰度图像中的像素用8位无符号数,0表示黑色,255表示白色,中间的则为不同程度的灰色。8位无符号数就是2的8次方,即255。一个8位色的像素,可以显示的颜色为2的八次方,0到255,就是能显示出256中颜色。
**需要掌握的基础函数操作:
Mat img; //定义一个可以存储图像的空间名为img
imread(“e:\1.jpg”); //读取路径中的图像
Imwrite(“e:\2.jpg”,img); //将img中存储的图像保存到e盘并命名为2.jpg
if(img.empty()); //如果img中没有存储图像,则img.empty()=1否则为0
namedWindow("原图像"); //命名一个窗口的名称为“原图像”
imshow("原图像", img); //展示img图像到“原图像”窗口
destroyWindow("原图像"); //销毁(关闭)窗口
cvtColor(img,img,CV_BGR2GRAY); //将img图转换为灰度图存到img中
img.at<Vec3b>(i, j)[0] = 0; //img彩色图像中坐标为(i,j)的像素点,将其蓝通道设置为黑色
Matdst = img.clone(); //将img复制存储到dst中
2图片的提取
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat picture = imread("Jmu.jpg");//图片必须添加到工程目录下
imshow("测试程序", picture);
waitKey(0);
}
using namespace cv;
int main()
{
Mat picture = imread("Jmu.jpg");//图片必须添加到工程目录下
imshow("测试程序", picture);
waitKey(0);
}
运行结果:
3.图形的读取、转灰度图、显示、保存
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv )
{
Mat img = imread("h:\\1.jpg");//将一张图片存储,读取到img
Mat grayimg;
cvtColor(img, grayimg, CV_BGR2GRAY);//将原图转化成灰度图片,存储到grayimg
imwrite("h:\\grayimg.jpg", grayimg);
if (img.empty())//如果图片不存在的情况
{
cout << "error"<<endl;
system("pause");
return 0;
}
imwrite("h:\\2.bmp", img);//将图片转化为其他格式存储
cout << "像素列数(宽度):" << img.cols << endl << "像素行数(高度):" << img.rows;
namedWindow("原图像");//命名一个图像窗口
imshow("原图像",img);//显示图像
cvtColor(img, img, CV_BGR2GRAY);
namedWindow("灰度图像");
imshow("灰度图像",img);
system("pause");
//销毁窗口
destroyWindow("原图像");
destroyWindow("灰度图像");
return 0;
}
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv )
{
Mat img = imread("h:\\1.jpg");//将一张图片存储,读取到img
Mat grayimg;
cvtColor(img, grayimg, CV_BGR2GRAY);//将原图转化成灰度图片,存储到grayimg
imwrite("h:\\grayimg.jpg", grayimg);
if (img.empty())//如果图片不存在的情况
{
cout << "error"<<endl;
system("pause");
return 0;
}
imwrite("h:\\2.bmp", img);//将图片转化为其他格式存储
cout << "像素列数(宽度):" << img.cols << endl << "像素行数(高度):" << img.rows;
namedWindow("原图像");//命名一个图像窗口
imshow("原图像",img);//显示图像
cvtColor(img, img, CV_BGR2GRAY);
namedWindow("灰度图像");
imshow("灰度图像",img);
system("pause");
//销毁窗口
destroyWindow("原图像");
destroyWindow("灰度图像");
return 0;
}
通常在结尾return 0;前面使用waitKey(0);用于观测实验结果,否则实现结果往往一闪而过。
或者参考使用system(“pause”);
4.图片的平移
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void imMove(Mat img, Mat &dst, int x, int y)
{
int MaxHeight = img.rows;//设定最大高度为图形高度
int MaxWidth = img.cols;//设定最大宽度为图形宽度
int i;
int j;
for (i = 0 ; i < MaxHeight; i++)
{
for (j = 0; j < MaxWidth; j++)
{
//判断位置后将像素逐个赋予到新的位置
if (i - x > 0 && i - x < MaxHeight&&j - y>0 && j - y < MaxWidth)
dst.at<Vec3b>(i, j) = img.at<Vec3b>(i - x, j - y);
else
{
dst.at<Vec3b>(i, j)[0] = 0;
dst.at<Vec3b>(i, j)[1] = 0;
dst.at<Vec3b>(i, j)[2] = 0;
}
}
}
}
int main(void)
{
Mat img = imread("h:\\1.jpg");
Mat dst = img.clone();
imshow("原图", img);
int x, y;
cout << "水平移动的距离" << endl;
cin >> x;
cout << endl << "输入垂直移动距离";
cin >> y;
imMove(img, dst, y, x);
imshow("平移后的图像",dst);
imwrite("h:\\2.jpg", dst);//保存平移后的图片
waitKey(0);
return 0;
}
#include<iostream>
using namespace std;
using namespace cv;
void imMove(Mat img, Mat &dst, int x, int y)
{
int MaxHeight = img.rows;//设定最大高度为图形高度
int MaxWidth = img.cols;//设定最大宽度为图形宽度
int i;
int j;
for (i = 0 ; i < MaxHeight; i++)
{
for (j = 0; j < MaxWidth; j++)
{
//判断位置后将像素逐个赋予到新的位置
if (i - x > 0 && i - x < MaxHeight&&j - y>0 && j - y < MaxWidth)
dst.at<Vec3b>(i, j) = img.at<Vec3b>(i - x, j - y);
else
{
dst.at<Vec3b>(i, j)[0] = 0;
dst.at<Vec3b>(i, j)[1] = 0;
dst.at<Vec3b>(i, j)[2] = 0;
}
}
}
}
int main(void)
{
Mat img = imread("h:\\1.jpg");
Mat dst = img.clone();
imshow("原图", img);
int x, y;
cout << "水平移动的距离" << endl;
cin >> x;
cout << endl << "输入垂直移动距离";
cin >> y;
imMove(img, dst, y, x);
imshow("平移后的图像",dst);
imwrite("h:\\2.jpg", dst);//保存平移后的图片
waitKey(0);
return 0;
}
运行结果:
5.图片的旋转,缩放
getRotationMatrix2D(1.图像旋转中心, 2.旋转角度 ,3.缩放尺寸)
warpAffine(1.输入源图像 ,2.输出图像,3.仿射变换矩阵,4.输出图像的尺寸)
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//Point2f就类似定义一个float型
Mat img = imread("h:\\1.jpg");
Point2f center = Point2f(img.cols / 2, img.rows / 2);//设定旋转中心
double angle;//旋转角度
double scale;//缩放尺度
printf("输入旋转的角度:");
cin >> angle;
printf("输入缩放的尺度:");
cin >> scale;
Mat rotateMat;
rotateMat = getRotationMatrix2D(center, angle, scale);
//旋转中心,旋转角度,缩放尺度
Mat rotateImg;
warpAffine(img, rotateImg, rotateMat, img.size());
//输入源图像,输出图像,仿射变换矩阵,输出图像尺寸
imshow("原图像", img);
imshow("旋转后的图像", rotateImg);
imwrite("h://2.jpg", rotateImg);//存储旋转后的图片
waitKey(0);
system("pause");
return 0;
}
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//Point2f就类似定义一个float型
Mat img = imread("h:\\1.jpg");
Point2f center = Point2f(img.cols / 2, img.rows / 2);//设定旋转中心
double angle;//旋转角度
double scale;//缩放尺度
printf("输入旋转的角度:");
cin >> angle;
printf("输入缩放的尺度:");
cin >> scale;
Mat rotateMat;
rotateMat = getRotationMatrix2D(center, angle, scale);
//旋转中心,旋转角度,缩放尺度
Mat rotateImg;
warpAffine(img, rotateImg, rotateMat, img.size());
//输入源图像,输出图像,仿射变换矩阵,输出图像尺寸
imshow("原图像", img);
imshow("旋转后的图像", rotateImg);
imwrite("h://2.jpg", rotateImg);//存储旋转后的图片
waitKey(0);
system("pause");
return 0;
}
6.实验楼 实验1
解释器
Python 是一个脚本语言,你可以在 Python 解释器中直接写代码或者将代码写到一个文件里,然后执行这个文件(即脚本文件)。首先,我们从使用解释器开始,打开终端,键入python3 并回车。这个时候解释器便工作于交互模式。按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器。
脚本文件
先启动 Vim 并编辑 China。py,启动后不要乱按键。然后按 i 键进入插入模式,此时你可以看到左下角有 “插入” 两个字,现在你可以键入代码了。然后按 Esc 键退出插入模式,再键入 :wq 回车,Vim 就会保存文件并退出。要运行脚本文件 China.py,还要为文件添加可执行权限: chmod +x helloworld.py,然后执行脚本文件:$ ./helloworld.py
完成本实验后,明白了如何使用交互模式的 Python3 解释器,如何简单使用 vim 编写脚本文件并执行这个脚本文件,要特别注意的是,Python 使用缩进来定义语句块,缩进是 Python 语法的一部分,这与其它大多数语言不同。