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

2022-03-04 09:11
48
0
添加收藏

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

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

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

项目地址:yoyoyo-yo/Gasyori100knock​github.com

极简安装:

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

1. 安装 MiniConda

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,那么这个项目将会是一个不错的从入门到进阶的教程。上手代码,亲自跑一跑结果,希望对大家有所帮助!
————————————————
版权声明:本文为CSDN博主「weixin_39902345」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39902345/article/details/111417360

全部评论