Tensoflow1.9图像处理基础
一、OpenCV
1.OpenCV介绍
- 计算机视觉处理开源软件库
- 由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,在诸多方面都有着卓越的表现:
- 编程语言:多数模块基于C++实现,少部分基于C语言实现,同时提供了Python、Ruby、MATLAB等语言的接口
- 跨平台:可自由地运行在Linux、Windows和Mac OS等桌面平台,Android、IOS、BlackBerray等移动平台
- 活跃的开发团队:目前已更新至OpenCV4.0
- 丰富的API:完善的传统计算机视觉算法,涵盖主流机器学习算法,同时添加了对深度学习的支持
2.OpenCV可完成的任务(几乎所有图像处理)
- 视频分析(Video analysis)
- 3D重建(3D reconstruction)
- 特征提取(Feature extraction)
- 目标检测(Object detection)
- 机器学习(Machine learning)
- 计算摄影(Computational photography)
- 形状分析(Shape analysis)
- 光流算法(Optical flow algorithms)
- 人脸和目标识别(Face and object recognition)
- 表面匹配(Surface matching)
- 文本检测和识别(Text detection and recognition)
3.3D重建
在计算机视觉中,三维重建是指根据单视图或者多视图的图像重建三维信息的过程
- 基于扫描的3D重建:比如CT,MRI扫描
- 基于红外的3D重建:比如微软发布的Kinect
- 基于2D图像的3D重建
4.计算摄影
- 计算摄影是计算机图形学,计算机视觉,光学和传感器等领域的交叉学科
- 计算摄影是指使用数字计算而不是光学处理的数字图像捕获和处理技术
- 计算摄影的典型应用包括:
- 图像风格化:
多次曝光合成图像(HDR)图像融合
自动图像拼接
大规模图像数据集信息挖掘
5.目标检测
目标检测可以识别一幅图像中的多个物体,定位不同物体的同时贴上相应的类别
目标检测要解决的核心问题是:
- 目标可能出现在图像的任何位置
- 目标有各种不同的大小目标可能有各种不同的形状
6.OpenCV模块介绍
- OpenCV提供了许多内置的用于图像处理和计算机视觉相关操作的基础数据结构,它们都包含在core模块中
- OpenCV包含的模块中,core、highgui、imgproc是最基础的模块
7.Opencv基本数据结构
- Mat类:矩阵元素.
- Point类:坐标点x和y
- Size类:尺寸,width和height
- Rect类:矩形的左上角坐标x和y以及宽width和高height
- Scalar类: RGB通道和alpha通道
- Vec类:向量,一维矩阵
- Range类:用于指定一个连续的子序列
二、图像读取、保存与显示
1.Numpy、OpenCV、Matplotlib安装
conda install numpy
conda install -c menpo opencv
conda install matplotlib
2.图像读取与保存
#载入Opencv库
import cv2
#图像读取
img = cv2.imread('sight.jpg')
#图片保存
cv2.imwrite('sight.jpg',img)
3.图像显示
#基本显示
from matplotlib import pyplot as plt
plt.imshow(img)
plt.show()
#调整图片大小
img1=cv2.imread('cat.jpg')
plt.figure(figsize=(8,6))
plt.imshow(img)
plt.show()
#设置坐标轴标签
plt.xlabel('x')
plt.ylabel('y')
#显示子图
plt.subplot(121)
plt.imshow(img1)
plt.subplot(122)
plt.imshow(img1)
plt.show()
#设置图标题
plt.title()
#设置坐标轴范围
plt.xlim(0,1200)
plt.ylim(1200,0)
#显示色彩对照表
plt.colorbar()
#显示风格设置
plt.style.use('seaborn-whitegrid')
三.图像格式转换
1.RGB颜色模型
- 三原色,肉眼可见的所有色彩均由这三种色彩混合叠加而成
- RGB的颜色混合方式就好像有红®、绿(G)、蓝(B)三盏灯相互叠合的时候,色彩相混,而亮度却等于加和
- 红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯"最弱—而在255时“灯"最亮
2.HSV色彩模型
- HSV是一种将RGB色彩空间中的点在倒圆锥体中表示的方法
- HSV即色相、饱和度、明度
- HSV颜色空间,更类似于人类感觉颜色的方式,封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?
3.HLS与HSV色彩模型
- HSV色彩模型(Hue色相, Saturation饱和度, Value明度)·HLS色彩模型(Hue色相, Lightness亮度, Saturation饱和度)
- 两者的意义大体一样,只是在饱和度,亮度的取值轴有不同的意义
4.YCrCb即YUV
- 与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽
- 其中“Y"表示明亮度,而“U"和"V”表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色
5.灰度图
任何颜色都有红、绿、蓝三原色组成,若某点的颜色为RGB(R,G,B),通过下面几种方法,可将其转换为灰度:
- 通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜RGB(Gray,Gray,Gray)替换原来的RGB(R,G,B),就得到灰度图了
- 灰度图舍弃了很多其它信息,保留了关键的梯度信息,在很多机器学习任务里有重要应用
#BGR转为灰度图
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#RGB转为BGR
cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
#RGB转为HSV
cv2.cvtColor(img,cv2.COLOR_RGB2HSV)
#BGR转为HLS
cv2.cvtColor(img,cv2.COLOR_BGR2HLS)
#BGR转为YCrCb
cv2.cvtColor(img,cv2.COLOR_RGB2YCrCb)
四、图像缩放、旋转与通道拆分
1.图像缩放与旋转
#图像缩放
cv2.resize(img,dsize=(800,600))#将图像缩放为800*600
#图像翻转
cv2.flip(img,flipCode=0)#以x轴为对称轴翻转
cv2.flip(img,flipCode=1)#以y轴为对称轴翻转
cv2.flip(img,flipCode=-1)#以x轴和y轴为对称轴翻转
2.通道拆分
由于OpenCV读取图片默认使用通道顺序为BGR,因此在通道拆分时的顺序为B,G,R
rgb = cv2.imread("RGB.png")
B,G,R=cv2.split(rgb)
plt.imshow(R)
plt.imshow(G)
plt.imshow(B)
3.图像通道重组
而Matplotlib的默认通道顺序为RGB,因此在重组时画图时按R,G,B的顺序即可
plt.imshow(cv2.merge([R,G,B]))
4.图像旋转
M=cv2.getRotationMatrix2D(((cols-1)/2.0,(rows-1)/2.0),45,0.75)#旋转中心的位置,顺时针旋转45度,图片比例缩放为原来的0.75
dst=cv2.warpAffine(rgb,M,(cols,rows))#旋转后图片大小不变
plt.imshow(dst)
五、直方图均衡化与边缘检测
1.直方图均衡化
- 图像处理领域中利用图像直方图对对比度进行调整的方法
- 把原始图的直方图变换为均匀分布的形式,从而增加了像素灰度值的动态范围,达到增强图像整体对比度的效果
#彩色图片直方图均衡化
B,G,R = cv2.split(rgb)
R2 = cv2.equalizeHist(R)
G2 = cv2.equalizeHist(G)
B2 = cv2.equalizeHist(B)
plt.imshow(cv2.merge([R2,G2,B2]))
2.边缘检测
- 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点
有许多用于边缘检测的方法,他们大致可分为两类:基于搜索和基于零交叉: - 基于搜索的边缘检测方法首先计算边缘强度,通常用一阶导数表示,然后计算估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值
- 基于零交叉的方法找到由图像得到的二阶导数的零交叉点来定位边缘,通常用拉普拉斯算子或非线性微分方程的零交叉点
#标识数字图像中亮度变化明显的点
cv2.Canny(image,threshold1,threshold2)#image:像素矩阵,threshold1,threshold2,阈值1和阈值2,用于进一步筛选边缘信息
plt.imshow(cv2.Canny(rgb,100,200))
六、实例
1.实例1
请按下列要求进行操作:
利用OpenCV对给定的图片做图片旋转,其中旋转中心为图片中心,顺时针旋转45度,图片比例缩放为原来的一半
利用OpenCV对旋转后的图片做图片缩放(缩放参数已给出)
将缩放后的图片的横轴标签和纵轴标签分别设置为’Length与Width,字体大小为15,并为其设置标题Dog,字体大小为20
# 导入必要的库
import cv2
import matplotlib.pyplot as plt
import pandas as pd
# 获取图片尺寸
img=cv2.imread('dog.jpg')
plt.imshow(img)
size = img.shape
cols = size[0]
rows = size[1]
# 创建大小为(10, 10)的图形,返回Figure对象img_new
img_new = plt.figure(figsize = (10, 10))
M = cv2.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0),45, 0.5)
fig = cv2.warpAffine(img, M, (cols, rows))
# 图像缩放
plt.imshow(cv2.cvtColor(cv2.resize(fig, dsize = (1000, 800)), cv2.COLOR_BGR2RGB))
# 设置横轴标签
plt.xlabel("Length",fontsize=15)
# 设置纵轴标签
plt.ylabel("Width",fontsize=15)
# 设置图标题
plt.title("Dog",fontsize=20)
plt.show()
2.实例2
请按下列要求进行操作:
利用OpenCV对给定的彩色图片做直方图均衡化
将均衡化后的图的标题设置为Panda,字体大小为15,并分别取消横轴与纵轴的刻度
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("panda.jpg")
plt.imshow(img)
B,G,R = cv2.split(img)
R2 = cv2.equalizeHist(R)
G2 = cv2.equalizeHist(G)
B2 = cv2.equalizeHist(B)
#plt.axis('off')
plt.xticks([])
plt.yticks([])
plt.title("Panda",fontsize=15)
plt.imshow(cv2.merge([R2,G2,B2]))