航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降

运用Python+opencv进行图画处理(一) | 视觉入门

计算机视觉是人工智能最抢手的应用领域之一。人工智能技能推动了轿车自动驾驶、机器人以及各种相片处理类软件的巨大开展。方针检测技能也在稳步推动。生成对立网络(GANs)相同也是人们最近比较重视的一个问题。这些都在向咱们展现未来计算机视觉领芋圆域的开展前景是多么的不可限量。

让咱们一同登上人工智能开展的高速列车。从本文开端,咱们将有一系列关于图画处理和方针检测基础知识的教程。本篇是OpenCV入门教程榜首部分,完好的系列教程如下:

  1. 了解色彩模型与在图画上制作图形(图画处理根本操作)。
  2. 根本的图画处理与过滤。
  3. 从特征检测到人脸检测(TBU)

本系列的榜首部分将从Opencv的装置,结合代码实战解说色彩模型与图形制作讲起。本教程的完好代码现已放在Github上,便利咱们运用。

1、 OpenCV简介

图画处理是指对图画履行一些操作以到达预期作用的进程。能够类比数据剖析作业,在数据剖析时咱们需求做一些数据预处和特征工程。图画处理也是相同的。咱们经过图画处理来处理图片然后能够从中提取处一些愈加有用的特征。咱们能够经过图画处理削减图画中级经济师噪声调整图画亮度、色彩或许对比度等等。

OpenCV是Open Source Computer Vision的缩写,由英特尔公司于航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降1999年推出。它开始是用C/ C++编写的,所以你可能会看到更多用C言语而不是Python编写的教程。但现在它在Python中也被广泛用于计算机视觉。首要,让咱们为运用Open航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降CV装备环境。装置进程如下:

pip install opencv-python==3.4.2
pip install opencv-contrib-python==3.3.1

装置完成后,能够经过下方两条指令测验其是否正常作业。假设没有任何报错,那么就能够开端运用了!

import cv2
cv2.__version__

咱们运用用OpenCV做的榜首步便是导入一个图画,如下方所示。

import numpy as np
import matpl上户彩otlib.pyplot as plt
%matplotlib inline
# Import the image
img = cv2.imread('burano.jpg')
plt.imshow(img)
运用Python+opencv进行图画处理(一) | 视觉入门

上图是在意大利最美丽的岛屿之一布拉诺所拍照的。假设你去过这个当地,你可能会注意到这幅图里有些不同。这的确和咱们一般看到的布拉诺的相片有点不同。这是因为OpenCV中色彩形式的默认设置次序是BGR,不同与Matplotlib。因而,要在RGB形式下查看图画,咱们需求将航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降它从BGR转化为RGB,如下所示。

# Convert the image into RGB
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)

这张图便是真实的布拉诺了,多么美丽!

2、 不只是RGB

咱们再来谈谈色彩模型。色彩模型是一个运用原色构建全系列色彩的体系。这儿先介绍这两种不同的色彩模型:"加色模型"和"减色模型"。加色模型运用光代表计算机屏幕上的色彩,而减色模型运用墨水在纸上打印这些数字图画。前者的原色由赤色、绿色和蓝色(RGB)组成,后者有蓝色、品红、黄色和黑色(CMYK)四种原色组成。咱们在图画上看到的一切其他颜倒带色都是由这些原色组合或混合而成的。所以当分别用RGB、CMYK表明一张图画时,图画能够有着稍微不同地表达。如下图所示。

日常日子中见到最多的便是这两种色彩模型。可是,在五颜六色模型的世界里不仅仅只要这两种色彩模型。众女人隐私多的色彩模型中,灰度(grayscale)、HSV和HLS也是你会在计算机视觉使命中经常看到的。

灰度(grayscale)很简单。它经过是非的强度来表明图画和形状,这也意味着它只要一个通道。要查看灰度图画,咱们需求将色彩模型转化为灰色,就像前面临BGR图画lift所做的操作那样。

# Convert the image into gray scale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray, cmap = 'gray')

实践上,RGB图画是由三个通道叠加而成的:R, G, b。所以假设咱们把每个通道一个一个的描绘出来,咱们就能够了解色彩通道是怎么构成的了!

# Plot the three chann航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降els of the image
fig, axs = plt.subplots(nrows = 1, ncols = 3,航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降 figsize = (20, 20))
for i in range(0, 3):
ax = axs[i]
ax.imshow(img_rgb[:, :, i], cmap = 'gray')
plt.show()

调查上面的图片。这三幅图画展现了每个通道是怎么组成的。在R通道图中,赤色饱和度高的部分看起来是白色的。这是因为赤色部分中的值挨近255。在灰度形式下,值越高色彩就越白。你还能够运用G或B通道来查看这一点,并比较某些部分之间的差异。

HSV和HLS有一些不同。正如在上图看到的那样,他们有一个三维的表达,更类似于人类的感知办法。HSV代表色彩、饱和度和色值。HSL代表色彩、饱和度和亮度。HSV的中轴是色值,HSL的中轴是光量。沿着中心轴的视点,有色彩和实践的色彩。与中心轴的间隔归于饱和度。转化色彩模型的办法如下。

# Transform the i新鲜的大鼠尾鱼mage into HSV and HLS models
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
img_hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)
# Plot the converted images
fig, (ax1, ax2) = plt.subplots(nrows = 1, ncols = 2, figsize = (20, 20))
ax1.imshow(img_hsv)
ax2.imshow(img_hls)
plt.show()

可是为什么要改换色彩?这些有什么用途?一个很典型的比如--车道检测。调查下图,不同色彩形式下的车道线。在计算机视觉使命中,咱们运用掩膜(masking)进行多色形式转化。

图画处理是便是对图画数据进行预处理。它能够削减噪音,提取有用的色彩模型,然后简化分类和检测使命。因而,一切上述技能,包含咱们稍后将评论的技能,都是为了协助模型更容易地完成检测。

3、 在图画上制作图形

让咱们在图画上增加一些图形。咱们这次代码示例中运用的图片来自巴黎"爱的墙"。上面用各种世界言语写满了"我喜欢你"。咱们要做的是找到言语中的单词并用矩形符号它们。假设咱们要定位韩语版别"我喜欢你"。首要, 仿制原始图画并用cv2.rectangle()函数制作一个矩形,一起给出左上角和右下角的坐标值。如下:

# Copy the image
img_copy = img.c6sopy()
# Draw a rectangle
cv2.rectangle(img_copy, pt1 = (800, 470), pt2 = (980, 530),
color = (255, 0, 0), thickness = 5)
plt.imshow(img_copy)

运用cv2.circle()函数,画一个圆,圈出更多的韩语单词。咱们需綦建虹太太朱爽要指定它的圆心的点和半径的长度。

# Draw a circle
cv2.circle(img_copy, center = (950, 50), radius = 50,
color = (0, 0, 255), thickness = 5)
plt.imshow(img_copy)

咱们还能够将文本数据放在图画上。运用cv鸡西天气预报2.putText()函数,咱们能够指定文本的方位、字体款式和巨细。

# Add text
cv2.putText(img_copy, text = "the Wall of Love",
org = (250, 250),
fontFace = cv2.FONT_HERSHEY_DUPLEX,
fontScale = 2,
color = (0, 255, 0),
thickness = 2,
lineType = cv2.LINE_AA)
plt.imshow(img_copy)

4、 不止是图画

在上边的介绍中,咱们选取意大利和法国诸城的两张风景图作为示例。假设,咱们想要画张地图把这些当地标出来。那么,首要咱们要创立一个窗口并制作图形。不相同的是这儿不是经过指定点制作图形而是经过点击呼应。先试试制作圆圈。首要创开缸养水全程图文记载建一个函数,它将用方位和鼠标点击的航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降数据制作一个圆圈。

# Step 1. Define包青天之侠骨神算全集 callback function
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
cv2.circle(img, center = (x, y), radius = 5,
color = (87, 184, 237), thickness = -1)
elif event == cv2.EVENT_RBUTTONDOWN:
cv2.circle(img, center = (x, y), radius = 10,
color = (87, 184, 237), thickness = 1)

按下鼠标点击按钮时,运用cv2.EVENT_LBUTTONDOWN或cv2.EVENT_RBUTTONDOWN记载方位数据。把鼠标的方位设置为圆心(x, y),并制作圆圈。

# S千tep 2. Call the window
img = cv2.imread(航海王,运用Python+opencv进行图画处理(一) | 视觉入门,降'map.png')
cv2.namedWindow(winname = 'my_dr迎驾贡酒价格表awing')
cv2.setMouseCallback('my_drawing', draw_circle)

设置一个地图作为窗口的布景,并将窗口命名为my_drawing。运用cv2.setMouseCallback()函数,在窗口和咱们在过程1中创立的函数draw_circle之间建立了一个衔接。

# Step 3. Execution
while True:
cv2.imshow('my_drawing',img)
if cv2.waitKey(10) & 0xFF == 27:
break
cv2.destroyAllWindows()

现在咱们运用while循环履行窗口。if子句的履行条件是,当咱们按下键盘上的ESC时,将窗口设置为封闭。

接下来测验制作一个矩形。因为在cv2.rectangle()函数中,矩形需求两个点来表明pt1和pt2,所以咱们需求一个额定的过程来设置榜首个点击点为pt1,最终一个点击点为pt2。咱们要用cv2.E河津天气预报VENT_MOUSEMOVE和cv2.EVENT_LBUTTONUP来检测鼠标的移动。

咱们首要将drawing = False界说为默认值。当按下左键时,绘图变为true,咱们将榜首个方位设为pt1。假设正在绘图,它将以当时点为pt2,并在移动鼠标时持续制作矩形。就像数字堆叠相同。当左键翻开时,绘图变为false,它将鼠标的最终一个方位作为pt2的最终一个点。

# Initialization
drawing = False
ix = -1
iy = -1
# create a drawing function
def draw_rectangle(event, x宋亚轩, y, flags, params):
global ix, iy, drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
cv2.rectangle(img, pt1=(ix, iy), pt2=(x, y),
color = (87, 184, 237), thickness = -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img, pt1=(ix, iy), pt2=(x, y),
color = (87, 184, 237), thickness = -1)

在过程1中将draw_circle函数替换为draw_rectangle。请不要忘记在回调函数cv2.setMouseCallback()中进行更改。因而,整个代码脚本将如下所示。

import cv2
import numpy as np

# Step 1. Define callback function
drawing = Fal鞋子se
ix = -1
iy = -1

def draw_rectangle(event, x, y, flags, params):

global ix, iy, drawing

if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y

elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
cv2.rectangle(img, pt1 = (ix, iy), pt2 = (x, y),
color = (87,a2 184, 237), thickness = -1)

elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img, pt1 = (ix, iy), pt2 = (x, y),
color = (87, 184, 237), thickness = -1)


# Step 2. Call the window
img = cv2.imread('map.png')

cv2.namedWindow(winname = 'my_drawing')
cv2.setMouseCallback('my_drawing', draw_rectangle)


# Step 3. Execution
while True:
cv2.imshow('my_drawing', img)
if cv2.waitKey(10) & 0xFF == 27:
break

cv2.destroyAllWindows()

5、 总结与展望

本篇文章介绍了Opencv的装置、图画色彩模型的转化与图形制作。下次,将介绍图画概括提出与方针检测等技能。敬请期待!