如今深度学习的快速发展给计算机视觉注入了前所未有的新活力!其中在计算机图形学和计算机视觉里面最流行的一个库就是 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,那么这个项目将会是一个不错的从入门到进阶的教程。上手代码,亲自跑一跑结果,希望对大家有所帮助!