查看原文
其他

OpenCV 机器视觉入门精选 100 题(附 Python 代码)

红色石头 AI有道 2021-09-10

点击上方“AI有道”,选择“星标”公众号

重磅干货,第一时间送达


如今深度学习的快速发展给计算机视觉注入了前所未有的新活力!其中在计算机图形学和计算机视觉里面最流行的一个库就是 OpenCV。OpenCV 在自动驾驶和仿生机器人当中的应用非常广泛。


而在 2018 年 11 月份,OpenCV 通过 GITHUB 正式发布了 OpenCV 又一个重要里程碑版本 OpenCV 4.0。


今天给大家推荐一个干货满满的 GitHub 项目。该项目包含了 CV 领域,OpenCV 图像处理入门 100 题实例解析,并配备完整的 Pyhon 代码。


项目地址:


https://github.com/yoyoyo-yo/Gasyori100knock



极简安装:


作者推荐了 OpenCV 的极简安装方法:


1. 安装 MiniConda


地址:https://conda.io/miniconda.html


2. 创建虚拟环境并激活


$ conda create python = 3.6  -  n gasyori 100
$ source actiavte gasyori 100


3. 安装包


$ pip install -r requirement.txt


其中,requirement.txt 文件在项目根目录下,下载至命令行所在目录直接运行上述命令即可。


100 题实例:


作者写的 OpenCV 100 题按照从简单到复杂逐一解析,非常适合我们的学习路径。


例如 Q1-10:



我们首先来看一个简单的例子。


Q1. 读取图像并按 BGR 顺序更改 RGB


import cv2

# Read image
img = cv2.imread("imori.jpg")
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()

# RGB > BGR
img[:, :, 0] = r
img[:, :, 1] = g
img[:, :, 2] = b

# Save result
cv2.imwrite("out.jpg", img)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


例如 Q41-50:



我们来看一个稍微复杂的例子。


Q41. Canny边缘检测(步骤1)边缘强度


import cv2
import numpy as np
import matplotlib.pyplot as plt

# Read image
img = cv2.imread("imori.jpg").astype(np.float32)
H, W, C = img.shape

# Gray
gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]

# Gaussian Filter
K_size = 5
sigma = 1.4

## Zero padding
pad = K_size // 2
gau = np.zeros((H + pad*2, W + pad*2), dtype=np.float32)
#gau[pad:pad+H, pad:pad+W] = gray.copy().astype(np.float32)
gau = np.pad(gray, (pad, pad), 'edge')
tmp = gau.copy()

## Kernel
K = np.zeros((K_size, K_size), dtype=np.float32)
for x in range(-pad, -pad+K_size):
   for y in range(-pad, -pad+K_size):
       K[y+pad, x+pad]
= np.exp( -(x**2 + y**2) / (2* (sigma**2)))
K /= (sigma * np.sqrt(2 * np.pi))
K /= K.sum()

for y in range(H):
   for x in range(W):
       gau[pad+y, pad+x]
= np.sum(K * tmp[y:y+K_size, x:x+K_size])

## Sobel vertical
KSV = np.array(((-1., -2., -1.), (0., 0., 0.), (1., 2., 1.)), dtype=np.float32)
## Sobel horizontal
KSH = np.array(((-1., 0., 1.), (-2., 0., 2.), (-1., 0., 1.)), dtype=np.float32)

gau = gau[pad-1:H+pad+1, pad-1:W+pad+1]
fy = np.zeros_like(gau, dtype=np.float32)
fx = np.zeros_like(gau, dtype=np.float32)
K_size = 3
pad = K_size // 2

for y in range(H):
   for x in range(W):
       fy[pad+y, pad+x]
= np.sum(KSV * gau[y:y+K_size, x:x+K_size])
       fx[pad+y, pad+x] = np.sum(KSH * gau[y:y+K_size, x:x+K_size])
       
fx = fx[pad:pad+H, pad:pad+W]
fy = fy[pad:pad+H, pad:pad+W]

# Non-maximum suppression
edge = np.sqrt(np.power(fx, 2) + np.power(fy, 2))
fx[fx == 0] = 1e-5
tan = np.arctan(fy / fx)
## Angle quantization
angle = np.zeros_like(tan, dtype=np.uint8)
angle[np.where((tan > -0.4142) & (tan <= 0.4142))] = 0
angle[np.where((tan > 0.4142) & (tan < 2.4142))] = 45
angle[np.where((tan >= 2.4142) | (tan <= -2.4142))] = 95
angle[np.where((tan > -2.4142) & (tan <= -0.4142))] = 135

out = angle.astype(np.uint8)

# Save result
cv2.imwrite("out.jpg", out)
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()



项目特色:


该项目最大的特色就是 100 题循序渐进,基本涵盖了 OpenCV 的关键知识点,目前已经更新了前 60 题,后续的会陆续发布。


唯一的缺点是项目语言是日语,稍有不便。但是问题不大,笔者推荐一个方法,可以使用谷歌浏览器自动翻译网页即可。而且,所有的代码都是英文的,不妨碍理解。


如果你正在入门 CV,正在学习 OpenCV,那么这个项目将会是一个不错的从入门到进阶的教程。上手代码,亲自跑一跑结果,希望对大家有所帮助!



【推荐阅读】

干货 | 公众号历史文章精选(附资源)

我的深度学习入门路线

我的机器学习入门路线图


👆欢迎加入AI视界


视频 小程序 ,轻点两下取消赞 在看 ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存