题目:线性代数在计算机视觉中的应用

1.问题描述

2.解决问题的思路及方法

2.1问题分析

2.2建模与求解

2.3用到的线性代数知识点

3.结果演示和结论

4.小结和问题引申

5.参考文献

引言:

在学习线性代数的初期,我们了解到,一个二阶矩阵可以表示在平面直角坐标系中函数图像的变换,那么,一个印在平面上的图像理应可以通过矩阵进行变换。

1.问题描述:

1959年,神经生理学家David Hubel和Torsten Wiesel通过猫的视觉实验,首次发现了视觉初级皮层神经元对于移动边缘刺激敏感,发现了视功能柱结构,为视觉神经研究奠定了基础——促成了计算机视觉技术40年后的突破性发展,奠定了深度学习之后的核心准则。

此时,人们已经能够通过照相机和摄影机来捕捉现实生活中的图像,然而,如何把图像转化为计算机能理解的形式,以及如何通过计算机来处理这些图像,成为了当时的一大难题。

2.解决问题的思路及方法

2.1问题分析:

众所周知,计算机所能处理的数据是离散性的,而现实生活中的事物细节却是连续的,即便是胶片上的照片,也充斥着二维平面上的连续数据,有着无限的细节。

所以,要想处理图像,就必须把图像分割成许多个小块,并让计算机对每个小块单独处理,这样,就达到了把图像的连续数据转化为离散型数据的目的。而由于每个小块可以看作图像中的一个元素,所以整个图像就可以看作一个包含众多像素的矩阵。而对图像的处理,正是线性代数中对矩阵所作的处理。

1957年基尔希通过扫描自己儿子照片的方式,创造出了一幅由三万个小方块(176*176)组成的数字图片序列。并被认为是世界上第一张数码图片。而构成这幅数码图片的最小单位,也就是那三万个小方块。被基尔希和他的科研团队命名为‘像素’。

对于彩色图而言,单个像素点用红、绿、蓝三通道的二维矩阵来表示,而线性代数的计算则完美解决了像素变换的问题。

2.2建模与求解

要把线性代数的思想引入计算机中,首要任务是让计算机能够理解线性代数中的基础:矩阵。而在编程语言中,则通过引入数组这一概念来容纳一个个矩阵,数组可以是任意行任意列的,因而可以容纳所有形式的矩阵。例如若要定义一个n维矩阵,在c++中可以通过int a[n][n]这一语句来实现,其中n必须为整数,否则不合逻辑。

由于图像被分割成无数个像素,故每一个像素点都是矩阵的元素,故通过对矩阵进行变换就可以实现对图像的处理。

而通过编写一系列的函数,编程语言可以将一个图像转化为矩阵形式。

例如:Mat image1(100,100,CV_8U,100);就实现了创建一个用来容纳图像的矩阵,其中包括了四个参数:矩阵行数,矩阵列数,数据类型,初始值。

2.3用到的线性代数知识点

将一个图像转化为计算机能处理的格式涉及到线性代数中矩阵的概念,而对图像所作的对称、剪切、换色等处理则分别涉及到矩阵的转置,去行,加减等知识,其中最重要的是线性代数中的线性变换这一知识点,大量的图像处理技术都以线性变换这一知识为基础和延申。其中也不乏矩阵的初等变换等知识点。

3.结果演示和结论

如要实现获取图像信息这一功能,在C++中可以通过如下代码实现:

#include<iostream>

#include<opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

Mat image1 = imread("lena.png");  //读取图像;

if (image1.empty())

{

cout << "读取错误" << endl;

return -1;

}

imshow("image1", image1);  //显示图像;

cout << "图像的行数为: " << image1.rows << endl;  //获取图像的高度,行数;

cout << "图像的列数为: " << image1.cols << endl;  //获取图像的宽度,列数;

cout << "图像的通道数为: " << image1.channels() << endl;  //获取图像的通道数,彩色图=3,灰度图=1;

cout << "图像的尺寸为: " << image1.size << endl;  //获取图像的尺寸,行*列;

waitKey(0);  //暂停,保持图像显示,等待按键结束

return 0;

}

若运行如上代码,得到的一个可能输出结果如下:

图像的行数为:512

图像的列数为:512

图像的通道数为:3

图像的尺寸为:512*512

结论:该代码实现了对一个图像信息的获取及打印,

4.小结和问题引申:

小结:综上,我们通过利用线性代数的知识解决了图像信息转化为计算机数据的需求,并通过对编程语言的一系列修正和填补,实现了对图像的各种处理,益处则是诸如现在的P图软件功能的实现,实现了对图片的进一步美化,同时也使得计算机中的数据变得多样化,让人们得以通过计算机来传输图像数据,同时通过进一步的发展也延申出了之后通过快速播放多组图片进而实现的视频功能。而这一切则是基于线性代数的各种知识使得图像得以进入计算机的世界。

问题引申:线性代数实现了计算机对图像的处理,使得图像数据得以进入计算机的世界中,那么,在此基础之上,是否可以通过对线性代数知识的灵活使用,进一步实现将3D数据引入计算机,并使得计算机可以处理3D图像与模块呢?这是一个值得深思的问题。

5.参考文献:

《2D计算机视觉》《计算机视觉编程》《C++程序基础》《线性代数及其应用》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值