- 什么是图片?
- 电脑如何存储图像
- 为什么机器很难识别图像
- OpenCV的应用和使用
- 使用Python和Anaconda安装OpenCV
- 在OpenCV中打开和保存图像
- OpenCV中的灰度图像
- 色彩空间
- 探索RGB图像的各个组成部分
- 将图像转换为单独的RGB分量
- 图像的直方图表示
- 使用OpenCV绘制图像和形状
艺术是一种看待的方式,他们说看到就是相信,但事实也恰恰相反,相信就是看到,而且很难想象在没有视觉天赋的情况下生活在这个世界中-我们的眼睛,婴儿般的美好当我们睁开双眼时,我们看到了世界,并开始认识和看到我们周围的世界,但是随着时间的流逝,同样美好的经历变成了平凡的经历。但是,随着技术的进步,机器也可以看到和理解它。目前,如果只是用脸解锁手机似乎还不是科幻小说,但是机器视觉的发展历史可以追溯到20年前。
该领域最初的正式步骤是1999年由Intel发起的,当时所有正在进行的研究都是在OPEN CV(开源计算机视觉)的协作下进行的,该软件最初是用C ++编写的,2006年发布了第一个主要版本1.0。 2009年,2015年排名第三,2018年排名第四。现在,OpenCV具有C ++,Python和Java接口,并支持Windows,Linux,Mac OS,iOS和Android。因此,可以在具有Python和Linux环境的Raspberry Pi中轻松安装它。带有OpenCV和附加摄像头的Raspberry Pi可用于创建许多实时图像处理应用程序,例如人脸检测,人脸锁,物体跟踪,汽车车牌检测,家庭安全系统等。
在学习使用openCV进行图像处理之前,重要的是要了解什么是图像以及人和机器如何看待这些图像。
什么是图片?
图像是可见光谱的二维表示。可见光谱只是红外光谱和紫外光谱之间电磁光谱的一部分。
图像的形成方式:-当光从物体反射到胶片,传感器或视网膜上时。
这是我们的眼睛的工作方式,它使用障碍物阻挡了大部分光线,并留下了一个小开口,光可以通过它穿过,这被称为光圈,它形成了非常聚焦的图像,并且是针孔相机的工作模型,但是针孔相机存在一个问题,即相同数量的光会进入光圈,这可能不适合胶片或所形成的图像,我们也无法获得聚焦图像,从而无法聚焦图像需要来回移动胶片,但这在许多情况下是有问题的。
或者我们可以通过使用镜头来解决此问题,它可以让我们控制光圈大小,并且在摄影中称为f Stop,通常在摄影时降低f Stop的值会更好。
光圈大小还使我们进入了摄影中称为Bokeh的良好景深,它使我们在聚焦图像时背景模糊。
电脑如何存储图像
您可能听说过各种图像格式,例如.png,.jpgG等。所有这些都是我们模拟世界的数字表示,计算机通过将图像转换为数字代码进行存储,然后将文件解释回图像中来进行处理。显示。但从根本上讲,它们使用一个通用的平台来存储图像,而openCV也是这样。
OpenCV默认为其图像使用RGB(红色,绿色和蓝色)颜色空间,其中每个像素坐标(x,y)包含3个强度范围为8位形式的值,即(0-255,2 8)。
混合每种颜色的不同强度可以提供完整的光谱,这就是为什么在绘画或艺术中将这三种颜色视为原色,而将其他所有颜色都视为原色的原因,因为大多数第二色可以由原色形成。像黄色一样,我们有以下值:红色– 255;绿色– 255;蓝色– 0。
现在,图像存储在多维数组中。在编程中,数组是一系列对象的集合。在这里,我们处理三种类型的数组1D,2D和3D,其中“ D”代表维。
彩色图像存储在三维阵列中,其中第三维表示RGB颜色(我们将在后面看到),它们共同形成图像的不同像素强度,而黑白图像则存储在二维阵列中黑白图像有灰度和二进制图像两种。
灰度图像是由二维阵列的灰色阴影形成的,而二进制图像是黑色或白色像素的。
为什么机器很难识别图像
计算机视觉本身就是一项艰巨的任务,您可以自己想象一下,赋予机器视觉,识别和识别的感觉有多么困难。有以下因素使计算机视觉变得如此困难。
- 相机传感器和镜头限制
- 视点变化
- 改变照明
- 缩放比例
- 遮挡物
- 对象类的变化
- 含糊不清的图像/错觉
OpenCV的应用和使用
尽管困难重重,“计算机视觉”还是有许多成功案例
- 机器人导航–自动驾驶汽车
- 人脸检测与识别
- 搜索引擎图片搜索
- 车牌阅读
- 手写识别
- Snapchat和面部滤镜
- 物体识别
- 体育中的球和球员追踪
- 还有很多!
使用Python和Anaconda安装OpenCV
OpenCV是用C ++编写的,但是用C ++来实现它非常困难,因此我们选择使用高级语言(例如python)来实现它,并且由于Python是最简单的语言之一,所以用python来实现OpenCV还有其他好处。对于初学者来说,它对于数据科学和机器学习应用程序也非常强大,并且它以numpy数组存储图像,这使我们可以轻松地执行一些非常强大的操作。
基本编程对于暴露于高中数学,网络摄像头,Python 2.7或3.6(首选Anconda软件包)很有用。
步骤1.下载并安装Anaconda Python软件包
转到:https://www.anaconda.com/cn/download,然后根据您的计算机在Windows,Linux或Mac上的天气情况进行选择,并且可以为64位系统或32位系统选择python 2.7或python 3.7版本,但是现在一天,大多数系统都是64位。
蟒蛇的Anaconda发行版与Spyder studio,jupyter笔记本和anaconda提示一起提供,这使python变得超级友好。我们将使用spyder studio进行示例。
在python 2.7或3.7之间进行选择是完全中立的,但是对于示例,我们将使用python 3.7,因为这是python的未来,它将取代python 2.7从2020年开始,而且大多数库也在python 3.7中开发,以保持考虑到python的未来方面。此外,它还给出了基本数学运算的预期结果,例如(2/5 = 2.5),而python 2.7会将其评估为2。还在python 3.7中将print视为一个函数(print(“ hello”)),因此它可以帮助程序员。
步骤2.使用OpenCV创建虚拟平台
我们将通过使用Anaconda提示符和此处上传的YML文件创建用于spyder的虚拟平台来安装OpenCV。
使用YML文件,我们将安装所有需要的软件包和库,但是,如果要安装任何其他软件包,则可以通过运行该软件包的命令通过anaconda提示符轻松安装。
转到Windows搜索图标,找到anaconda提示终端,您可以在刚安装的anaconda文件夹中找到它。
然后,您必须找到已下载的YML文件,然后从这里有两种选择:将终端的目录更改为YML文件的下载位置,或者将YML文件复制到大多数安装Anaconda的目录如果将YML文件复制到指定位置,则它将位于C:\驱动器中,请在提示符下运行以下命令
conda env创建–f virtual_platform_windows.yml
由于我的系统在Windows上运行,因此YML文件和命令与Windows相对应,但是您可以通过将Windows分别替换为linux或mac来根据系统进行修改。
注意:-如果软件包提取错误,请先安装 pytorch 和 numpy ,然后运行上述命令。
现在找到anaconda导航器,然后会出现一个下拉菜单“ __s上的应用程序”,然后从中选择虚拟环境,然后从那里启动Spyder studio。
就是这样,您已经准备好开始!
在OpenCV中打开和保存图像
在这里,我们将解释一些在OpenCV中使用Python的基本命令和术语。我们将学习OpenCV imread,imshow和imwrite的三个基本功能。
#符号在python中的注释
通过命令在python中导入opencv
导入cv2
使用'imread'加载图像,指定图像的路径
图片= cv2.imread('input.jpg')
现在,该图像已作为变量加载并存储在python中,我们将其命名为image
现在要显示图像变量,我们使用'imshow',并且imshow函数的第一个参数是图像窗口上显示的标题,必须在('')中输入以将名称表示为字符串
cv2.imshow('hello world',图片)
waitkey允许我们在打开图像窗口时输入信息,将其保留为空白即可等待继续操作之前按下任意键,通过放置数字(0除外),我们可以指定将窗口保持打开状态的延迟时间(时间)以毫秒为单位)。
cv2.waitKey()
'destroyAllWindows'关闭所有打开的窗口,放置失败将导致程序挂起。
cv2.destroyAllWindows()
,为此,我们将使用numpy, numpy 是用于python编程的库,用于为大型多维数组和矩阵添加支持。
进口CV2 #importing numpy的 进口numpy的作为NP 图像= cv2.imread(“input.jpg”) cv2.imshow(“程序hello_world”,图像) #shape功能是非常有用的,当我们看的一个维度的阵列,它返回一个元组,该元组给出图像的尺寸 print(image.shape) cv2.waitKey() cv2.destroyAllWindows()
控制台输出-(183,275,3),图像的两个维度分别是高183像素和宽275像素,而3表示还有其他三个分量(R,G,B)构成该图像(彩色图像存储在三维阵列中)。
print('图像高度:',(image.shape,'pixels')) print('图像宽度:',(image.shape,'pixels'))
控制台输出-图像高度:(183,“像素”)
图像宽度:(275,“像素”)
在OpenCV中保存编辑的图像
我们使用“ imwrite”来指定文件名和要保存的图像。
cv2.imwrite('output.jpg',图像) cv2.imwrite('output.png',图像)
第一个参数是我们要保存的文件的名称,{读取或保存我们使用('')表示为字符串的文件},第二个参数是文件名。
OpenCV允许您以不同格式保存图像。
OpenCV中的灰度图像
灰度缩放是将图像从全色转换为灰度(黑白)的过程
在opencv中,许多功能会在处理之前对图像进行灰度处理。这样做是因为它简化了图像,几乎减少了噪声,并增加了处理时间,因为图像中的信息较少(因为灰度图像存储在二维阵列中)。
import cv2 #加载输入图像 image = cv2.imread('input.jpg') cv2.imshow('original',image) cv2.waitKey() #我们使用cvtcolor转换为灰度 gray_image = cv2.cvtColor(image ,cv2.COLOR_BGR2GRAY) cv2.imshow('灰度',gray_image) cv2.waitKey() cv2.destroyALLWindows()
将图像转换为灰度的 更简单方法是在图像名称旁边添加 imread 函数中的参数0
导入cv2 grey_image = cv2.imread('input.jpg',0) cv2.imshow('灰度',grey_image) cv2.waitKey() cv2.destroyAllWindows()
import cv2 import numpy as np image = cv2.imread('input.jpg') print(image.shape) cv2.imshow('original',image) cv2.waitKey() gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY ) cv2.imshow('grayscale',gray_image) print(gray_image.shape) cv2.waitKey() cv2.destroyALLWindows()
控制台输出:-(183,275,3)–用于彩色图像
(183,275)–用于灰度图像
因此,它清楚地表明彩色图像由三维阵列表示,而灰度图像由二维阵列表示。
色彩空间
色彩空间是图像的存储方式。RGB,HSV,CMYK是不同的颜色空间,这些只是表示颜色的简单方法。
RGB –红色,绿色和蓝色。
HSV –色相,饱和度和价值。
而CMYK是喷墨打印机常用。
RGB或BGR色彩空间
OpenCV的默认颜色空间是RGB。RGB是一种加色模型,可通过组合不同强度/亮度的蓝色,绿色和红色来生成颜色。在OpenCV中,我们使用8位色深。
-红色(0-255)
-蓝色(0-255)
-绿色(0-255)
但是,OpenCV实际上以BGR格式存储颜色。
有趣的事实:-由于在内存中如何存储无符号的32位整数,因此我们在计算机中使用BGR顺序,但最终仍将其存储为RGB。代表颜色的整数,例如:-0X00BBGGRR将被存储为0XRRGGBB。
HSV色彩空间HSV(色相,饱和度和值/亮度)是一种色彩空间,试图代表人类感知的色彩。它以RGB色点的圆柱表示形式存储颜色信息。
色相-颜色值(0-179)
饱和度–颜色的鲜艳度(0-255)
值–亮度或强度(0-255)
HSV颜色空间格式在颜色分割中很有用。在RGB中,过滤特定颜色并不容易,但是HSV使我们可以更容易地设置颜色范围以过滤特定颜色。
色相表示HSV中的颜色,色相值的范围是0 – 180,而不是360,因此它没有完成整个圆圈,因此其映射方式与标准方式不同。
色彩范围滤镜
- 红色–(165-15)
- 绿色–(45-75)
- 蓝色–(90-120)
我们知道图像以RGB(红色,绿色和蓝色)色彩空间存储,因此OpenCV向我们显示了相同的图像,但是关于opencv的RGB格式要记住的第一件事是它实际上是BGR,我们可以通过查看图像形状。
import cv2 import numpy as np image = cv2.imread('input.jpg') #B,G,R前0,0像素的值 B,G,R = image print(B,G,R) print(image.shape) #现在是否将其应用于灰度图像 gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) print(gray_img.shape) #gray_image像素值,用于10,50像素 print(gray_img)
控制台输出: 打印(B,G,R) - 6 11 10
打印(图像形状) - (183,275,3 )
打印(gray_img.shape) - (183,275 )
打印(灰色_img) -69
现在,在灰度图像中只有二维,因为我们记得彩色图像存储在三个维中,第三个维是(R,G,B),而在灰度中,只有二维,因为(R,G ,B)不存在,对于特定的像素位置,我们只得到一个值,而在彩色图像中,我们得到三个值。
另一个有用的色彩空间是HSV
导入cv2 image = cv2.imread('input.jpg') hsv_image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV) cv2.imshow('HSV image',hsv_image) cv2.imshow('Hue channel',hsv_image) cv2。 imshow('saturation channel',hsv_image) cv2.imshow('value channel',hsv_image) cv2.waitKey() cv2.destroyAllWindows()
运行代码后,您可以看到四个图像,其中三个是单个通道,一个是组合的HSV图像。
色相通道图像非常暗,因为其值仅在0到180之间变化。
另外,请注意, imshow 函数会尝试向您显示RGB或BGR图像,但是HSV转换会将其重叠。
同样,由于其亮度,值通道将类似于图像的灰度。
探索RGB图像的各个组成部分
import cv2 image = cv2.imread('input.jpg') #opencv的split函数将imageinti拆分为每个颜色索引 B,G,R = cv2.split(image) cv2.imshow(“ Red”,R) cv2.imshow( “绿色”,G) cv2.imshow(“蓝”,B) 通过合并各颜色成分#making原始图像 合并= cv2.merge() cv2.imshow(“合并”,合并) #amplifying蓝色 合并= cv2.merge() cv2.imshow(“合并有蓝色放大”,合并) #表示各个颜色分量的形状。 #输出将仅为高和宽的二维,因为RGB分量的第三个元素分别表示为 print(B.shape) print(R。形状) 打印(G.shape) cv2.waitKey(0) cv2.destroyAllWindows()
控制台输出:#来自形状函数的图像尺寸
(183,275)
(183,275)
(183,275)
将图像转换为单独的RGB分量
在下面的代码中,我们创建了一个零矩阵,其尺寸为图像HxW,零返回一个数组,该数组填充有零但尺寸相同。
当我们查看图像的尺寸时, 形状 函数非常有用,这里我们已经完成了对该形状函数的切片。因此, shape 将抓取所有内容直到指定点,即最多第二个指定点,这将是图像的高度和宽度,因为第三个表示图像的RGB分量,我们在这里不需要它。
import cv2 import numpy as np image = cv2.imread('input.jpg') B,G,R = cv2.split(image) zeros = np.zeros(image.shape,dtype =“ uint8”) cv2.imshow( “ RED”,cv2.merge()) cv2.imshow(“绿色”,cv2.merge()) cv2.imshow(“蓝色”,cv2.merge()) cv2.waitKey(0) cv2.destroyAllWindows()
图像的直方图表示
图像的直方图表示是可视化图像组成部分的方法。
以下代码可让您通过图像的组合颜色和单个颜色成分的颜色直方图来分析图像。
import cv2 import numpy as np #我们需要导入matplotlib来创建直方图 。import matplotlib.pyplot as plt image = cv2.imread('input.jpg') histogram = cv2.calcHist(,, None,) #我们绘制一个直方图,ravel()展平我们的图像数组 plt.hist(image.ravel(),256,) plt.show()#查看 单独的颜色通道 color =('b','g','r') #我们知道分离颜色并在 i的 直方图中绘制每个颜色,在col中枚举(颜色):histogram2 = cv2.calcHist(,, None,,) plt.plot(histogram2,color = col) plt.xlim() plt.show()
让我们了解 calcHist 函数及其每个参数
cv2.calcHist(图像,通道,蒙版,histsize ,范围)
Images:它是uint 8或float 32类型的源图像。应该在方括号中给出,即“”,这也表示其第二级数组,因为opencv的图像是数组形式的数据。
频道:也在方括号中给出。它是我们计算直方图的通道的索引,例如,如果输入是灰度图像,则其值为,对于彩色图像,您可以传递,或分别计算蓝色,绿色和红色通道的直方图。
遮罩:遮罩图像。要查找完整图像的直方图,将其指定为“无”。但是,如果要查找图像特定区域的直方图,则必须为此创建一个遮罩图像并将其作为遮罩。
Histsize:这表示我们的BIN计数。为了通过我们需要在方括号中给出完整的比例。
范围:这是我们的范围,通常是
使用OpenCV绘制图像和形状
以下是一些在OpenCV中绘制线条,矩形,多边形,圆形等的示例。
import cv2 import numpy as np#创建 一个黑色方形 图像= np.zeros((512,512,3),np.uint8) #我们也可以创建黑白图像,但是不会有任何变化 image_bw = np.zeros ((512,512),np.uint8) cv2.imshow(“黑色矩形(彩色)”,图像) cv2.imshow(“黑色矩形(黑白)”,image_bw)
线
# 在黑色正方形上创建一条直线#cv2.line(图像,起始坐标,结束坐标,颜色,厚度)#绘制一条厚度为5像素的对角线 image = np.zeros((512,512,3),np.uint8) cv2.line(image,(0,0),(511,511),(255,127,0),5) cv2.imshow(“ blue line”,image)
长方形
# 在黑色正方形上创建矩形#cv2.rectangle(图像,开始坐标,结束坐标,颜色,厚度)#绘制一个厚度为5像素的矩形 image = np.zeros((512,512,3),np.uint8) cv2.rectangle(image,(30,50),(100,150),(255,127,0),5) cv2.imshow(“ rectangle”,image)
圈# 在黑色正方形上创建一个圆#cv2.circle(image,center,radius,color,fill)image = np.zeros((512,512,3),np.uint8) cv2.circle(image,(100,100),( 50),(255,127,0),-1) cv2.imshow(“ circle”,image)
多边形#创建多边形 图片= np.zeros((512,512,3),np.uint8) #let定义四个点 pts = np.array(,,,],np.int32) #let现在以点所需的形式重塑我们的点折线 pts = pts.reshape((-1,1,2)) cv2.polylines(image,,True,(0,255,255),3) cv2.imshow(“ polygon”,image)
文本使用opencv #putv 输入文字#cv2.putText(图像,'要显示的文字',底部左侧起点,字体,字体大小,颜色,粗细)image = np.zeros((512,512,3),np.uint8) cv2。 putText(image,“ hello world”,(75,290),cv2.FONT_HERSHEY_COMPLEX,2,(100,170,0),3) cv2.imshow(“ hello world”,image) cv2.waitKey(0) cv2.destroyAllWindows()
《计算机视觉》和《 OpenCV》是非常广泛的主题,但是本指南将是学习OpenCV和图像处理的良好起点。