【python】图像数据预处理
安装cv2
pip install -i https://pypi.douban.com/simple opencv-python
1. 基本操作
(1)用opencv读取图像
代码
import cv2
# 读取一幅图像 第一个参数是图像路径
# 第二个参数代表读取方式,1表示3通道彩色,0表示单通道灰度
im = cv2.imread(r"emo1.jpg", 1)
# 在“test”窗口显示图像im
cv2.imshow("test", im)
# 等待用户按键反馈
cv2.waitKey()
(2)打印图像数据的类型和图像的尺寸
代码
# 打印图像数据的数据结构类型
print(type(im))
# 打印图像的尺寸
print(im.shape)
运行结果
输出了图像的数据类型和图像的尺寸,328×447×3表示是一个三通道的彩色图像。
(3)将图像保存到指定的路径
代码
# 将图像保存到指定路径
cv2.imwrite('emo.jpg', im)
返回True表示图像保存成功
2. 颜色空间转换
(1)彩色图像灰度化
使用opencv里的cvtColor将图像变成灰度图像,再显示这幅灰度图
代码
import cv2
im = cv2.imread(r"emo1.jpg")
cv2.imshow("Gray0", im)
# 使用opencv里的cvtColor进行颜色空间变化 cv2.COLOR_BGR2GRAY 代表 BGR to gray
img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray1", img_gray)
cv2.waitKey()
运行结果
这是原始图像
这是变换后的灰度图像
(2)更换三通道顺序BGR为RGB
可以转换三个通道的顺序,将一个BGR的彩色图像转换成一个RBG的彩色图像,同样调用的是opencv里的cvtColor
代码
import cv2
im = cv2.imread(r"emo1.jpg")
cv2.imshow("BRG", im)
# 使用opencv里的cvtColor进行颜色空间变化 cv2.COLOR_BGR2RGB 代表 BGR to RGB
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
#当图像数据为3通道时,imshow函数认为数据是BGR的
#使用imshow显示RGB数据,会发现图片显示颜色畸变
cv2.imshow("RGB", im_rgb)
cv2.waitKey()
运行结果
这是原始图像
这是图像转换后的一个结果
(3)BGR和HSV颜色空间转换
把一个BGR的图像转换成一个HSV的彩色图像
代码
import cv2
im = cv2.imread(r"emo1.jpg")
cv2.imshow("BRG", im)
# 使用opencv里的cvtColor进行颜色空间变化 cv2.COLOR_BGR2HSV 代表 BGR to HSV
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
#当图像数据为3通道时,imshow函数认为数据是BGR的
#使用imshow显示HSV数据,会将HSV分量强行当做BGR进行显示
cv2.imshow("RGB", im_rgb)
cv2.waitKey()
运行结果
这是原始图像
这是转换的结果
3. 坐标变换
(1)图像的平移
A.定义平移的函数
a.首先需要获取图像的一个尺寸
b.然后再定义平移的一个矩阵
c.再调用仿射变换的函数实现图像平移(需要指定三个参数,第一个是输入图像,第二个是平移矩阵,第三个是获取图像的一个尺寸)
B.调用定义的平移函数来对图像进行平移操作
代码
import numpy as np
import cv2
# 定义平移translate函数
def translate(img, x, y):#获取图像尺寸(h, w) = img.shape[:2]#定义平移矩阵M = np.float32([[1, 0, x], [0, 1, y]])#使用OpenCV仿射变换函数实现平移操作shifted = cv2.warpAffine(img, M, (w, h))#返回转换后的图像return shifted
# 加载图像并显示
im = cv2.imread("emo1.jpg")
cv2.imshow("Orig", im)
# 对原图做平移操作
# 下移50像素
shifted = translate(im, 0, 50)
cv2.imshow("Shift1", shifted)
# 左移100像素
shifted = translate(im, -100, 0)
cv2.imshow("Shift2", shifted)
# 右移50,下移100像素
shifted = translate(im, 50, 100)
cv2.imshow("Shift3", shifted)
cv2.waitKey()
运行结果
这是原始图像
这是不同的平移尺寸后的效果
(2)图像的旋转
A.定义一个旋转的函数
a.获取图像的尺寸
b.如果旋转中心值缺失的话,就把旋转中心定义为图像的中心
c.然后调用opencv当中的getRotationMatrix2D计算旋转矩阵
d.然后我们再用opencv当中的仿射变换函数实现旋转操作
代码
import numpy as np
import cv2
# 定义旋转rotate函数
def rotate(img, angle, center = None, scale = 0.7):# 获取图像尺寸(h, w) = img.shape[:2]# 旋转中心的缺失值为图像中心if center is None:center = (w/2, h/2)# 调用计算旋转矩阵函数M = cv2.getRotationMatrix2D(center, angle, scale)# 使用opencv仿射变换函数实现旋转操作rotated = cv2.warpAffine(img, M, (w, h))# 返回旋转后的图像return rotatedim = cv2.imread("emo1.jpg")
cv2.imshow("Orig", im)# 对原图像做旋转操作
# 逆时针45度
rotated = rotate(im, 45)
cv2.imshow("Rotatel", rotated)
# 顺时针20度
rotated = rotate(im, -20)
cv2.imshow("Rotate2", rotated)
# 逆时针90度
rotated = rotate(im, 90)
cv2.imshow("Rotate3", rotated)cv2.waitKey()
运行结果
这是原图
这是将图片逆时针旋转45度的效果
这是顺时针旋转45度的效果
这是将图片逆时针旋转90度的效果
(3)图像的镜像
调用opencv中的flip来实现图像镜像,需要传入两个参数,第一个参数是要读取的图像,第二个参数如果是零的话代表水平镜像,如果是一的话代表执行垂直镜像
代码
import numpy as np
import cv2
im = cv2.imread("emo1.jpg")
cv2.imshow("orig", im)
# 进行水平镜像
im_flip0 = cv2.flip(im, 0)
cv2.imshow("flip vertical", im_flip0)
# 进行垂直镜像
im_flip1 = cv2.flip(im, 1)
cv2.imshow("flip horizontal", im_flip1)cv2.waitKey()
运行结果
这是图像水平镜像和垂直镜像后的效果
(4)图像的缩放
实现缩放变换,首先要获取整个图像的一个尺寸,然后再定义目标缩放尺寸,用opencv里面的resize对图像进行缩放,需要实例化三个参数。第一个是需要缩放的图像,第二是播放后图像的尺寸,第三个是插值的方法,这里使用的是最邻近插值法,也可以用双线性插值法进行缩放。
代码
import numpy as np
import cv2
im = cv2.imread("emo1.jpg")
cv2.imshow("orig", im)
# 获取图像尺寸
(h, w) = im.shape[:2]
# 缩放的目标尺寸
dst_size = (200, 300)
# 最邻近插值
method = cv2.INTER_NEAREST
# 进行缩放
resized = cv2.resize(im, dst_size, interpolation = method)
cv2.imshow("resized1", resized)
# 缩放的目标尺寸
dst_size = (800,600)
# 双线性插值
method = cv2.INTER_LINEAR
# 进行缩放
resized = cv2.resize(im, dst_size, interpolation = method)
cv2.imshow("resized2", resized)cv2.waitKey()
运行结果
这是原始的图像
这是用最邻近插值法缩放后的图像
这是用双线性插值法缩放后的图像
4.灰度变换
首先定义一个线性灰度变换的函数,输入包括原始图像k值
(1)如果k的取值范围在0~1的范围内就对灰度值进行压缩
(2)如果k的取值范围大于1的话,就对灰度值进行拉伸
(3)如果k=-1且b=255的话,就对图像进行灰度反转
代码
import numpy as np
import cv2
from matplotlib import pyplot as plt#定义线性灰度变化函数
#k>1时实现灰度数值的拉伸
#0<k<1时实现灰度数值的压缩
#k=-l b=255 实现灰度反转
def linear_trans(img, k, b=0):#计算灰度线性变换的映射表trans_list = [(np.float32(x)*k+b) for x in range(256)]#将列表转换为np.arraytrans_table = np.array(trans_list)#将超过[0,245]灰度范围的数值进行调整,并指定数据类型为uint8trans_table[trans_table>255] = 255trans_table[trans_table<0] = 0trans_table = np.round(trans_table).astype(np.uint8)#使用opencv的look up table函数修改图像的灰度值return cv2.LUT(img, trans_table)
im = cv2.imread("emo1.jpg")
cv2.imshow("orig", im)
# 反转
im_inversion = linear_trans(im, -1, 255)
cv2.imshow("inversion", im_inversion)
# 灰度拉伸
im_stretch = linear_trans(im, 1.2)
cv2.imshow("garystrech", im_stretch)
# 灰度压缩
im_compress = linear_trans(im, 0.8)
cv2.imshow("graycompress", im_compress)cv2.waitKey()
运行结果
这是原始图像
这是我们对图像进行灰度压缩后的效果,可以看到图像的对比度降低了
这是灰度拉伸的效果,图像的对比度增强了
这是灰度反转的一个效果图
5. 伽玛变换
首先定义一个伽玛的变换函数,首先将图片当中的灰度值全都归一化到0-1的范围内,然后执行伽马变换,最后再将图像的灰度值恢复到0~255的范围之内
代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 定义伽马变化函数
def gamma_trans(img, gamma):#先归一化到1,做伽马计算,再还原到[0,255]gamma_list = [np.power(x/255.0, gamma) * 255 for x in range(256)]#将列表转换为np.array,并指定数据类型为uint8gamma_table = np.round(np.array(gamma_list)).astype(np.uint8)#使用opencv的look up table函数修改图像的灰度值return cv2.LUT(img, gamma_table)
im = cv2.imread("emo1.jpg", 0)
cv2.imshow("orig", im)
# 使用伽玛值为0.5的变化,实现对暗部的拉伸,亮部的压缩
img_gamma05 = gamma_trans(im, 0.5)
cv2.imshow("gamma0.5", img_gamma05)
# 使用伽玛值为2的变化,实现对暗部的压缩,亮部的拉伸
img_gamma2 = gamma_trans(im, 2)
cv2.imshow("gamma2", img_gamma2)cv2.waitKey()
运行结果
原始图像
这是通过伽玛等于0.5后的伽玛变化的结果,可以看到图像的暗部灰度值的动态范围是被拉伸了的,图像亮度灰度值的动态范围被压缩
这是做伽玛等于2的伽玛变化后的结果,可以看到亮部灰度值的动态范围被拉伸,而暗部灰度值的动态范围被压缩,所以整个画面会显得比较暗。
6. 基于直方图的灰度变化
可以用pyplot绘制图像的直方图,直方图当中灰度级的动态范围是从0~255,一共有256个灰度级。
代码
import cv2
from matplotlib import pyplot as plt
# 读取并显示图像
im = cv2.imread("emo1.jpg", 0)
cv2.imshow("orig", im)# 绘制灰度图像的直方图
plt.hist(im.ravel(), 256, [0,256])
plt.show()cv2.waitKey()
运行结果
这是原始图像以及原始图像对应的直方图
可以调用opencv当中的equalizeHist对图像进行直方图均衡化
代码
# import cv2
from matplotlib import pyplot as plt
im = cv2.imread("emo1.jpg", 0)
cv2.imshow("orig", im)# 调用opencv的直方图均衡化API
im_equl = cv2.equalizeHist(im)
cv2.imshow("equal", im_equl)# 显示原始图像的直方图
plt.subplot(2, 1, 1)
plt.hist(im.ravel(), 256, [0,256], label="orig")
plt.legend()# 显示均衡化图像的直方图
plt.subplot(2, 1, 2)
plt.hist(im_equl.ravel(), 256, [0,256], label="equalize")
plt.legend()
plt.show()cv2.waitKey()
运行结果
这是对原始图像进行直方图均值化后的图像
这是其对应的直方图,可以看到图像整个的对比度被增强了,暗处的一些细节信息更明显了
7. 图像滤波
(1)中值滤波器
可以调用opencv当中的medianBlur这个API对图像进行中值滤波。需要实例化两个参数,第一个是输入的图像,第二个是中值滤波器的大小,5代表中值滤波器的大小是5×5
代码
import cv2
import numpy as np
im = cv2.imread("dog.jpg")
cv2.imshow("orig", im)# 调用opencv的中值模糊API
im_medianblur = cv2.medianBlur(im, 5)cv2.imshow("median_blur",im_medianblur )cv2.waitKey()
运行结果
这是一个原图,可以看到原图里面是充满了噪声,这个噪声就是salt & pepper(椒盐噪声)。
这是对图像进行中值滤波后的效果
通过中值滤波之后,可以看到图像明显变得清晰了。这就是中值滤波的优点,它可以达到降噪的效果,同时可以保留原始图像的一个锐度。
(2)均值滤波器
A.我们调用opencv当中的blur这个API对图像进行均值滤波,均值滤波器的大小是3×3的
B.也可以自己定义一个均值算子,就需要创建一个矩阵,这里矩阵的大小是3×3,矩阵中的每一个元素都是1,最后对窗口当中的9个元素取均值,这就是均值算子。然后用opencv中的filter,用这个均值算子对图像进行均值滤波
代码
#方法一:直接调用opencv的API
import cv2
import numpy as np
im = cv2.imread("emo1.jpg")
cv2.imshow ("orig", im)
#调用opencv的均值模糊API
im_meanblur1 = cv2.blur(im, (3, 3))
cv2.imshow("mean_blur_1", im_meanblur1)
cv2.waitKey ()#方法二:使用均值算子和filter2D自定义滤波操作import cv2
import cv2
import numpy as np
im = cv2.imread("emo1.jpg")
cv2.imshow ("orig", im)
# 均值算子
mean_blur = np.ones([3,3], np.float32)/9
# 使用filter2D进行滤波操作
im_meanblur2 = cv2.filter2D(im, -1, mean_blur)
cv2.imshow("mean_blur_2", im_meanblur2)cv2.waitKey()
运行结果
这是原始图像
这是对图像进行均值滤波后的效果,可以看到图像明显变得模糊化了,这就是均值滤波的一个效果,它可以达到图像平滑的一个效果
(3)高斯滤波
A.可以直接调用opencv当中的GaussianBlur这个API对图像进行高斯滤波
代码
#方法一:直接调用opencv的API
import cv2
import numpy as np
im = cv2.imread("emo1.jpg")
cv2.imshow ("orig", im)# 调用opencv的高斯模糊API
im_gaussianblur1 = cv2.GaussianBlur(im, (5, 5), 0)
cv2.imshow("gaussian_blur_1", im_gaussianblur1)cv2.waitKey()
运行结果
B.也可以自己建一个高斯filter,然后用opencv当中filter2D对图像进行滤波
代码
#方法二:使用高斯算子和filter2D自定义滤波操作
import cv2
import numpy as npim = cv2.imread("emo1.jpg")
cv2.imshow ("orig", im)# 高斯算子
gaussian_blur = np.array([[1, 4, 7, 4, 1],[4, 16 , 26, 16, 4],[7, 26, 41, 26, 7],[4, 16 , 26, 16, 4],[1, 4, 7, 4, 1]],np.float32)/273
# 使用filter2D进行滤波操作
im_gaussianblur2 = cv2.filter2D(im, -1, gaussian_blur)
cv2.imshow("gaussian_blur_2", im_gaussianblur2)
运行结果
相较于刚才均值滤波器的效果,如果用高斯滤波的话,可以一定程度的减少图像的模糊化
(4)锐化
图像的锐化分为两个步骤,第一是对图像进行边缘检测,第二步是原始图像乘以一定的系数然后再加上边缘检测后的效果图。锐化算子一般分为基于一阶梯度的和基于二阶梯度的。基于一阶梯度的锐化算子最典型的就是Sobel梯度算子,基于二阶梯度的锐化算子最典型的就是拉普拉斯算子。
这里我们建立的两个锐化算子都是二阶的锐化算子
代码
import cv2
import numpy as npim = cv2.imread("emo1.jpg")
cv2.imshow ("orig", im)# 锐化算子
sharpen_1 = np.array([[-1, -1, -1],[-1, 9, -1],[-1, -1, -1]
])
# 使用filter2D进行滤波操作
im_sharpen_1 = cv2.filter2D(im, -1, sharpen_1)
cv2.imshow("sharpen_1", im_sharpen_1)# 锐化算子3
sharpen_2 = np.array([[0, -1, 0],[-1, 8, -1],[0, 1, 0]])/4.0# 使用filter2D进行滤波操作
im_sharpen_2 = cv2.filter2D(im, -1, sharpen_2)
cv2.imshow("sharpen_2", im_sharpen_2)cv2.waitKey()
运行结果
这是原始图像
这是图像锐化后的一个效果
这是用第二个锐化算进行图像液化后的果,可以观察到第二个锐化算子最后有一个除以四的过程,就可以增加图像的一个模糊化。
【python】图像数据预处理相关推荐
- python图片保存和图片展示顺序_【IT专家】【 python 】 —— 数据预处理:(1) 读取与显示图片 + 图像通道顺序变换...
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 [ python ] -- 数据预处理: (1) 读取与显示图片 + 图像通道顺 序变换 2018/05/31 29 # ---- 用 OPENC ...
- 【Tool】Augmentor和imgaug——python图像数据增强库
Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...
- python图像增强_【Tool】Augmentor和imgaug——python图像数据增强库
Augmentor和imgaug--python图像数据增强库 Tags: ComputerVision Python 介绍两个图像增强库:Augmentor和imgaug,Augmentor使用比较 ...
- 图片情感分析(1):图像数据预处理
图片情感分析,重点是颜色特征的提取,将每一个像素点的颜色特征转换成一个值,最终效果是把一个图片转换成一个二维矩阵,矩阵中每一个值都代表该像素点的颜色特征.概括来说就是将每个像素点的RGB值转换为HSV ...
- Python数据分析数据预处理特征值独热编码
[小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python数据分析 数据预处理 特征值独热编码 独热编码,是一种将分类变量转换为若干二进制 ...
- TensorFlow 图像数据预处理及可视化
图像是人们喜闻乐见的一种信息形式,"百闻不如一见",有时一张图能胜千言万语.图像处理是利用计算机将数值化的图像进行一定(线性或非线性)变换获得更好效果的方法.Photoshop,美 ...
- Python数据挖掘 数据预处理案例(以航空公司数据为例)
Python数据预处理 一.内容: 1.数据清洗 2.数据集成 3.数据可视化 二.实验数据 根据航空公司系统内的客户基本信息.乘机信息以及积分信息等详细数据,依据末次飞行日期( LAST_FLIGH ...
- Python数据分析-数据预处理
数据预处理 文章目录 数据预处理 1.前言 2.数据探索 2.1缺失值分析 2.2 异常值分析 2.2.1 简单统计量分析 2.2.2 3$\sigma$原则 2.2.3 箱线图分析 2.3 一致性分 ...
- python文本数据处理_从 App 描述介绍文字中发掘 Python 文本数据预处理实例
本文为 AI 研习社编译的技术博客,原标题 What App Descriptions Tell Us: Text Data Preprocessing in Python,作者为 Finn Qiao ...
最新文章
- mybatis整合ehcache
- 使用ASP.NET MVC 2编程时遇到的两个小问题
- jq获取after和before伪类的content值
- 浏览器复制粘贴以及手机端webview复制粘贴
- 前端学习(763):变量属性函数方法的区别
- 人月聊IT:对业务系统的可扩展性设计思考
- 成功与不成功并非智商差别:男人,如何唤醒心灵的巨人
- 物联网-移远M26模块OpenCPU开发第1讲
- Linux下编译安装qemu和libvirt
- Redis学习记录之Java中的初步使用
- 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置...
- 20161129 计算95除以55,商是多少,余数是多少?(商和余数要求分两行显示)
- 捷联惯导基础知识解析之二(捷联惯导更新算法和误差方程)
- 还在浪费时间创建工程图?6分钟教你自定义SOLIDWORKS工程图模板
- cad怎样弄出放线的坐标_怎么把图纸上的坐标输入CAD详细步骤?
- android 手机型号获取root,Android用代码获取手机root之后的最高权限
- 免费域名邮箱如何申请?怎么给国外发邮件?
- Excel/WPS 按条件合并多行
- Swing关于JButton的文本和图片之间间距调整的问题纪要!
- JavaScript实时获取现货黄金,白银,美元指数价格代码
热门文章
- matlab app designer夫琅禾费单缝衍射、光栅衍射仿真
- volatile和synchronized有什么区别
- dell进入u盘启动模式_调整戴尔电脑硬盘模式设置U盘第一启动
- javascript网站期末作品~html电影资讯博客网站模板(HTML+CSS+JavaScript)在线电影网页设计
- 机器学习笔记:支持向量机(SVM)详细推导以及sklearn.svm.SVC的简单简介
- matlab 生成lte信号,【求助】LTE PRS基带信号到射频信号如何做?具体代码如下
- 学堂在线_操作系统_notes_第0-2讲_OS概述、OS实验环境准备
- 对国内ASP应用不乐观
- 光影魔术手-批量-修改图片大小-小于1000k
- 关于重写toString方法