├── 00_配置版本.ipynb ├── 01_Picture ├── 00_Lena_Img.png ├── 01_cat.jpg ├── 02_cat_gray.jpg ├── 03_dog.jpg ├── 04_LenaNoise.png ├── 05_Dige.png ├── 06_pie.png ├── 07_Lena.jpg ├── 08_Car.png ├── 09_AM.png ├── 10_contours.png ├── 11_contours2.png ├── 12_Face.jpg ├── 13_Lena.jpg ├── 14_Mario.jpg ├── 15_Mario_coin.jpg ├── 16_Clahe.jpg ├── 17_Chessboard.jpg ├── 18_House.jpg ├── 19_Box.png ├── 20_Box_in_scene.png ├── 21_Left_01.png └── 22_Right_01.png ├── 01_计算机眼中的图像.ipynb ├── 02_Video ├── 00_Scenery.mp4 └── 01_Foreground.avi ├── 02_图像读取与显示.ipynb ├── 03_灰度图处理与图片保存.ipynb ├── 04_HSV颜色空间.ipynb ├── 05_视频处理.ipynb ├── 06_ROI区域.ipynb ├── 07_边界填充.ipynb ├── 08_图像融合.ipynb ├── 09_图像缩放.ipynb ├── 10_图像阈值.ipynb ├── 11_图像平滑处理.ipynb ├── 12_腐蚀与膨胀.ipynb ├── 13_开运算与闭运算.ipynb ├── 14_礼帽与黑帽.ipynb ├── 15_Sobel算子、Scharr算子与Laplacian算子.ipynb ├── 16_Canny边缘检测.ipynb ├── 17_图像金字塔.ipynb ├── 18_图像轮廓.ipynb ├── 19_模板匹配.ipynb ├── 20_图像直方图.ipynb ├── 21_傅里叶变换.ipynb ├── 22_harris角点检测.ipynb ├── 23_sift关键点提取.ipynb ├── 24_特征匹配与全景拼接.ipynb ├── 25_背景建模.ipynb ├── 26_光流估计.ipynb └── README.md /01_Picture/00_Lena_Img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/00_Lena_Img.png -------------------------------------------------------------------------------- /01_Picture/01_cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/01_cat.jpg -------------------------------------------------------------------------------- /01_Picture/02_cat_gray.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/02_cat_gray.jpg -------------------------------------------------------------------------------- /01_Picture/03_dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/03_dog.jpg -------------------------------------------------------------------------------- /01_Picture/04_LenaNoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/04_LenaNoise.png -------------------------------------------------------------------------------- /01_Picture/05_Dige.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/05_Dige.png -------------------------------------------------------------------------------- /01_Picture/06_pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/06_pie.png -------------------------------------------------------------------------------- /01_Picture/07_Lena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/07_Lena.jpg -------------------------------------------------------------------------------- /01_Picture/08_Car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/08_Car.png -------------------------------------------------------------------------------- /01_Picture/09_AM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/09_AM.png -------------------------------------------------------------------------------- /01_Picture/10_contours.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/10_contours.png -------------------------------------------------------------------------------- /01_Picture/11_contours2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/11_contours2.png -------------------------------------------------------------------------------- /01_Picture/12_Face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/12_Face.jpg -------------------------------------------------------------------------------- /01_Picture/13_Lena.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/13_Lena.jpg -------------------------------------------------------------------------------- /01_Picture/14_Mario.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/14_Mario.jpg -------------------------------------------------------------------------------- /01_Picture/15_Mario_coin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/15_Mario_coin.jpg -------------------------------------------------------------------------------- /01_Picture/16_Clahe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/16_Clahe.jpg -------------------------------------------------------------------------------- /01_Picture/17_Chessboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/17_Chessboard.jpg -------------------------------------------------------------------------------- /01_Picture/18_House.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/18_House.jpg -------------------------------------------------------------------------------- /01_Picture/19_Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/19_Box.png -------------------------------------------------------------------------------- /01_Picture/20_Box_in_scene.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/20_Box_in_scene.png -------------------------------------------------------------------------------- /01_Picture/21_Left_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/21_Left_01.png -------------------------------------------------------------------------------- /01_Picture/22_Right_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/01_Picture/22_Right_01.png -------------------------------------------------------------------------------- /02_Video/00_Scenery.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/02_Video/00_Scenery.mp4 -------------------------------------------------------------------------------- /02_Video/01_Foreground.avi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AccumulateMore/OpenCV/d6087b1402f7c66fdff78ca53f7cd55070de3a73/02_Video/01_Foreground.avi -------------------------------------------------------------------------------- /02_图像读取与显示.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 图像的读取与显示" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 图像读取" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① 图像读取入口参数:\n", 22 | " - cv2.IMREAD_COLOR:彩色图像\n", 23 | " - cv2.IMREAD_GRAYSCALE:灰度图像" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 1, 29 | "metadata": {}, 30 | "outputs": [], 31 | "source": [ 32 | "import cv2 #opencv的缩写为cv2\n", 33 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 34 | "import numpy as np # numpy数值计算工具包\n", 35 | "\n", 36 | "# 魔法指令,直接展示图,Jupyter notebook 特有\n", 37 | "%matplotlib inline " 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 2, 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "name": "stdout", 47 | "output_type": "stream", 48 | "text": [ 49 | "\n" 50 | ] 51 | }, 52 | { 53 | "data": { 54 | "text/plain": [ 55 | "array([[[142, 151, 160],\n", 56 | " [146, 155, 164],\n", 57 | " [151, 160, 169],\n", 58 | " ...,\n", 59 | " [156, 172, 185],\n", 60 | " [155, 171, 184],\n", 61 | " [154, 170, 183]],\n", 62 | "\n", 63 | " [[107, 118, 126],\n", 64 | " [112, 123, 131],\n", 65 | " [117, 128, 136],\n", 66 | " ...,\n", 67 | " [155, 171, 184],\n", 68 | " [154, 170, 183],\n", 69 | " [153, 169, 182]],\n", 70 | "\n", 71 | " [[108, 119, 127],\n", 72 | " [112, 123, 131],\n", 73 | " [118, 129, 137],\n", 74 | " ...,\n", 75 | " [154, 170, 183],\n", 76 | " [153, 169, 182],\n", 77 | " [152, 168, 181]],\n", 78 | "\n", 79 | " ...,\n", 80 | "\n", 81 | " [[162, 186, 198],\n", 82 | " [157, 181, 193],\n", 83 | " [142, 166, 178],\n", 84 | " ...,\n", 85 | " [181, 204, 206],\n", 86 | " [170, 193, 195],\n", 87 | " [149, 172, 174]],\n", 88 | "\n", 89 | " [[140, 164, 176],\n", 90 | " [147, 171, 183],\n", 91 | " [139, 163, 175],\n", 92 | " ...,\n", 93 | " [167, 187, 188],\n", 94 | " [123, 143, 144],\n", 95 | " [104, 124, 125]],\n", 96 | "\n", 97 | " [[154, 178, 190],\n", 98 | " [154, 178, 190],\n", 99 | " [121, 145, 157],\n", 100 | " ...,\n", 101 | " [185, 198, 200],\n", 102 | " [130, 143, 145],\n", 103 | " [129, 142, 144]]], dtype=uint8)" 104 | ] 105 | }, 106 | "execution_count": 2, 107 | "metadata": {}, 108 | "output_type": "execute_result" 109 | } 110 | ], 111 | "source": [ 112 | "img = cv2.imread('01_Picture/01_cat.jpg') \n", 113 | "print(type(img)) # img 的类型为 numpy.ndarray 类型\n", 114 | "img # uint8 的取值范围在 0-255 之间" 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "# 2. 图像显示" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "## 2.1 图像显示(普通方法)" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 3, 134 | "metadata": {}, 135 | "outputs": [], 136 | "source": [ 137 | "# opencv 默认读取格式是 BGR 格式,matplotlib 或其他库的读取格式可能是 RGB 的\n", 138 | "# opencv 读取并用 opencv 自带的展示函数不需要进行通道转换,但 opencv 读取后用其他库展示图片需要通道转换 \n", 139 | "\n", 140 | "# 图像显示时,可以创建多个窗口\n", 141 | "\n", 142 | "# 第一个入口参数为展示图像窗口的名字\n", 143 | "# 第二个入口参数为展示图像窗口中所展示的图像\n", 144 | "img = cv2.imread('01_Picture/01_cat.jpg') \n", 145 | "cv2.imshow('image_cat',img) \n", 146 | "\n", 147 | "# 等待时间,毫秒级,0表示任意键终止,5000ms表示5s\n", 148 | "cv2.waitKey(5000) \n", 149 | "\n", 150 | "# 销毁图像窗口\n", 151 | "cv2.destroyAllWindows()" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## 2.2 图像显示(函数方法)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 4, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "# 绘图显示(封装函数)\n", 168 | "def cv_show(name,img):\n", 169 | " cv2.imshow(name,img)\n", 170 | " cv2.waitKey(0)\n", 171 | " cv2.destroyAllWindows()\n", 172 | " \n", 173 | "cv_show('image_cat',img)" 174 | ] 175 | } 176 | ], 177 | "metadata": { 178 | "kernelspec": { 179 | "display_name": "Python 3.6.3", 180 | "language": "python", 181 | "name": "python3.6.3" 182 | }, 183 | "language_info": { 184 | "codemirror_mode": { 185 | "name": "ipython", 186 | "version": 3 187 | }, 188 | "file_extension": ".py", 189 | "mimetype": "text/x-python", 190 | "name": "python", 191 | "nbconvert_exporter": "python", 192 | "pygments_lexer": "ipython3", 193 | "version": "3.6.3" 194 | }, 195 | "toc": { 196 | "base_numbering": 1, 197 | "nav_menu": {}, 198 | "number_sections": false, 199 | "sideBar": true, 200 | "skip_h1_title": false, 201 | "title_cell": "Table of Contents", 202 | "title_sidebar": "Contents", 203 | "toc_cell": false, 204 | "toc_position": {}, 205 | "toc_section_display": true, 206 | "toc_window_display": true 207 | } 208 | }, 209 | "nbformat": 4, 210 | "nbformat_minor": 4 211 | } 212 | -------------------------------------------------------------------------------- /03_灰度图处理与图片保存.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 灰度图处理与图片保存" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 读取BGR图(默认读取)" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import cv2 #opencv的缩写为cv2\n", 24 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 25 | "import numpy as np # numpy数值计算工具包\n", 26 | "\n", 27 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 28 | "%matplotlib inline " 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [ 36 | { 37 | "data": { 38 | "text/plain": [ 39 | "(414, 500, 3)" 40 | ] 41 | }, 42 | "execution_count": 2, 43 | "metadata": {}, 44 | "output_type": "execute_result" 45 | } 46 | ], 47 | "source": [ 48 | "img = cv2.imread('01_Picture/01_cat.jpg') \n", 49 | "img.shape # (h,w,c) c表示 3 通道,这个 3 通道被 opencv 读进来是 BGR 的先后顺序的 3 通道 " 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "# 2. 读取灰度图(设置读取)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 3, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "text/plain": [ 67 | "array([[153, 157, 162, ..., 174, 173, 172],\n", 68 | " [119, 124, 129, ..., 173, 172, 171],\n", 69 | " [120, 124, 130, ..., 172, 171, 170],\n", 70 | " ...,\n", 71 | " [187, 182, 167, ..., 202, 191, 170],\n", 72 | " [165, 172, 164, ..., 185, 141, 122],\n", 73 | " [179, 179, 146, ..., 197, 142, 141]], dtype=uint8)" 74 | ] 75 | }, 76 | "execution_count": 3, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "img_gray = cv2.imread('01_Picture/01_cat.jpg',cv2.IMREAD_GRAYSCALE) \n", 83 | "#img_gray = cv2.imread('01_Picture/01_cat.jpg',cv2.IMREAD_COLOR) # BGR图 \n", 84 | "img_gray # 只有一个通道,同样是 uint8 类型" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 4, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "type(img_gray): \n", 97 | "img_gray.size: 207000\n", 98 | "img_gray.dtype: uint8\n", 99 | "img_gray.shape: (414, 500)\n" 100 | ] 101 | } 102 | ], 103 | "source": [ 104 | "print('type(img_gray):',type(img_gray))\n", 105 | "print('img_gray.size: ',img_gray.size) # 414 × 500 = 20700\n", 106 | "print('img_gray.dtype:',img_gray.dtype)\n", 107 | "print('img_gray.shape:',img_gray.shape) # 只有一个通道" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "# 3. 显示图片" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 5, 120 | "metadata": {}, 121 | "outputs": [], 122 | "source": [ 123 | "def cv_show(name,img):\n", 124 | " cv2.imshow(name,img)\n", 125 | " cv2.waitKey(0)\n", 126 | " cv2.destroyAllWindows()\n", 127 | " \n", 128 | "cv_show('image_cat_gray',img_gray)" 129 | ] 130 | }, 131 | { 132 | "cell_type": "markdown", 133 | "metadata": {}, 134 | "source": [ 135 | "# 4. 保存图片" 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "execution_count": 6, 141 | "metadata": {}, 142 | "outputs": [ 143 | { 144 | "data": { 145 | "text/plain": [ 146 | "True" 147 | ] 148 | }, 149 | "execution_count": 6, 150 | "metadata": {}, 151 | "output_type": "execute_result" 152 | } 153 | ], 154 | "source": [ 155 | "cv2.imwrite('01_Picture/02_cat_gray.jpg',img_gray) # 保存图片" 156 | ] 157 | } 158 | ], 159 | "metadata": { 160 | "kernelspec": { 161 | "display_name": "Python 3.6.3", 162 | "language": "python", 163 | "name": "python3.6.3" 164 | }, 165 | "language_info": { 166 | "codemirror_mode": { 167 | "name": "ipython", 168 | "version": 3 169 | }, 170 | "file_extension": ".py", 171 | "mimetype": "text/x-python", 172 | "name": "python", 173 | "nbconvert_exporter": "python", 174 | "pygments_lexer": "ipython3", 175 | "version": "3.6.3" 176 | }, 177 | "toc": { 178 | "base_numbering": 1, 179 | "nav_menu": {}, 180 | "number_sections": false, 181 | "sideBar": true, 182 | "skip_h1_title": false, 183 | "title_cell": "Table of Contents", 184 | "title_sidebar": "Contents", 185 | "toc_cell": false, 186 | "toc_position": {}, 187 | "toc_section_display": true, 188 | "toc_window_display": true 189 | } 190 | }, 191 | "nbformat": 4, 192 | "nbformat_minor": 4 193 | } 194 | -------------------------------------------------------------------------------- /04_HSV颜色空间.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# HSV颜色空间" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. HSV颜色空间" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① HSV 颜色空间为:\n", 22 | "\n", 23 | "- H - 色调(主波长)。 \n", 24 | "- S - 饱和度(纯度/颜色的阴影)。 \n", 25 | "- V - 强度。" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 1, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "import cv2 #opencv的缩写为cv2\n", 35 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 36 | "import numpy as np # numpy数值计算工具包\n", 37 | "\n", 38 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 39 | "%matplotlib inline " 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 2, 45 | "metadata": {}, 46 | "outputs": [], 47 | "source": [ 48 | "hsv = cv2.imread('01_Picture/01_cat.jpg', cv2.COLOR_BGR2HSV) \n", 49 | "cv2.imshow('hsv',hsv)\n", 50 | "cv2.waitKey(0)\n", 51 | "cv2.destroyAllWindows()" 52 | ] 53 | } 54 | ], 55 | "metadata": { 56 | "kernelspec": { 57 | "display_name": "Python 3.6.3", 58 | "language": "python", 59 | "name": "python3.6.3" 60 | }, 61 | "language_info": { 62 | "codemirror_mode": { 63 | "name": "ipython", 64 | "version": 3 65 | }, 66 | "file_extension": ".py", 67 | "mimetype": "text/x-python", 68 | "name": "python", 69 | "nbconvert_exporter": "python", 70 | "pygments_lexer": "ipython3", 71 | "version": "3.6.3" 72 | }, 73 | "toc": { 74 | "base_numbering": 1, 75 | "nav_menu": {}, 76 | "number_sections": false, 77 | "sideBar": true, 78 | "skip_h1_title": false, 79 | "title_cell": "Table of Contents", 80 | "title_sidebar": "Contents", 81 | "toc_cell": false, 82 | "toc_position": {}, 83 | "toc_section_display": true, 84 | "toc_window_display": true 85 | } 86 | }, 87 | "nbformat": 4, 88 | "nbformat_minor": 4 89 | } 90 | -------------------------------------------------------------------------------- /05_视频处理.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 视频处理" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 视频转图片" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① cv2.VideoCapture 函数可以捕获摄像头,或读取视频文件。\n", 22 | "\n", 23 | "② cv2.VideoCapture 函数入口参数:\n", 24 | "\n", 25 | " - 用数字来控制不同的设备(摄像头),例如 0、1。\n", 26 | " - 如果是视频文件,直接指定好路径即可。" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 1, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "import cv2 #opencv的缩写为cv2\n", 36 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 37 | "import numpy as np # numpy数值计算工具包\n", 38 | "\n", 39 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 40 | "%matplotlib inline " 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 2, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "name": "stdout", 50 | "output_type": "stream", 51 | "text": [ 52 | "True\n" 53 | ] 54 | } 55 | ], 56 | "source": [ 57 | "# 随着时间轴的变换,视频在动,虽然图像是静止的,但是图像在一帧一帧走,呈现视频的感觉\n", 58 | "\n", 59 | "# 绘图显示(封装函数)\n", 60 | "def cv_show(name,img):\n", 61 | " cv2.imshow(name,img)\n", 62 | " cv2.waitKey(0)\n", 63 | " cv2.destroyAllWindows()\n", 64 | " \n", 65 | "vc = cv2.VideoCapture('02_Video/00_Scenery.mp4')\n", 66 | "if vc.isOpened(): # 检查是否打开正确\n", 67 | " open, frame = vc.read() # 这里的 vc.read() 相当于读取图像的第一帧\n", 68 | " # 若循环不断的执行 vc.read,则不断的读取第二帧、第三帧....\n", 69 | " print(open) # 正常打开时,open会返回 True\n", 70 | " cv_show('image_scenery',frame)\n", 71 | "else:\n", 72 | " open = False" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "# 2. 图片转视频" 80 | ] 81 | }, 82 | { 83 | "cell_type": "code", 84 | "execution_count": 3, 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [ 88 | "while open: # 如果正常打开,则不停循环读取,这里可替换成 i 值,来确定读取 i 帧 \n", 89 | " ret, frame = vc.read()\n", 90 | " if frame is None: # 视频读完以后的下一帧为空\n", 91 | " break\n", 92 | " if ret == True:\n", 93 | " gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 读取的图片转换成黑白的 \n", 94 | " cv2.imshow('result',gray)\n", 95 | " if cv2.waitKey(10) & 0xFF == 27: # cv2.waitKey(10)为等多少时间执行下一帧,0xFF为退出键ESC\n", 96 | " break\n", 97 | "vc.release() # release()完成与 open() 相反的工作.释放 open() 向内核申请的所有资源\n", 98 | "cv2.destroyAllWindows() # 销毁所有窗口" 99 | ] 100 | } 101 | ], 102 | "metadata": { 103 | "kernelspec": { 104 | "display_name": "Python 3.6.3", 105 | "language": "python", 106 | "name": "python3.6.3" 107 | }, 108 | "language_info": { 109 | "codemirror_mode": { 110 | "name": "ipython", 111 | "version": 3 112 | }, 113 | "file_extension": ".py", 114 | "mimetype": "text/x-python", 115 | "name": "python", 116 | "nbconvert_exporter": "python", 117 | "pygments_lexer": "ipython3", 118 | "version": "3.6.3" 119 | }, 120 | "toc": { 121 | "base_numbering": 1, 122 | "nav_menu": {}, 123 | "number_sections": false, 124 | "sideBar": true, 125 | "skip_h1_title": false, 126 | "title_cell": "Table of Contents", 127 | "title_sidebar": "Contents", 128 | "toc_cell": false, 129 | "toc_position": {}, 130 | "toc_section_display": true, 131 | "toc_window_display": true 132 | } 133 | }, 134 | "nbformat": 4, 135 | "nbformat_minor": 4 136 | } 137 | -------------------------------------------------------------------------------- /06_ROI区域.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# ROI区域" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 位置提取ROI" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import cv2 #opencv的缩写为cv2\n", 24 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 25 | "import numpy as np # numpy数值计算工具包\n", 26 | "\n", 27 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 28 | "%matplotlib inline " 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "def cv_show(name,img):\n", 38 | " cv2.imshow(name,img)\n", 39 | " cv2.waitKey(0)\n", 40 | " cv2.destroyAllWindows()\n", 41 | "\n", 42 | "img = cv2.imread('01_Picture/01_cat.jpg')\n", 43 | "cat = img[0:200,0:200] # 选择图片感兴趣的区域\n", 44 | "cv_show('cat',cat)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "markdown", 49 | "metadata": {}, 50 | "source": [ 51 | "# 2. 通道提取ROI" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "## 2.1 分离 BGR 通道" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 3, 64 | "metadata": {}, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | "b.shape: (414, 500)\n", 71 | "g.shape: (414, 500)\n", 72 | "r.shape: (414, 500)\n", 73 | "img.shape: (414, 500, 3)\n" 74 | ] 75 | } 76 | ], 77 | "source": [ 78 | "img = cv2.imread('01_Picture/01_cat.jpg')\n", 79 | "b,g,r = cv2.split(img)\n", 80 | "cv_show('cat_b',b)\n", 81 | "print('b.shape:',b.shape) # B通道,单通道,灰度图\n", 82 | "cv_show('cat_g',g)\n", 83 | "print('g.shape:',g.shape) # G通道,单通道,灰度图\n", 84 | "cv_show('cat_r',r)\n", 85 | "print('r.shape:',r.shape) # R通道,单通道,灰度图\n", 86 | "img = cv2.merge((b,g,r))\n", 87 | "print('img.shape:',img.shape) # 3 通道,彩色图" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "## 2.2 展示 R 通道" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 4, 100 | "metadata": {}, 101 | "outputs": [], 102 | "source": [ 103 | "# 只保留 R\n", 104 | "img = cv2.imread('01_Picture/01_cat.jpg')\n", 105 | "b,g,r = cv2.split(img)\n", 106 | "img = cv2.merge((b,g,r))\n", 107 | "cur_img = img.copy()\n", 108 | "cur_img[:,:,0] = 0 \n", 109 | "cur_img[:,:,1] = 0\n", 110 | "cv_show('R',cur_img)" 111 | ] 112 | }, 113 | { 114 | "cell_type": "markdown", 115 | "metadata": {}, 116 | "source": [ 117 | "## 2.3 展示 G 通道" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 5, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "# 只保留 G\n", 127 | "img = cv2.imread('01_Picture/01_cat.jpg')\n", 128 | "cur_img = img.copy()\n", 129 | "cur_img[:,:,0] = 0 \n", 130 | "cur_img[:,:,2] = 0\n", 131 | "cv_show('G',cur_img)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "markdown", 136 | "metadata": {}, 137 | "source": [ 138 | "## 2.4 展示 R 通道" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 6, 144 | "metadata": {}, 145 | "outputs": [], 146 | "source": [ 147 | "# 只保留 R\n", 148 | "img = cv2.imread('01_Picture/01_cat.jpg')\n", 149 | "cur_img = img.copy()\n", 150 | "cur_img[:,:,1] = 0 \n", 151 | "cur_img[:,:,2] = 0\n", 152 | "cv_show('B',cur_img)" 153 | ] 154 | } 155 | ], 156 | "metadata": { 157 | "kernelspec": { 158 | "display_name": "Python 3.6.3", 159 | "language": "python", 160 | "name": "python3.6.3" 161 | }, 162 | "language_info": { 163 | "codemirror_mode": { 164 | "name": "ipython", 165 | "version": 3 166 | }, 167 | "file_extension": ".py", 168 | "mimetype": "text/x-python", 169 | "name": "python", 170 | "nbconvert_exporter": "python", 171 | "pygments_lexer": "ipython3", 172 | "version": "3.6.3" 173 | }, 174 | "toc": { 175 | "base_numbering": 1, 176 | "nav_menu": {}, 177 | "number_sections": false, 178 | "sideBar": true, 179 | "skip_h1_title": false, 180 | "title_cell": "Table of Contents", 181 | "title_sidebar": "Contents", 182 | "toc_cell": false, 183 | "toc_position": {}, 184 | "toc_section_display": true, 185 | "toc_window_display": true 186 | } 187 | }, 188 | "nbformat": 4, 189 | "nbformat_minor": 4 190 | } 191 | -------------------------------------------------------------------------------- /11_图像平滑处理.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 图像平滑处理" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 均值滤波" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import cv2 #opencv的缩写为cv2\n", 24 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 25 | "import numpy as np # numpy数值计算工具包\n", 26 | "\n", 27 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 28 | "%matplotlib inline \n", 29 | "\n", 30 | "img = cv2.imread('01_Picture/04_LenaNoise.png')\n", 31 | "cv2.imshow('img',img)\n", 32 | "cv2.waitKey(0)\n", 33 | "cv2.destroyAllWindows()" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "# 均值滤波\n", 43 | "# 简单的平均卷积操作,方框中的值相加,取平均,替换掉中心204的值\n", 44 | "\n", 45 | "blur = cv2.blur(img,(3,3)) # (3,3) 为核的大小,通常情况核都是奇数 3、5、7\n", 46 | "cv2.imshow('blur',blur)\n", 47 | "cv2.waitKey(0)\n", 48 | "cv2.destroyAllWindows()" 49 | ] 50 | }, 51 | { 52 | "cell_type": "markdown", 53 | "metadata": {}, 54 | "source": [ 55 | "# 2. 方框滤波" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 3, 61 | "metadata": {}, 62 | "outputs": [], 63 | "source": [ 64 | "# 方框滤波\n", 65 | "# 基本和均值一样,可以选择归一化\n", 66 | "\n", 67 | "# 在 Python 中 -1 表示自适应填充对应的值,这里的 -1 表示与颜色通道数自适应一样\n", 68 | "box = cv2.boxFilter(img,-1,(3,3),normalize=True) # 方框滤波如果做归一化,得到的结果和均值滤波一模一样\n", 69 | "cv2.imshow('box',box)\n", 70 | "cv2.waitKey(0)\n", 71 | "cv2.destroyAllWindows()" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 4, 77 | "metadata": {}, 78 | "outputs": [], 79 | "source": [ 80 | "# 方框滤波\n", 81 | "# 基本和均值一样,可以选择归一化,容易越界\n", 82 | "\n", 83 | "box = cv2.boxFilter(img,-1,(3,3),normalize=False) # 越界的值取 255\n", 84 | "cv2.imshow('box',box)\n", 85 | "cv2.waitKey(0)\n", 86 | "cv2.destroyAllWindows()" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": {}, 92 | "source": [ 93 | "# 3. 高斯滤波" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [ 102 | "# 高斯函数,越接近均值时,它的概率越大。\n", 103 | "# 离中心值越近的,它的权重越大,离中心值越远的,它的权重越小。\n", 104 | "\n", 105 | "aussian = cv2.GaussianBlur(img,(5,5),1)\n", 106 | "cv2.imshow('aussian',aussian)\n", 107 | "cv2.waitKey(0)\n", 108 | "cv2.destroyAllWindows()" 109 | ] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "metadata": {}, 114 | "source": [ 115 | "# 4. 中值滤波" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": {}, 122 | "outputs": [], 123 | "source": [ 124 | "# 中值滤波\n", 125 | "# 排序后拿中值替代中间元素值的大小\n", 126 | "\n", 127 | "median = cv2.medianBlur(img,5)\n", 128 | "cv2.imshow('median',median)\n", 129 | "cv2.waitKey(0)\n", 130 | "cv2.destroyAllWindows()" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "# 5. 展示所有滤波" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 7, 143 | "metadata": {}, 144 | "outputs": [ 145 | { 146 | "name": "stdout", 147 | "output_type": "stream", 148 | "text": [ 149 | "[[[125 137 226]\n", 150 | " [128 137 225]\n", 151 | " [129 137 224]\n", 152 | " ...\n", 153 | " [122 145 230]\n", 154 | " [110 130 221]\n", 155 | " [ 90 99 200]]\n", 156 | "\n", 157 | " [[125 137 226]\n", 158 | " [128 137 225]\n", 159 | " [129 137 224]\n", 160 | " ...\n", 161 | " [122 145 230]\n", 162 | " [110 130 221]\n", 163 | " [ 90 99 200]]\n", 164 | "\n", 165 | " [[125 137 226]\n", 166 | " [128 137 225]\n", 167 | " [129 137 224]\n", 168 | " ...\n", 169 | " [122 145 230]\n", 170 | " [110 130 221]\n", 171 | " [ 90 99 200]]\n", 172 | "\n", 173 | " ...\n", 174 | "\n", 175 | " [[ 81 47 103]\n", 176 | " [ 81 50 106]\n", 177 | " [ 60 25 90]\n", 178 | " ...\n", 179 | " [ 79 67 173]\n", 180 | " [ 79 67 174]\n", 181 | " [ 81 68 177]]\n", 182 | "\n", 183 | " [[ 80 47 102]\n", 184 | " [ 81 50 106]\n", 185 | " [ 74 26 90]\n", 186 | " ...\n", 187 | " [ 81 70 177]\n", 188 | " [ 81 70 177]\n", 189 | " [ 81 71 179]]\n", 190 | "\n", 191 | " [[ 57 22 82]\n", 192 | " [ 59 25 87]\n", 193 | " [ 75 27 90]\n", 194 | " ...\n", 195 | " [ 81 71 177]\n", 196 | " [ 81 71 179]\n", 197 | " [ 81 73 181]]]\n" 198 | ] 199 | } 200 | ], 201 | "source": [ 202 | "# 展示所有的\n", 203 | "\n", 204 | "res = np.hstack((blur,aussian,median)) # 矩阵横着拼接\n", 205 | "#res = np.vstack((blur,aussian,median)) # 矩阵竖着拼接\n", 206 | "print(res)\n", 207 | "cv2.imshow('median vs average', res) \n", 208 | "cv2.waitKey(0)\n", 209 | "cv2.destroyAllWindows()" 210 | ] 211 | } 212 | ], 213 | "metadata": { 214 | "kernelspec": { 215 | "display_name": "Python 3.6.3", 216 | "language": "python", 217 | "name": "python3.6.3" 218 | }, 219 | "language_info": { 220 | "codemirror_mode": { 221 | "name": "ipython", 222 | "version": 3 223 | }, 224 | "file_extension": ".py", 225 | "mimetype": "text/x-python", 226 | "name": "python", 227 | "nbconvert_exporter": "python", 228 | "pygments_lexer": "ipython3", 229 | "version": "3.6.3" 230 | }, 231 | "toc": { 232 | "base_numbering": 1, 233 | "nav_menu": {}, 234 | "number_sections": false, 235 | "sideBar": true, 236 | "skip_h1_title": false, 237 | "title_cell": "Table of Contents", 238 | "title_sidebar": "Contents", 239 | "toc_cell": false, 240 | "toc_position": {}, 241 | "toc_section_display": true, 242 | "toc_window_display": true 243 | } 244 | }, 245 | "nbformat": 4, 246 | "nbformat_minor": 4 247 | } 248 | -------------------------------------------------------------------------------- /12_腐蚀与膨胀.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 腐蚀与膨胀" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 腐蚀操作" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "## 1.1 汉字腐蚀(例)" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "import cv2 #opencv的缩写为cv2\n", 31 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 32 | "import numpy as np # numpy数值计算工具包\n", 33 | "\n", 34 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 35 | "%matplotlib inline " 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "# 腐蚀操作通常是拿二值图像做腐蚀操作\n", 45 | "\n", 46 | "img = cv2.imread('01_Picture/05_Dige.png')\n", 47 | "cv2.imshow('img',img)\n", 48 | "cv2.waitKey(0)\n", 49 | "cv2.destroyAllWindows()" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 3, 55 | "metadata": {}, 56 | "outputs": [], 57 | "source": [ 58 | "# 只要框里有黑色,中心点的值就变为黑色,即原来的白色被黑色腐蚀掉\n", 59 | "\n", 60 | "kernel = np.ones((5,5),np.uint8)\n", 61 | "erosion = cv2.erode(img,kernel,iterations=1)\n", 62 | "\n", 63 | "cv2.imshow('erosion',erosion)\n", 64 | "cv2.waitKey(0)\n", 65 | "cv2.destroyAllWindows()" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "## 1.2 圆形腐蚀(例)" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 4, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "pie = cv2.imread('01_Picture/06_pie.png')\n", 82 | "cv2.imshow('pie',pie)\n", 83 | "cv2.waitKey(0)\n", 84 | "cv2.destroyAllWindows()" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 5, 90 | "metadata": {}, 91 | "outputs": [], 92 | "source": [ 93 | "kernel = np.ones((30,30),np.uint8)\n", 94 | "erosion_1 = cv2.erode(pie,kernel,iterations=1)\n", 95 | "erosion_2 = cv2.erode(pie,kernel,iterations=2)\n", 96 | "erosion_3 = cv2.erode(pie,kernel,iterations=3)\n", 97 | "res = np.hstack((erosion_1,erosion_2,erosion_3))\n", 98 | "cv2.imshow('res',res)\n", 99 | "cv2.waitKey(0)\n", 100 | "cv2.destroyAllWindows()" 101 | ] 102 | }, 103 | { 104 | "cell_type": "markdown", 105 | "metadata": {}, 106 | "source": [ 107 | "# 2. 膨胀操作" 108 | ] 109 | }, 110 | { 111 | "cell_type": "markdown", 112 | "metadata": {}, 113 | "source": [ 114 | "## 2.1 汉字膨胀(例)" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 6, 120 | "metadata": {}, 121 | "outputs": [], 122 | "source": [ 123 | "img = cv2.imread('01_Picture/05_Dige.png')\n", 124 | "cv2.imshow('img',img)\n", 125 | "cv2.waitKey(0)\n", 126 | "cv2.destroyAllWindows()" 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "execution_count": 7, 132 | "metadata": {}, 133 | "outputs": [], 134 | "source": [ 135 | "# 先腐蚀 后膨胀,抵消腐蚀造成的损害\n", 136 | "kernel = np.ones((3,3),np.uint8)\n", 137 | "dige_erosion = cv2.erode(img,kernel,iterations=1) \n", 138 | "cv2.imshow('erosion',dige_erosion)\n", 139 | "cv2.waitKey(0)\n", 140 | "cv2.destroyAllWindows()\n", 141 | "\n", 142 | "kernel = np.ones((3,3),np.uint8)\n", 143 | "dige_dilate = cv2.dilate(dige_erosion,kernel,iterations=1) \n", 144 | "cv2.imshow('dilate',dige_dilate)\n", 145 | "cv2.waitKey(0)\n", 146 | "cv2.destroyAllWindows()" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "## 2.2 圆形腐蚀(例)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 8, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [ 162 | "pie = cv2.imread('01_Picture/06_pie.png')\n", 163 | "\n", 164 | "kernel = np.ones((30,30),np.uint8)\n", 165 | "dilate_1 = cv2.dilate(pie,kernel,iterations=1)\n", 166 | "dilate_2 = cv2.dilate(pie,kernel,iterations=2)\n", 167 | "dilate_3 = cv2.dilate(pie,kernel,iterations=3)\n", 168 | "res = np.hstack((dilate_1,dilate_2,dilate_3))\n", 169 | "cv2.imshow('res',res)\n", 170 | "cv2.waitKey(0)\n", 171 | "cv2.destroyAllWindows()" 172 | ] 173 | } 174 | ], 175 | "metadata": { 176 | "kernelspec": { 177 | "display_name": "Python 3.6.3", 178 | "language": "python", 179 | "name": "python3.6.3" 180 | }, 181 | "language_info": { 182 | "codemirror_mode": { 183 | "name": "ipython", 184 | "version": 3 185 | }, 186 | "file_extension": ".py", 187 | "mimetype": "text/x-python", 188 | "name": "python", 189 | "nbconvert_exporter": "python", 190 | "pygments_lexer": "ipython3", 191 | "version": "3.6.3" 192 | }, 193 | "toc": { 194 | "base_numbering": 1, 195 | "nav_menu": {}, 196 | "number_sections": false, 197 | "sideBar": true, 198 | "skip_h1_title": false, 199 | "title_cell": "Table of Contents", 200 | "title_sidebar": "Contents", 201 | "toc_cell": false, 202 | "toc_position": {}, 203 | "toc_section_display": true, 204 | "toc_window_display": true 205 | } 206 | }, 207 | "nbformat": 4, 208 | "nbformat_minor": 4 209 | } 210 | -------------------------------------------------------------------------------- /13_开运算与闭运算.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 开运算与闭运算" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 开运算" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import cv2 #opencv的缩写为cv2\n", 24 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 25 | "import numpy as np # numpy数值计算工具包\n", 26 | "\n", 27 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 28 | "%matplotlib inline " 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": {}, 35 | "outputs": [], 36 | "source": [ 37 | "# 开:先腐蚀,再膨胀\n", 38 | "img = cv2.imread('01_Picture/05_Dige.png')\n", 39 | "\n", 40 | "kernel = np.ones((5,5),np.uint8)\n", 41 | "opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) \n", 42 | "\n", 43 | "cv2.imshow('opening',opening)\n", 44 | "cv2.waitKey(0)\n", 45 | "cv2.destroyAllWindows()" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "# 2. 闭运算" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 3, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "# 闭:先膨胀,再腐蚀\n", 62 | "img = cv2.imread('01_Picture/05_Dige.png')\n", 63 | "\n", 64 | "kernel = np.ones((5,5),np.uint8)\n", 65 | "closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) \n", 66 | "\n", 67 | "cv2.imshow('closing',closing)\n", 68 | "cv2.waitKey(0)\n", 69 | "cv2.destroyAllWindows()" 70 | ] 71 | }, 72 | { 73 | "cell_type": "markdown", 74 | "metadata": {}, 75 | "source": [ 76 | "# 3. 梯度运算" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 4, 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "# 梯度 = 腐蚀-膨胀\n", 86 | "pie = cv2.imread('01_Picture/06_pie.png')\n", 87 | "\n", 88 | "kernel = np.ones((7,7),np.uint8)\n", 89 | "dilate = cv2.dilate(pie,kernel,iterations=5) \n", 90 | "erosion = cv2.erode(pie,kernel,iterations=5) \n", 91 | "\n", 92 | "res = np.hstack((dilate,erosion))\n", 93 | "\n", 94 | "cv2.imshow('res',res)\n", 95 | "cv2.waitKey(0)\n", 96 | "cv2.destroyAllWindows()" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 5, 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)\n", 106 | "cv2.imshow('gradient',gradient)\n", 107 | "cv2.waitKey(0)\n", 108 | "cv2.destroyAllWindows()" 109 | ] 110 | } 111 | ], 112 | "metadata": { 113 | "kernelspec": { 114 | "display_name": "Python 3.6.3", 115 | "language": "python", 116 | "name": "python3.6.3" 117 | }, 118 | "language_info": { 119 | "codemirror_mode": { 120 | "name": "ipython", 121 | "version": 3 122 | }, 123 | "file_extension": ".py", 124 | "mimetype": "text/x-python", 125 | "name": "python", 126 | "nbconvert_exporter": "python", 127 | "pygments_lexer": "ipython3", 128 | "version": "3.6.3" 129 | }, 130 | "toc": { 131 | "base_numbering": 1, 132 | "nav_menu": {}, 133 | "number_sections": false, 134 | "sideBar": true, 135 | "skip_h1_title": false, 136 | "title_cell": "Table of Contents", 137 | "title_sidebar": "Contents", 138 | "toc_cell": false, 139 | "toc_position": {}, 140 | "toc_section_display": true, 141 | "toc_window_display": true 142 | } 143 | }, 144 | "nbformat": 4, 145 | "nbformat_minor": 4 146 | } 147 | -------------------------------------------------------------------------------- /14_礼帽与黑帽.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 礼帽与黑帽" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 礼帽" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① 礼帽 = 原始输入-开运算" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 1, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "import cv2 #opencv的缩写为cv2\n", 31 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 32 | "import numpy as np # numpy数值计算工具包\n", 33 | "\n", 34 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 35 | "%matplotlib inline " 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "# 礼帽 \n", 45 | "# 原始带刺,开运算不带刺,原始输入-开运算 = 刺\n", 46 | "img = cv2.imread('01_Picture/05_Dige.png')\n", 47 | "kernel = np.ones((5,5),np.uint8)\n", 48 | "tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)\n", 49 | "cv2.imshow('tophat',tophat)\n", 50 | "cv2.waitKey(0)\n", 51 | "cv2.destroyAllWindows()" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "# 2. 黑帽" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "② 黑帽 = 闭运算-原始输入" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "# 黑帽 \n", 75 | "# 原始带刺,闭运算带刺并且比原始边界胖一点,闭运算-原始输入 = 原始整体\n", 76 | "img = img = cv2.imread('01_Picture/05_Dige.png')\n", 77 | "kernel = np.ones((5,5),np.uint8)\n", 78 | "blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)\n", 79 | "cv2.imshow('blackhat',blackhat)\n", 80 | "cv2.waitKey(0)\n", 81 | "cv2.destroyAllWindows()" 82 | ] 83 | } 84 | ], 85 | "metadata": { 86 | "kernelspec": { 87 | "display_name": "Python 3.6.3", 88 | "language": "python", 89 | "name": "python3.6.3" 90 | }, 91 | "language_info": { 92 | "codemirror_mode": { 93 | "name": "ipython", 94 | "version": 3 95 | }, 96 | "file_extension": ".py", 97 | "mimetype": "text/x-python", 98 | "name": "python", 99 | "nbconvert_exporter": "python", 100 | "pygments_lexer": "ipython3", 101 | "version": "3.6.3" 102 | }, 103 | "toc": { 104 | "base_numbering": 1, 105 | "nav_menu": {}, 106 | "number_sections": false, 107 | "sideBar": true, 108 | "skip_h1_title": false, 109 | "title_cell": "Table of Contents", 110 | "title_sidebar": "Contents", 111 | "toc_cell": false, 112 | "toc_position": {}, 113 | "toc_section_display": true, 114 | "toc_window_display": true 115 | } 116 | }, 117 | "nbformat": 4, 118 | "nbformat_minor": 4 119 | } 120 | -------------------------------------------------------------------------------- /15_Sobel算子、Scharr算子与Laplacian算子.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Sobel算子、Scharr算子与Laplacian算子" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. Sobel算子" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① Sobel算子函数:cv2.Sobel(src, ddepth, dx, dy, ksize),返回值为Sobel算子处理后的图像。\n", 22 | "\n", 23 | " - ddepth:图像的深度\n", 24 | " - dx 和 dy 分别表示水平和竖直方向\n", 25 | " - ksize 是 Sobel 算子的大小\n", 26 | " \n", 27 | "② 靠近最近点的左右和上下的权重最高,所以为±2。" 28 | ] 29 | }, 30 | { 31 | "attachments": { 32 | "image.png": { 33 | "image/png": "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MhYAAAgZwzBfffUVbtjdunXr+PHjIU56ekB/Pvu7evVqWVmZDX8YHBzs6elp9/Q4TLt27RyQd1AUde7cuZqamtreRQhZGEHs5eX16quvuth0DAA8tcrKyq5evVrbuzdv3tRoNCdOnKgta/L392/Tpk2jpc5GDMOcPXu2urra7Lt15nJNmjR55ZVXasvlzp49GxsbixDatm3b9OnTRSKRPZJsldu3b//6669m38JLKP35558nTpyo7c+FebKcCzz57AxPZcdNcV4veHkcuyep4fr16yecic4rKyunT59eUlJiYR+u2cJUly5dzp07J5VKGyFpAABHy8/PHzNmjOV9Bg8eXNtbS5cuTU5OtneiGkqj0SxYsOD8+fMW9rGcy50+fbpFixamb925c2fixIksy27btm3GjBkObrb+7rvv5s+fb2GHoqKib775prZ3v/nmm6ioqEZI11MEYj47I0kyMTFx1apVfCeEBxZm77OjFi1aFBcX11aE1ev1Xl5ex44dCwsLM7sDRVEeHh6NmUAAgOOMGjXKwpoZy5cvVyqVJ06ccK4+ed7e3kql0u653O3bt8PDwzUazbFjx3r37o2PCe6Q7ZjjExMT884775h9i2XZAQMG9OvXLzExsbbnCLRBNxzEfPbneoPe27dvjzdyc3NN3+UyXLOz9zUGC0Ebl3/V1mDhyIYMAEBjsxysEARBEARebsdhSbILu+dyNTU1Q4YMUavVx48fN5xINTU1tbi4ePPmze7u7g1OdR0snAU8zxc+WRDbNR4nuw0AL9q1a4fnvcMz8Bm+xbLs48ePEUISiaR///78pA8AAEDtdDrdW2+9hRDKysoyDPhYls3KyqqqqnK9qgpgFsR8ToaXAhBJkpGRkQih0tJSo2YUlmXxeo4jRoxwupI0AAC4PIZhpk2bdvny5aysrB49ejAGqqqq8vLyZDIZVK09JaBt1znwOykoSZJz585NSUlRq9W5ubkDBw7k3uKW4p0wYYKzN5tyB1kIS08CAHhkoY+gc2EYJj4+fvfu3XK5fPz48UZLJd28ebOysjIgIIDHFDYcl3VD5FoniPmES6/XHz9+nCAImqa3b9+OXywtLY2Pj1coFARB+Pn5de3a1TFXeZcuXebOnZuamrpo0aJjx44999xzOIXTpk1DCA0fPtzCyDghu3r1qlqtZhjm+vXrBw8exC9++umnN2/e7NixI0VRoaGhDujmAgDgHUVR2dnZCCGGYXbv3o1fLCoqiouL69+/v0gkatq06WuvveZEgQVN07t37167di1CCDfImGV2hK/ACer56ExYUAu9Xo8PkUKhYBjG8QnQarWWz11cXJwjE6bVat9++22EkEwmi42NjY2NlcvlCKEJEyZUV1c7LBmW6XQ6hNDx48et3B/PU2VBTU1Nfb8dIZSQkGBT8gF4enFVawqFgqZpu3wmjgCs/DQuz69NUFAQL88CI9bnchRFBQUFWf5RCCGdTueAZFvGMExISEhCQoKVR9i+z0eGYRISEvAf6vX6BvwOoYN6PuESiUSPHj3y8PDgSioURXGj9ymKcnCDr7u7+5YtW0aMGJGenv7zzz8jhPz9/ZOTk8PDw523VXfZsmXLly83PKqG8yPU1NTA7M0APCVIknz06JG7uzvXNdkoy3W6Xh8kSdY5Tw3DMM5YGSa056OzgOeZcOGmBMNXDOMPXmIRkiSHDh0aHh6OswmCIJx93IaXl5fhf42OqtHxBwC4MJIkhZblNhBBEK46HakAn49OAY4LqDeSJAUb6tE0PWzYMH9/f74TAgDgX+fOnVu0aMEwjGCzLBvQND18+PBu3brxnRB7Yll21KhRLVq0YP89ygTYF8R8dWNZNjs72/QqpChq0KBBztus6ZI8PT2///77xl62+KeffjI7cajLjPUDgEcsy5pdIZem6bCwsHpV4UycOJFhGBer9fH09Pzuu++M2iicHUmS8+bNQ428IghN08ePHze9HliWdbqGe9u41J3QSJRKZW2DUuEZL0CNHfAhhEiSdNJxygAIn4Ust85hFkZEIpFLFstdLODDHBOar1271uyCUk8J16nuBgAAAABoCPbfa025GKjns+To0aMWyohQyffUYhjm2LFjFjqdwLUBgA2OHDliobLnKWl9A41qyZIl8fHxtb3r8teY8fKpAAAAAADA9UDbLgAAAACA64OYDwAAAADA9UHMBwAAAADg+iDmAwAAAABwfRDzAQAAAAC4Poj5AAAAAABc3/8D1iVFOto5y/kAAAAASUVORK5CYII=" 34 | } 35 | }, 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "![image.png](attachment:image.png)" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "## 1.1 圆形处理(例)" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 1, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "import cv2 #opencv的缩写为cv2\n", 56 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 57 | "import numpy as np # numpy数值计算工具包\n", 58 | "\n", 59 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 60 | "%matplotlib inline " 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 2, 66 | "metadata": {}, 67 | "outputs": [], 68 | "source": [ 69 | "pie = cv2.imread('01_Picture/06_pie.png') # 读取图像\n", 70 | "cv2.imshow('img',pie)\n", 71 | "cv2.waitKey()\n", 72 | "cv2.destroyAllWindows()" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 3, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "# 梯度就是边界点,左边右边不一样\n", 82 | "def cv_show(img,name):\n", 83 | " cv2.imshow(name,img)\n", 84 | " cv2.waitKey()\n", 85 | " cv2.destroyAllWindows()\n", 86 | " \n", 87 | "# 白到黑是整数,黑到白是负数了,所有的负数会被截断成 0,所以要取绝对值\n", 88 | "sobelx = cv2.Sobel(pie,cv2.CV_64F,1,0,ksize=3) # 1,0 表示只算水平方向梯度\n", 89 | "cv_show(sobelx,'sobelx')" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 4, 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [ 98 | "sobelx = cv2.Sobel(pie,cv2.CV_64F,1,0,ksize=3)\n", 99 | "sobelx = cv2.convertScaleAbs(sobelx) # 取负数时,取绝对值\n", 100 | "cv_show(sobelx,'sobelx')\n", 101 | "\n", 102 | "sobely = cv2.Sobel(pie,cv2.CV_64F,0,1,ksize=3) # 1,0 只算 y 方向梯度\n", 103 | "sobely = cv2.convertScaleAbs(sobely) # 取负数时,取绝对值\n", 104 | "cv_show(sobely,'sobely')" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 5, 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [ 113 | "# 计算 x 和 y 后,再求和\n", 114 | "sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) # 0是偏置项\n", 115 | "cv_show(sobelxy,'sobelxy')" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 6, 121 | "metadata": {}, 122 | "outputs": [], 123 | "source": [ 124 | "# 不建议直接计算,还有重影\n", 125 | "sobelxy = cv2.Sobel(pie,cv2.CV_64F,1,1,ksize=3)\n", 126 | "sobelxy = cv2.convertScaleAbs(sobelxy)\n", 127 | "cv_show(sobelxy,'sobelxy')" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "## 1.2 人照处理(例)" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 7, 140 | "metadata": {}, 141 | "outputs": [], 142 | "source": [ 143 | "img = cv2.imread('01_Picture/07_Lena.jpg',cv2.IMREAD_GRAYSCALE)\n", 144 | "cv_show(img,'img')" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 8, 150 | "metadata": {}, 151 | "outputs": [], 152 | "source": [ 153 | "img = cv2.imread('01_Picture/07_Lena.jpg',cv2.IMREAD_GRAYSCALE)\n", 154 | "sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)\n", 155 | "sobelx = cv2.convertScaleAbs(sobelx)\n", 156 | "sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)\n", 157 | "sobely = cv2.convertScaleAbs(sobely)\n", 158 | "sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)\n", 159 | "cv_show(sobelxy,'sobelxy')" 160 | ] 161 | }, 162 | { 163 | "cell_type": "code", 164 | "execution_count": 9, 165 | "metadata": {}, 166 | "outputs": [], 167 | "source": [ 168 | "# 整体计算有重影和模糊,不建议整体计算\n", 169 | "img = cv2.imread('01_Picture/07_Lena.jpg',cv2.IMREAD_GRAYSCALE)\n", 170 | "sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)\n", 171 | "sobelxy = cv2.convertScaleAbs(sobelxy)\n", 172 | "cv_show(sobelxy,'sobelxy')" 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": [ 179 | "# 2. Scharr算子" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "① 对结果的差异更敏感一些。" 187 | ] 188 | }, 189 | { 190 | "attachments": { 191 | "image.png": { 192 | "image/png": "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" 193 | } 194 | }, 195 | "cell_type": "markdown", 196 | "metadata": {}, 197 | "source": [ 198 | "![image.png](attachment:image.png)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "# 3. Laplacian算子" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "① Laplacian算子用的是二阶导,对噪音点更敏感一些。\n", 213 | "\n", 214 | "② 如果中心点是边界,它与周围像素点差异的幅度会较大,Laplacian算子根据此特点可以把边界识别出来。" 215 | ] 216 | }, 217 | { 218 | "attachments": { 219 | "image.png": { 220 | "image/png": "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" 221 | } 222 | }, 223 | "cell_type": "markdown", 224 | "metadata": {}, 225 | "source": [ 226 | "![image.png](attachment:image.png)" 227 | ] 228 | }, 229 | { 230 | "cell_type": "markdown", 231 | "metadata": {}, 232 | "source": [ 233 | "# 4. 各个算子区别" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 10, 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "img = cv2.imread('01_Picture/07_Lena.jpg',cv2.IMREAD_GRAYSCALE)\n", 243 | "cv_show(img,'img')" 244 | ] 245 | }, 246 | { 247 | "cell_type": "code", 248 | "execution_count": 11, 249 | "metadata": {}, 250 | "outputs": [], 251 | "source": [ 252 | "# 不同算子的差异\n", 253 | "img = cv2.imread('01_Picture/07_Lena.jpg',cv2.IMREAD_GRAYSCALE)\n", 254 | "sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)\n", 255 | "sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)\n", 256 | "sobelx = cv2.convertScaleAbs(sobelx)\n", 257 | "sobely = cv2.convertScaleAbs(sobely)\n", 258 | "sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) \n", 259 | "\n", 260 | "scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)\n", 261 | "scharry = cv2.Scharr(img,cv2.CV_64F,0,1)\n", 262 | "scharrx = cv2.convertScaleAbs(scharrx)\n", 263 | "scharry = cv2.convertScaleAbs(scharry)\n", 264 | "scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)\n", 265 | "\n", 266 | "laplacian = cv2.Laplacian(img,cv2.CV_64F) # 没有 x、y,因为是求周围点的比较\n", 267 | "laplacian = cv2.convertScaleAbs(laplacian)\n", 268 | "\n", 269 | "res = np.hstack((sobelxy,scharrxy,laplacian))\n", 270 | "cv_show(res,'res')" 271 | ] 272 | } 273 | ], 274 | "metadata": { 275 | "kernelspec": { 276 | "display_name": "Python 3.6.3", 277 | "language": "python", 278 | "name": "python3.6.3" 279 | }, 280 | "language_info": { 281 | "codemirror_mode": { 282 | "name": "ipython", 283 | "version": 3 284 | }, 285 | "file_extension": ".py", 286 | "mimetype": "text/x-python", 287 | "name": "python", 288 | "nbconvert_exporter": "python", 289 | "pygments_lexer": "ipython3", 290 | "version": "3.6.3" 291 | }, 292 | "toc": { 293 | "base_numbering": 1, 294 | "nav_menu": {}, 295 | "number_sections": false, 296 | "sideBar": true, 297 | "skip_h1_title": false, 298 | "title_cell": "Table of Contents", 299 | "title_sidebar": "Contents", 300 | "toc_cell": false, 301 | "toc_position": { 302 | "height": "calc(100% - 180px)", 303 | "left": "10px", 304 | "top": "150px", 305 | "width": "222.2px" 306 | }, 307 | "toc_section_display": true, 308 | "toc_window_display": true 309 | } 310 | }, 311 | "nbformat": 4, 312 | "nbformat_minor": 4 313 | } 314 | -------------------------------------------------------------------------------- /18_图像轮廓.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 图像轮廓" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "# 1. 图像轮廓简介" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "① 边缘有一些零零散散的线段也可以当做边缘,反正梯度上下左右发生差异,就把它当做边缘了。\n", 22 | "\n", 23 | "② 图像的轮廓必须是一个整体,不是零零散散的,而是连在一块的。\n", 24 | "\n", 25 | "③ 图像轮廓函数:cv2.findContours(img,mode,method)\n", 26 | "\n", 27 | "mode:轮廓检索模式\n", 28 | "- RETR_EXTERNAL :只检索最外面的轮廓。\n", 29 | "- RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中。\n", 30 | "- RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界。\n", 31 | "- RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。( 最常用 )\n", 32 | "\n", 33 | "method:轮廓逼近方法\n", 34 | "- CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,如下图左所示。所有其他方法输出多边形 ( 顶点的序列 ),如下图右所示。\n", 35 | "- CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分,如下图右所示。\n", 36 | "\n", 37 | "④ 为了更高的准确率,轮廓检测使用二值图像。" 38 | ] 39 | }, 40 | { 41 | "attachments": { 42 | "image.png": { 43 | "image/png": "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" 44 | } 45 | }, 46 | "cell_type": "markdown", 47 | "metadata": {}, 48 | "source": [ 49 | "![image.png](attachment:image.png)" 50 | ] 51 | }, 52 | { 53 | "cell_type": "markdown", 54 | "metadata": {}, 55 | "source": [ 56 | "# 2. 绘制轮廓" 57 | ] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "## 2.1 图像二值化" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 1, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "import cv2 #opencv的缩写为cv2\n", 73 | "import matplotlib.pyplot as plt # matplotlib库用于绘图展示\n", 74 | "import numpy as np # numpy数值计算工具包\n", 75 | "\n", 76 | "# 魔法指令,直接展示图,Jupyter notebook特有\n", 77 | "%matplotlib inline \n", 78 | "\n", 79 | "def cv_show(img,name):\n", 80 | " cv2.imshow(name,img)\n", 81 | " cv2.waitKey()\n", 82 | " cv2.destroyAllWindows()" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 2, 88 | "metadata": { 89 | "scrolled": true 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "img = cv2.imread('01_Picture/08_Car.png')\n", 94 | "cv_show(img,'img')\n", 95 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 96 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于 17 的取 255,小于 127 的取 0 \n", 97 | "cv_show(thresh,'thresh')" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "## 2.2 轮廓检测" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 3, 110 | "metadata": {}, 111 | "outputs": [ 112 | { 113 | "name": "stdout", 114 | "output_type": "stream", 115 | "text": [ 116 | "(2579,)\n", 117 | "[[[ 1 -1 -1 -1]\n", 118 | " [ 2 0 -1 -1]\n", 119 | " [ 3 1 -1 -1]\n", 120 | " ...\n", 121 | " [ -1 2575 2577 -1]\n", 122 | " [2578 -1 -1 2576]\n", 123 | " [ -1 2577 -1 2576]]]\n" 124 | ] 125 | }, 126 | { 127 | "name": "stderr", 128 | "output_type": "stream", 129 | "text": [ 130 | "D:\\11_Anaconda\\envs\\py3.6.3\\lib\\site-packages\\ipykernel_launcher.py:4: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray\n", 131 | " after removing the cwd from sys.path.\n" 132 | ] 133 | } 134 | ], 135 | "source": [ 136 | "# 做完二值后,再用图像轮廓检测函数再去做\n", 137 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 138 | "cv_show(binary,'binary') # 返回的二值化后的图像\n", 139 | "print(np.array(contours).shape) # 轮廓点的信息\n", 140 | "print(hierarchy) # hierarchy 是把轮廓结果保存在层级结构当中,暂时用不上" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "## 2.3 绘制所有轮廓" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 4, 153 | "metadata": {}, 154 | "outputs": [], 155 | "source": [ 156 | "# 传入参数:图像、轮廓、轮廓索引(自适应,画所有轮廓),颜色模式,线条厚度\n", 157 | "# 注意需要copy,要不原图会变。。。\n", 158 | "cv_show(img,'img')\n", 159 | "draw_img = img.copy() # 若不用拷贝后的,而是用原图画轮廓,则画轮廓图绘把原始的输入图像重写,覆盖掉 \n", 160 | "res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) \n", 161 | "cv_show(res,'res')" 162 | ] 163 | }, 164 | { 165 | "cell_type": "markdown", 166 | "metadata": {}, 167 | "source": [ 168 | "## 2.4 绘制某个轮廓" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 5, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [ 177 | "draw_img = img.copy()\n", 178 | "res = cv2.drawContours(draw_img,contours,70,(0,0,255),2) # 画 70 号轮廓\n", 179 | "cv_show(res,'res')" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "## 2.5 综合展示" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 6, 192 | "metadata": {}, 193 | "outputs": [], 194 | "source": [ 195 | "img = cv2.imread('01_Picture/10_contours.png')\n", 196 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 197 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 198 | "\n", 199 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 200 | "\n", 201 | "draw_img = img.copy() # 若不用拷贝后的,而是用原图画轮廓,则画轮廓图绘把原始的输入图像重写,覆盖掉 \n", 202 | "res = cv2.drawContours(draw_img,contours,3,(0,0,255),2) \n", 203 | "cv_show(res,'res')" 204 | ] 205 | }, 206 | { 207 | "cell_type": "markdown", 208 | "metadata": {}, 209 | "source": [ 210 | "# 3. 轮廓特征提取" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 7, 216 | "metadata": {}, 217 | "outputs": [ 218 | { 219 | "name": "stdout", 220 | "output_type": "stream", 221 | "text": [ 222 | "8500.5\n", 223 | "437.9482651948929\n" 224 | ] 225 | } 226 | ], 227 | "source": [ 228 | "img = cv2.imread('01_Picture/10_contours.png')\n", 229 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 230 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 231 | "\n", 232 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 233 | "\n", 234 | "cnt = contours[0] # 通过轮廓索引,拿到该索引对应的轮廓特征\n", 235 | "print(cv2.contourArea(cnt)) # 该轮廓的面积\n", 236 | "print(cv2.arcLength(cnt,True)) # 该轮廓的周长,True表示闭合的" 237 | ] 238 | }, 239 | { 240 | "cell_type": "markdown", 241 | "metadata": {}, 242 | "source": [ 243 | "# 4. 轮廓近似" 244 | ] 245 | }, 246 | { 247 | "cell_type": "markdown", 248 | "metadata": {}, 249 | "source": [ 250 | "① 正常轮廓展示是最右边的图,但是当我们需要轮廓没有那么不规则,而是想要轮廓近似成规则的形状,这就叫轮廓近似,近似成下图中中间图像的轮廓。\n", 251 | "\n", 252 | "② 一条呈抛物线的曲线的端点为 A、B 两点,取曲线上到直线 AB 距离最大的点,该点为 C 点,若 C 点到直线的距离小于设置的阈值,则可以把直线 AB 当做曲线的近似,若 C 点到直线的距离大于设置的阈值,那么曲线不能用直线 AB 来近似,而 AC 曲线可能用 AC 直线来代替、BC曲线可能用 BC 直线来代替。再通过阈值来判断是否可以代替。" 253 | ] 254 | }, 255 | { 256 | "attachments": { 257 | "image.png": { 258 | "image/png": "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" 259 | } 260 | }, 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "![image.png](attachment:image.png)" 265 | ] 266 | }, 267 | { 268 | "cell_type": "markdown", 269 | "metadata": {}, 270 | "source": [ 271 | "## 4.1 正常轮廓展示" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 8, 277 | "metadata": {}, 278 | "outputs": [], 279 | "source": [ 280 | "img = cv2.imread('01_Picture/11_contours2.png')\n", 281 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 282 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 283 | "\n", 284 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 285 | "\n", 286 | "draw_img = img.copy() # 若不用拷贝后的,而是用原图画轮廓,则画轮廓图绘把原始的输入图像重写,覆盖掉 \n", 287 | "res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) \n", 288 | "cv_show(res,'res')" 289 | ] 290 | }, 291 | { 292 | "cell_type": "markdown", 293 | "metadata": {}, 294 | "source": [ 295 | "## 4.2 轮廓近似展示" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 9, 301 | "metadata": {}, 302 | "outputs": [], 303 | "source": [ 304 | "img = cv2.imread('01_Picture/11_contours2.png')\n", 305 | "\n", 306 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 307 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 308 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 309 | "cnt = contours[0]\n", 310 | "\n", 311 | "draw_img = img.copy()\n", 312 | "res = cv2.drawContours(draw_img,[cnt],-1,(0,0,255),2) \n", 313 | "cv_show(res,'res')" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 10, 319 | "metadata": {}, 320 | "outputs": [], 321 | "source": [ 322 | "epsilon = 0.1 * cv2.arcLength(cnt,True) # 周长的百分比,这里用 0.1 的周长作阈值\n", 323 | "approx = cv2.approxPolyDP(cnt,epsilon,True) # 第二个参数为阈值\n", 324 | "draw_img = img.copy()\n", 325 | "res = cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)\n", 326 | "cv_show(res,'res')" 327 | ] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "metadata": {}, 332 | "source": [ 333 | "# 5. 外接矩形" 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 11, 339 | "metadata": {}, 340 | "outputs": [], 341 | "source": [ 342 | "img = cv2.imread('01_Picture/10_contours.png')\n", 343 | "\n", 344 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 345 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 346 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 347 | "cnt = contours[6]\n", 348 | "\n", 349 | "x,y,w,h = cv2.boundingRect(cnt) # 可以得到矩形四个坐标点的相关信息\n", 350 | "img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255),2)\n", 351 | "cv_show(img,'img')" 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": 12, 357 | "metadata": {}, 358 | "outputs": [ 359 | { 360 | "name": "stdout", 361 | "output_type": "stream", 362 | "text": [ 363 | "轮廓面具与边界矩形比: 0.7732441471571906\n" 364 | ] 365 | } 366 | ], 367 | "source": [ 368 | "area = cv2.contourArea(cnt)\n", 369 | "rect_area = w * h\n", 370 | "extent = float(area) / rect_area\n", 371 | "print('轮廓面具与边界矩形比:',extent)" 372 | ] 373 | }, 374 | { 375 | "cell_type": "markdown", 376 | "metadata": {}, 377 | "source": [ 378 | "# 6. 外接圆" 379 | ] 380 | }, 381 | { 382 | "cell_type": "code", 383 | "execution_count": 13, 384 | "metadata": {}, 385 | "outputs": [], 386 | "source": [ 387 | "img = cv2.imread('01_Picture/10_contours.png')\n", 388 | "\n", 389 | "gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)\n", 390 | "ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 大于17的取255,小于127的取0 \n", 391 | "binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)\n", 392 | "cnt = contours[0]\n", 393 | "\n", 394 | "draw_img = img.copy()\n", 395 | "(x,y),redius = cv2.minEnclosingCircle(cnt)\n", 396 | "center = (int(x),int(y))\n", 397 | "redius = int(redius)\n", 398 | "img = cv2.circle(draw_img,center,redius,(0,255,0),2)\n", 399 | "cv_show(img,'img')" 400 | ] 401 | } 402 | ], 403 | "metadata": { 404 | "kernelspec": { 405 | "display_name": "Python 3.6.3", 406 | "language": "python", 407 | "name": "python3.6.3" 408 | }, 409 | "language_info": { 410 | "codemirror_mode": { 411 | "name": "ipython", 412 | "version": 3 413 | }, 414 | "file_extension": ".py", 415 | "mimetype": "text/x-python", 416 | "name": "python", 417 | "nbconvert_exporter": "python", 418 | "pygments_lexer": "ipython3", 419 | "version": "3.6.3" 420 | }, 421 | "toc": { 422 | "base_numbering": 1, 423 | "nav_menu": {}, 424 | "number_sections": false, 425 | "sideBar": true, 426 | "skip_h1_title": false, 427 | "title_cell": "Table of Contents", 428 | "title_sidebar": "Contents", 429 | "toc_cell": false, 430 | "toc_position": { 431 | "height": "calc(100% - 180px)", 432 | "left": "10px", 433 | "top": "150px", 434 | "width": "250.2px" 435 | }, 436 | "toc_section_display": true, 437 | "toc_window_display": true 438 | } 439 | }, 440 | "nbformat": 4, 441 | "nbformat_minor": 4 442 | } 443 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 最全面的 OpenCV 笔记 2 | 3 | 笔记视频: 4 | 5 | 视频讲解【主讲方:咕泡唐宇迪】 6 | 7 | 1. https://www.bilibili.com/video/BV1PV411774y?from=search&seid=128144269248922245&spm_id_from=333.337.0.0 8 | 9 | 笔记数据集: 10 | 11 | 1. 链接:https://pan.baidu.com/s/1PiIaO7jldLC-O5RQzKvGJA 提取码:vt2m 12 | 13 | 补充说明:数据集链接如果失效了,下面有微信,可以联系我。 14 | 15 | ------------------------------------------------------------- 16 | ------------------------------------------------------------- 17 | 18 | 笔记备注: 19 | 20 | 1. 在线观看笔记时,有时会出现图片(或公式)显示不完整,这是Github网站没有解析好,笔记下载到本地观看就正常了。(不会下载笔记的,百度查一下"Github如何下载文件"。) 21 | 2. Pycharm 的 Jupyter Notebook 打开笔记时,图片不会正常显示,笔记是用 Anaconda 的 Jupyter Notebook 打开的。(不会打开笔记的,百度查一下"Anaconda如何打开Jupyter Notebook文件",或者我的主页Python仓库里面"00_Python编辑器"里面有写。) 22 | 3. 安装 Jupyter Notebook 的目录插件,可以快速通过目录,跳转到相应的章节,如下图所示。(不会安装目录的,百度查一下"Jupyter Notebook如何安装目录",或者我的主页Python仓库里面"00_Python编辑器"里面有相关链接。) 23 | 24 | ![image](https://user-images.githubusercontent.com/60348867/200466242-0430e964-41d0-42ff-8553-8cb88ef927e5.png) 25 | 26 | ------------------------------------------------------------- 27 | ------------------------------------------------------------- 28 | 29 | 更多笔记: 30 | 31 | 我的Github主页,还有其他优秀视频的笔记,希望能帮助到你~ 32 | 33 | 1. https://github.com/AccumulateMore 34 | 35 | 我的哔哩哔哩, 大模型、多模态笔记【手把手教你做科研 更新ing】,希望能帮助到你~ 36 | 37 | 1. https://www.bilibili.com/video/BV1xM4m1m7vA/?spm_id_from=333.999.0.0&vd_source=c9745e4447536b28b2b0735071d30bd6 38 | 39 | "♥我的笔记,希望对你有帮助♥" 40 | 41 | ♥小声哔哔:你的star,是我更新的动力~♥ 42 | 43 | ------------------------------------------------------------- 44 | ------------------------------------------------------------- 45 | 46 | 搭建交流群,帮助孤单的自学者交流 47 | 48 | | 【深度学习 学习交流①群】 | 【深度学习 学习交流②群】 | 微信 | 49 | | -------- | -------- | -------- | 50 | | ![312f346ad393a2f617f21da7ffec9d8](https://github.com/AccumulateMore/CV/assets/60348867/c99750a2-89c0-45ed-bf42-e8f63a222d60)
| ![2f44c2648aaf04f393162501e9e4e0a](https://github.com/AccumulateMore/CV/assets/60348867/d6c44e7b-8349-4de3-b91b-ed62ee7c1544)
| ![f1ab900951ff142e86e1f3833b9207d](https://github.com/user-attachments/assets/00fc72a7-eb5a-43c5-871d-4e82810c3d49)
| 51 | 52 | 超过200人,扫码入群方式失效,只能微信好友邀请入群。 53 | 54 | 看人之短,无一可交之人。看人之长,天下皆是吾师。 55 | 56 | 备注:好友申请时,声明目的,需要什么 57 | 58 | | 备注 | 备注 | 备注 | 59 | | -------------------- | -------- | -------- | 60 | | 需要论文辅导(研0研1免费,半年掌握三年知识)
| 要进学习交流群
| 要数据集
| 61 | | 需要学习指导(指数级学习,快速拿到offer)
| 需要实习(可开实习证明)
| ......
| 62 | | 需要商业级项目(快速从0到1,简历增添项目)
| 指导改简历(从面试官角度出发)
| ......
| 63 | 64 | ------------------------------------------------------------- 65 | ------------------------------------------------------------- 66 | 67 | 帮你们就业,有意向的可以投简历 68 | 69 | 备注:初学者也可以根据市场上就业需求,去学习自己。 70 | 71 | 联影医疗 地点(可选):上海、北京、深圳、武汉、广州、成都、西安、沈阳、三亚等 72 | 73 | 联影简介:2022年上市千亿公司,科创板最大IPO,在国家号召自主研发高端医疗器械背景下,发展前景十分广阔。 74 | 75 | 内推人:联影老员工 76 | 77 | 岗位职责【图像方向】: 78 | 79 | 参与联影集团产品的AI算法开发工作或图形算法开发工作,负责下列至少一项工作: 80 | 81 | 1. 负责提供产品级高端算法解决方案,包括:联影通用软件平台、联影高级应用后处理工作站、联影智能uAl平台、联影机器人手术规划与导航、MR/CT/RT/MI/US事业部的算法需求、科研院所和医院的前瞻性研究项目等;参与创新技术的产品化工作。 82 | 2. 医学图像3D渲染算法和应用维护与开发,利用图像处理和人工智能技术,从事医学图像处理领域相关算法的设计和研发。 83 | 84 | 任职要求: 85 | 86 | 1. 熟悉机器视觉原理,熟悉以下领域之一:3D重建、立体视觉、SLAM、通用图像视频分类、目标检测、人体姿态估计。 87 | 2. 熟悉以下医学图像后处理算法之一:图形算法、重建算法、分割算法、检测算法、分类算法、配准算法、深度学习算法、流体力学算法、灌注算法、纹理分析算法等。 88 | 89 | 岗位职责【语音方向】: 90 | 91 | 1. 负责音频信号处理和识别相关算法的研究和实现,包含但不限于回声消除、麦克风阵列、盲源分离等技术。 92 | 2. 负责深度学习、神经网络等AI音频算法的研究和实现。 93 | 94 | 任职要求: 95 | 96 | 1. 扎实的数学理论及数字信号处理基础,掌握Matlab及C/C++语言编程。 97 | 2. 有语音、音频信号处理(降噪,回声消除、麦阵、音效等)相关经验。 98 | 3. 有深度学习、神经网络、智能语音识别相关研究。 99 | 100 | 岗位职责【大模型方向】: 101 | 102 | 1. 负责大语言模型方面的算法开发、优化、应用落地。 103 | 2. 负责相应AI解决方案设计,参与关键技术研发,攻关技术难点。 104 | 3. 负责设计和实现大语言模型相关的算法和模型实现,研究并设计新是算法和模型,解决大语言模型应用问题。 105 | 4. 负责开发和优化大语言模型的训练过程,设计并实现大语言模型的训练算法和策略,配置和优化训练的超参数和计算资源,保证模型的训练效果和效率。 106 | 5. 负责构建和管理大规模医疗文本数据集,用于模型预训练和微调,完成不用场景下的下游任务。 107 | 6. 负责进行大语言模型的评估和验证,设计评估指标和实验;设计和实施评估指标和实验,对训练好的大语言模型进行性能评估和分析。识别模型的弱点和改进空间,提出相应的改进策略和方法。 108 | 7. 参与高校、科研、医疗机构科研合作,协助科研成果落地转化。 109 | 110 | 任职要求: 111 | 112 | 1. 具有机器学习、自然语言处理、医学影像分析,或相关领域的学习和研究。 113 | 2. 有预训练大语言模型或GPT模型等相关研究开发经验。 114 | 3. 在机器学习(ICML,NeurlPS、ICLR等)、计算机视觉(CVPR、ICCV、ECCV等)、自然语言处理(ACL,EMNLP等)和医疗影像分析(MICCAI、IPMI)等顶级会议,或者顶级期刊(IEEE T-PAMI,IEEE TMI、Medical lmage Analysis)发表过相关论文。 115 | 4. 具有人工智能相关专业(计算机视觉、机器学习、医疗图像分析等)硕士及以上学位。 116 | 5. 能熟练使用英语。 117 | 118 | 补充:能内推简历的,也可以联系我,把岗位职责、任职要求发给我【你收公司内推奖金、ta们就业,双赢】。 119 | 120 | ------------------------------------------------------------- 121 | ------------------------------------------------------------- 122 | 123 | 想学习商业级项目的,下面商业级项目可以学习,与大量求职者卷一卷,提高核心竞争力。 124 | 125 | | 商业项目 | 商业项目 | 商业项目 | 商业项目 | 126 | | -------------------- | -------- | -------- | -------- | 127 | | 人脸识别与管理系统
| 车牌识别与管理系统
| 手势识别系统
| 人脸面部活体检测系统
| 128 | | 目标检测与自动标注系统
| 人脸表情识别系统
| 行人跌倒检测系统
| PCB板缺陷检测系统
| 129 | | 安全帽检测系统
| 生活垃圾分类系统
| 火焰烟雾检测系统
| 路面坑洞检测系统
| 130 | | 钢材表面缺陷检测系统
| 肺炎诊断系统
| 面部口罩检测系统
| 西红柿成熟度检测系统
| 131 | | 血细胞检测计数系统
| 舰船分类检测系统
| 吸烟行为检测系统
| 水稻害虫检测系统
| 132 | | 交通标志检测系统
| 行人追踪计数系统
| 车辆追踪计数系统
| 脑肿瘤检测系统
| 133 | | 无人机视角检测系统
| 裂缝检测分析系统
| 水下海生物检测系统
| 草莓成熟度检测系统
| 134 | | 条形码检测系统
| 交通信号灯检测系统
| 金属品瑕疵检测系统
| 链条缺陷检测系统
| 135 | | 螺栓螺母检测系统
| 焊缝缺陷检测系统
| 蛀牙检测识别系统
| 非机动车头盔检测系统
| 136 | | 水果检测识别系统
| 蔬菜检测系统
| 高密度人脸检测系统
| 肾结石检测系统
| 137 | | 反光衣检测预警系统
| 人员闯入报警系统
| 玉米病害检测系统
| 橙子病害识别系统
| 138 | | 木薯病害识别预防系统
| 野火烟雾检测系统
| 路面坑洞检测分割系统
| 遥感地面物体检测系统
| 139 | | 田间杂草检测系统
| 葡萄病害识别系统
| 车牌检测识别系统
| 草莓病害检测分割系统
| 140 | | 车辆行人追踪系统
| 水稻病害识别系统
| 中草药识别系统
| 车辆行人检测系统
| 141 | | 条形码识别系统
| 交通信号灯识别系统
| 水下海生物检测系统
| 交通事故检测系统
| 142 | | 安检危险品检测系统
| 农作物检测系统
| 危险驾驶行为检测系统
| 维修工具检测系统
| 143 | | 建筑墙面损伤检测系统
| 煤矿传送带异物检测系统
| 老鼠智能检测系统
| 水面垃圾检测系统
| 144 | | 遥感视角船只检测系统
| 胃肠道息肉检测系统
| 心脏间隔壁分割系统
| 半导体芯片缺陷检测系统
| 145 | | 视网膜疾病诊断系统
| 运动鞋品牌识别系统
| X光骨折检测系统
| 遥感视角农田分割系统
| 146 | | 电瓶车进电梯检测系统
| 遥感视角房屋分割系统
| CT肺结节检测系统
| 舌苔舌像诊断系统
| 147 | | 输电线路设备检测系统
| 零售柜商品识别系统
| 远距离停车位检测系统
| 安全帽检测系统
| 148 | | 机场航拍小目标检测系统
| 景区垃圾识别系统
| 快递包裹检测系统
| 无人机目标检测系统
| 149 | | 疲劳驾驶检测系统
| 布匹缺陷检测系统
| 夜视行人检测系统
| 教研人员检测与计数系统
| 150 | 151 | ------------------------------------------------------------- 152 | ------------------------------------------------------------- 153 | 154 | 2021年我硕士毕业时,【简历】技能书写,可以借鉴 155 | 156 | ![image](https://github.com/user-attachments/assets/13ce32b7-112d-4037-8abc-d2a8fa420730) 157 | 158 | 用了几个技巧,分享给大家: 159 | 160 | 1. 技能只写掌握了XX,没掌握不要写,掌握且更熟练的放前面,掌握但不熟练的放后面。 161 | 2. 写掌握某项技能时,后面要论证自己真的掌握了,提供相关经历,方便面试官切入询问。 162 | 3. 围绕算法岗展开技能阐述,从编程语言、到深度学习框架、到图像处理算法、服务器数据库存储图像等。 163 | 4. 只写岗位需要的技能,与算法岗不需要的硬件知识、组织能力等不要写,让简历更高匹配算法岗。 164 | 5. 掌握一种类别技能,只占一行,不要有的两行、有的一行,看着不整齐。 165 | 6. 面试官及HR会看着感觉整齐、可信、岗位匹配度高。 166 | 167 | 要知道,很多大公司HR经常一天要看几百份,甚至上千份简历,基本都是10秒内看一份简历。 168 | 169 | 就是这关键的10秒,HR就决定了是进入面试还是PASS。 170 | 171 | 我已经指导过上千位同学,即使市场大环境不好,很多同学都入职各家公司成功了。 172 | 173 | | 金九 内推第一名 | 银十 内推第一名 | 2024内推第一名 | 174 | | ------ | ------ | ------ | 175 | | ![eda6e9ca0f5ae0ca9da1dd193e17306](https://github.com/user-attachments/assets/e2f38221-3112-4c28-bf96-fa86fd82aa72)
|![21ad65da6049aed8a878b5f5c011d7a](https://github.com/user-attachments/assets/c5316cb3-0943-46a0-8c2d-8aed86ff5149)
| ![7849d9a28b4242737194a6d3e685688](https://github.com/user-attachments/assets/8316bf2e-55dc-482f-9631-3a19b7dfcd50)
| 176 | 177 | 一起沾沾喜气,好运是可以传染的~ 178 | 179 | 个人经验:拿offer最快的方式,就是不走弯路,在少量的时间,积累大量技能。 180 | 181 | (不要等到火烧眉毛,再来找我抢救.......) 182 | 183 | ------------------------------------------------------------- 184 | ------------------------------------------------------------- 185 | 186 | "♥我们读书是为了成为提灯人去照亮黑暗,而不是为了自己有灯而沾沾自喜还要去吹灭别人的蜡烛♥" 187 | --------------------------------------------------------------------------------