四、图像预处理

作者:Chris Albon

译者:飞龙

协议:CC BY-NC-SA 4.0

图像二值化

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image_grey = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 应用自适应阈值
max_output_value = 255
neighorhood_size = 99
subtract_from_mean = 10
image_binarized = cv2.adaptiveThreshold(image_grey, max_output_value, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, neighorhood_size, subtract_from_mean)# 展示图像
plt.imshow(image_binarized, cmap='gray'), plt.axis("off")
plt.show()

图像模糊

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 使图像模糊
image_blurry = cv2.blur(image, (5,5))# 展示图像
plt.imshow(image_blurry, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.show()

图像剪裁

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 选择所有行,和前一半的列
image_cropped = image[:,:126]# 查看图像
plt.imshow(image_cropped, cmap='gray'), plt.axis("off")
plt.show()

边缘检测

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image_gray = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 计算强度中值
median_intensity = np.median(image_gray)# 将阈值设为强度中值上下一个标准差
lower_threshold = int(max(0, (1.0 - 0.33) * median_intensity))
upper_threshold = int(min(255, (1.0 + 0.33) * median_intensity))# 应用 canny 边缘检测
image_canny = cv2.Canny(image_gray, lower_threshold, upper_threshold)# 展示图像
plt.imshow(image_canny, cmap='gray'), plt.axis("off")
plt.show()

增强彩色图像的对比度

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 加载图像
image_bgr = cv2.imread('images/plane.jpg')# 转换为 YUV
image_yuv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2YUV)# 应用直方图均衡
image_yuv[:, :, 0] = cv2.equalizeHist(image_yuv[:, :, 0])# 转换为 RGB
image_rgb = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2RGB)# 展示图像
plt.imshow(image_rgb), plt.axis("off")
plt.show()

增强灰度图像的对比度

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 增强图像
image_enhanced = cv2.equalizeHist(image)# 展示图像
plt.imshow(image_enhanced, cmap='gray'), plt.axis("off")
plt.show()

Harris 角点检测

Harris 角点检测器是检测两个边缘角点的常用方法。 它寻找窗口(也称为邻域或补丁),其中窗口的小移动(想象摇动窗口)使窗口内的像素内容产生大的变化。

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image_bgr = cv2.imread('images/plane_256x256.jpg')
image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)
image_gray = np.float32(image_gray)# 设置角点检测器的参数
block_size = 2
aperture = 29
free_parameter = 0.04# 检测角点
detector_responses = cv2.cornerHarris(image_gray, block_size, aperture, free_parameter)# 大型角点标记器
detector_responses = cv2.dilate(detector_responses, None)# 只保留大于阈值的检测器结果,标记为白色
threshold = 0.02
image_bgr[detector_responses > threshold * detector_responses.max()] = [255,255,255]# 转换为灰度
image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)# 展示图像
plt.imshow(image_gray, cmap='gray'), plt.axis("off")
plt.show()

安装 OpenCV

虽然有许多好的库,OpenCV 是最受欢迎和文档最全的图像处理库。 使用 OpenCV 的最大障碍之一就是安装它。 但是,幸运的是,我们可以使用 Anaconda 的软件包管理器工具 conda,在我们的终端中用一行代码安装 OpenCV:

conda install --channel https://conda.anaconda.org/menpo opencv3

之后,我们可以通过打开笔记本,导入 OpenCV 并检查版本号(3.1.0)来检查安装:

# 加载库
import cv2# 查看版本号
cv2.__version__# '3.2.0'

颜色隔离

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 加载图像
image_bgr = cv2.imread('images/plane_256x256.jpg')# 将 BGR 转换为 HSV
image_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV)# 定义 HSV 中蓝色值的范围
lower_blue = np.array([50,100,50])
upper_blue = np.array([130,255,255])# 创建遮罩
mask = cv2.inRange(image_hsv, lower_blue, upper_blue)# 屏蔽图像
image_bgr_masked = cv2.bitwise_and(image_bgr, image_bgr, mask=mask)# 将 BGR 转换为 RGB
image_rgb = cv2.cvtColor(image_bgr_masked, cv2.COLOR_BGR2RGB)# 展示图像
plt.imshow(image_rgb), plt.axis("off")
plt.show()

加载图像

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane.jpg', cv2.IMREAD_GRAYSCALE)# 展示图像
plt.imshow(image, cmap='gray'), plt.axis("off")
plt.show()

# 加载彩色图像
image_bgr = cv2.imread('images/plane.jpg', cv2.IMREAD_COLOR)# 转换为 RGB
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)# 展示图像
plt.imshow(image_rgb), plt.axis("off")
plt.show()

# 展示图像数据
image'''
array([[140, 136, 146, ..., 132, 139, 134],[144, 136, 149, ..., 142, 124, 126],[152, 139, 144, ..., 121, 127, 134],..., [156, 146, 144, ..., 157, 154, 151],[146, 150, 147, ..., 156, 158, 157],[143, 138, 147, ..., 156, 157, 157]], dtype=uint8)
'''# 展示维度
image.shape# (2270, 3600)

背景移除

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 加载图像
image_bgr = cv2.imread('images/plane_256x256.jpg')# 转换为 RGB
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)# 矩形值:起点 x,起点 y,宽度,高度
rectangle = (0, 56, 256, 150)# 创建初始遮罩
mask = np.zeros(image_rgb.shape[:2], np.uint8)# 创建用于 grabCut 的临时数组
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)# 执行 grabCut
cv2.grabCut(image_rgb, # 我们的图像mask, # 遮罩rectangle, # 我们的矩形bgdModel, # 用于背景的临时数组fgdModel, # 用于前景的临时数组5, # 迭代数量cv2.GC_INIT_WITH_RECT) # 使用我们的矩形来初始化# 创建遮罩,其中背景设置为 0,否则为 1
mask_2 = np.where((mask==2) | (mask==0), 0, 1).astype('uint8')# 使用新的遮罩移除多个图像的背景
image_rgb_nobg = image_rgb * mask_2[:, :, np.newaxis]# 展示图像
plt.imshow(image_rgb_nobg), plt.axis("off")
plt.show()

保存图像

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane.jpg', cv2.IMREAD_GRAYSCALE)# 展示图像
plt.imshow(image, cmap='gray'), plt.axis("off")
plt.show()

# 保存图像
cv2.imwrite('images/plane_new.jpg', image)# True

图像锐化

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为灰度
image = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_GRAYSCALE)# 创建核
kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])# 锐化图像
image_sharp = cv2.filter2D(image, -1, kernel)# 展示图像
plt.imshow(image_sharp, cmap='gray'), plt.axis("off")
plt.show()

Shi-Tomasi 角点检测

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 加载图像
image_bgr = cv2.imread('images/plane_256x256.jpg')
image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)# 要检测的角点数量
corners_to_detect = 10
minimum_quality_score = 0.05
minimum_distance = 25# 检测角点
corners = cv2.goodFeaturesToTrack(image_gray, corners_to_detect, minimum_quality_score,minimum_distance)
corners = np.float32(corners)# 在每个角点上绘制白色圆圈
for corner in corners:x, y = corner[0]cv2.circle(image_bgr, (x,y), 10, (255,255,255), -1)# 转换为灰度
image_gray = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2GRAY)# 展示图像
plt.imshow(image_gray, cmap='gray'), plt.axis("off")
plt.show()

使用颜色均值作为特征

# 加载库
import cv2
import numpy as np
from matplotlib import pyplot as plt# 将图像加载为 BGR
image_bgr = cv2.imread('images/plane_256x256.jpg', cv2.IMREAD_COLOR)# 计算每个通道的均值
channels = cv2.mean(image_bgr)# 交换蓝色和红色值(使其变成 RGB 而不是 BGR)
observation = np.array([(channels[2], channels[1], channels[0])])# 展示通道的均值
observation# array([[  90.53204346,  133.11735535,  169.03074646]]) # 展示图像
plt.imshow(observation), plt.axis("off")
plt.show()

数据科学和人工智能技术笔记 四、图像预处理相关推荐

  1. 数据科学和人工智能技术笔记 十三、树和森林

    十三.树和森林 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 Adaboost 分类器 # 加载库 from sklearn.ensemble import AdaB ...

  2. 数据科学和人工智能技术笔记 十二、逻辑回归

    十二.逻辑回归 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 C 超参数快速调优 有时,学习算法的特征使我们能够比蛮力或随机模型搜索方法更快地搜索最佳超参数. sci ...

  3. 数据科学和人工智能技术笔记 九、模型验证

    九.模型验证 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 准确率 # 加载库 from sklearn.model_selection import cross_v ...

  4. 数据科学和人工智能技术笔记 七、特征工程

    七.特征工程 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 稀疏特征矩阵上的降维 # 加载库 from sklearn.preprocessing import St ...

  5. 数据科学和人工智能技术笔记 十、模型选择

    十.模型选择 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 在模型选择期间寻找最佳预处理步骤 在进行模型选择时,我们必须小心正确处理预处理. 首先,GridSearc ...

  6. 数据科学和人工智能技术笔记 十四、K 最近邻

    十四.K 最近邻 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 确定 K 的最佳值 # 加载库 from sklearn.neighbors import KNeig ...

  7. 数据科学和人工智能技术笔记 二、数据准备

    二.数据准备 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 从字典加载特征 from sklearn.feature_extraction import DictVe ...

  8. 数据科学和人工智能技术笔记 十五、支持向量机

    十五.支持向量机 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 校准 SVC 中的预测概率 SVC 使用超平面来创建决策区域,不会自然输出观察是某一类成员的概率估计. ...

  9. 数据科学和人工智能技术笔记 三、数据预处理

    三.数据预处理 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 为 Scikit-Learn 转换 Pandas 类别数据 # 导入所需的库 from sklearn ...

最新文章

  1. unity编辑器扩展_01(在工具栏中创建一个按钮)
  2. 响应文件是不是标书_什么是标书?投标书有哪些分类?标书和投标书的不同?...
  3. 华为云网络覆盖全球2500+站点,打造高品质、低成本接入体验
  4. HTML里Dom onload和jQuery document ready这两个事件的区别
  5. python3文件的编码类型是什么_python3.x - 怎么查看某个文件的编码方式?python
  6. oracle系统实验,实验1 启动Oracle系统
  7. 客户端请求时间和服务端处理时间不匹配问题
  8. KMP算法——从入门到懵逼到了解
  9. linux get current thread count and system threads limit
  10. java中之内存溢出说明
  11. 深入理解Git (三) - 微命令上篇
  12. PuTTY 私钥'putty/sshdss.c' 多个信息泄露漏洞
  13. php默认登录文件,PHP 网站修改默认访问文件的nginx配置
  14. MINIEYE完成B轮融资,四维图新基金战略领投
  15. Linux中KVM虚拟机是什么
  16. linux nginx源码安装
  17. Java POI PPT 转 PNG 图片设置背景色失效
  18. MovieClip序列帧动画 视频教程
  19. win7浏览器主页修改不过来_win7无法修改ie浏览器主页的解决方法
  20. 在DeSmuME模拟器上成功运行AK2i的内核,破解AK2i命令集

热门文章

  1. (12)Verilog HDL变量:reg型
  2. python主函数入口_python类 + mian()函数
  3. 网络爬虫python的特点有哪些_为什么写网络爬虫天然就是择Python而用
  4. 【嵌入式Linux】嵌入式Linux应用开发基础知识之网络通信
  5. ARM汇编指令:LDR伪指令和LDR装载指令的区别
  6. Leetcode - 143. Reorder List
  7. java5新特性_5分钟了解Java 12 八大新特性
  8. bootstrap 垂直居中 布局_网页布局都有哪种?一般都用什么布局?
  9. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列
  10. 如果对象的引用被置为null,;垃圾回收器是否会立即释放对象占用的内存?