基于Python的Opencv入门教程(P2.项目结构的最后搭建以及实现显示图片)
书接上回(doge)
搭建OpenCV项目结构
在进入正式敲代码前,我们先把我们所需的图片下载下来。
下载到与你的python项目同一个文件夹里(图片必须在与代码文件放在同一个文件夹里如下图)


在本教程中,我们将创建两个Python脚本来帮助您学习OpenCV基础知识:
我们的第一个脚本,opencv_tutorial_01。py将使用电影《羞羞的铁拳》(ShengTeng.png)中的图像介绍基本的图像处理操作。
从这里开始,opencv_tutorial_02。py将向您展示如何使用这些图像处理构建块来创建OpenCV应用程序,以计算俄罗斯方块图像(tetris_blocks.png)中对象的数量。
完成以上步骤,我们的项目环境以及结构就基本完成了!(终于要敲代码了)

加载和显示图像信息

让我们首先打开opencv_教程_01。在Pycharm的空白项目中先复制上以下代码:
此处的第_行是指在OpenCV中显示出来的结果
在第3行和第4行中,我们同时导入imutils和CV2。CV2包是OpenCV,是用于影像处里的函数库;imutils包是一系列的便利函数。
现在,通过导入,我们已经拥有了所需的软件,让我们将图像加载并显示出来。
要加载我们的羞羞的铁拳的图片,我们称之为CV2.imread(“ShengTeng.png”)。如第7行所示,我们将结果分配给图像。我们的图像实际上只是一个NumPy列表。
在本脚本的后面,我们将需要高度和宽度。所以在第8行,我称之为image.shape以提取高度、宽度和深度。
高度先于宽度似乎令人困惑,但请这样想:
我们用行的#x列#来描述矩阵
行数是我们的高度
列数就是我们的宽度
因此,表示为NumPy列表(多维度列表)的图像的尺寸实际上表示为(高度、宽度、深度)。
深度是频道数-在我们的例子中,这是三个,因为我们使用三个颜色通道:蓝色、绿色和红色。
第10行显示的打印命令将向终端输出值:
为了使用OpenCV在屏幕上显示图像,我们使用CV2。第12行的CV2.imshow("Image", image)。下一行等待按键(第13行)。这一点很重要,否则图像的显示和消失速度甚至比我们看到图像的速度还要快。
注意:您需要实际单击OpenCV打开的活动窗口,然后按键盘上的键来推进脚本。OpenCV无法监控终端的输入,因此,如果您在终端中按下一个键,OpenCV将不会注意到。同样,您需要单击屏幕上活动的OpenCV窗口,然后按键盘上的一个键。
访问单个像素

首先,你可能会问:
什么是像素?
所有图像都由像素组成,像素是图像的原始构建块。图像由网格中的像素组成。1226 x866图像有1226列(宽度)和866行(高度)。具有这些尺寸的图像中有1226*866=1061716像素。
灰度图像中的每个像素都有一个表示灰度阴影的值。在OpenCV中,有256种灰度-从0到255。因此,灰度图像将具有与每个像素相关联的灰度值。
彩色图像中的像素具有附加信息。在了解图像处理后,您很快就会熟悉几种颜色空间。为了简单起见,我们只考虑RGB颜色空间。
在OpenCV中,RGB(红、绿、蓝)颜色空间中的彩色图像具有与每个像素相关联的三元组:(B、G、R)。
请注意,排序是BGR而不是RGB。这是因为当OpenCV在许多年前首次开发时,标准是BGR订购。多年来,该标准现已成为RGB,但OpenCV仍保持这种“传统”BGR排序,以确保没有现有的代码中断。
BGR 3元组中的每个值的范围为[0~255]。OpenCV中RGB图像中的每个像素有多少种颜色?这很简单:256*256*256=16777216。
现在我们已经确切地知道像素是什么,让我们看看如何检索图像中单个像素的值:
如上所示,我们的图像尺寸是宽度=1226,高度=866,深度=3。我们可以通过指定坐标来访问数组中的单个像素值,只要它们在最大宽度和高度范围内。
代码image[100,50]从位于x=50和y=100的像素中产生一个3元组的BGR值(同样,请记住,高度是行数,宽度是列数-现在请花一秒钟时间让自己相信这是真的)。如上所述,OpenCV以BGR顺序存储图像(例如,与Matplotlib不同)。查看为第16行的像素提取颜色通道值有多简单。
结果像素值显示在终端上:

备注
函数:每种编程语言中,都需要函数的参与,python同样也不例外。函数是集成的子程序,是算法实现的最小方法单位,是完成基本操作的手段的集合。编程中能够灵活应用函数,提高程序设计的简单化;实现代码应用的复用化;提升代码阅读的清晰化;加强代码开发的强健化;加快代码开发的效率化;增强团队开发的便利化;降低程序理解的复杂化;减少代码存储的减少化。总之,函数就是为实现功能或操作的独立功能块,可以返回也可以不返回值,可以返回一个值,可以返回多个值等。