系列文章目录
前言
提示:这里可以添加本文要记录的大概内容:
图像变换是指通过技术手段将图像转换为另一幅图像,如色彩空间变换、几何变换、图像模糊、阈值处理和形态变换等。
提示:以下是本篇文章正文内容,下面案例可供参考
一、4.1 色彩空间变换
- #test4-1.py 将BGR色彩空间转换为RGB色彩空间
#test4-1.py 将BGR色彩空间转换为RGB色彩空间
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('BGR',img) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换色彩空间为RGB
cv2.imshow('RGB',img2) #显示图像
cv2.waitKey(0)
- #test4-2.py:BGR色彩空间转换为GRAY色彩空间
#test4-2.py:BGR色彩空间转换为GRAY色彩空间
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('BGR',img) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换色彩空间为GRAY
cv2.imshow('GRAY',img2) #显示图像
cv2.waitKey(0)
- #test4-3.py:BGR色彩空间转换为YCrCb色彩空间
3.1 YCrCb概念
YCrCb即YUV,主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
3.2应用
在人脸检测中也常常用到YCrCb空间,因为一般的图像都是基于RGB空间的,在RGB空间里人脸的肤色受亮度影响相当大,所以肤色点很难从非肤色点中分离出来,也就是说在此空间经过处理后,肤色点是离散的点,中间嵌有很多非肤色,这为肤色区域标定(人脸标定、眼睛等)带来了难题。如果把RGB转为YCrCb空间的话,可以忽略Y(亮度)的影响,因为该空间受亮度影响很小,肤色会产生很好的类聚。这样就把三维的空间降为二维的CrCb,肤色点会形成一定得形状,如:人脸的话会看到一个人脸的区域,手臂的话会看到一条手臂的形态,对处理模式识别很有好处,根据经验某点的CrCb值满足:133≤Cr≤173,77≤Cb≤127 那么该点被认为是肤色点,其他的就为非肤色点。【参考RGB和YCrCb】
#test4-3.py:BGR色彩空间转换为YCrCb色彩空间
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('BGR',img) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb) #转换色彩空间为YCrCb
cv2.imshow('YCrCb',img2) #显示图像
cv2.waitKey(0)
- #test4-4.py:BGR色彩空间转换为HSV色彩空间
HSV色彩空间
色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
明度(V),亮度(L),取0-100%。
【参考:HSV色彩空间】
#test4-4.py:BGR色彩空间转换为HSV色彩空间
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('BGR',img) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #转换色彩空间为HSV
cv2.imshow('HSV',img2) #显示图像
cv2.waitKey(0)
二、4.2 几何变换
几何变换是指对图像执行放大、缩小、旋转等各种操作。
- 缩放图像
#test4-5.py:缩放图像
import cv2
img=cv2.imread('bee.jpg') #读取图像
sc=[1,0.2,0.5,1.5,2] #设置缩放比例
cv2.imshow('showimg',img) #显示图像
while True:
key=cv2.waitKey() #delay = 0:持续无限长的时间,delay >0:持续多少毫秒delay <0:等待键盘按键,任何一个按键都会关闭程序
if 48<=key<=52: #按键【0】、【1】、【2】、【3】或【4】
x=y=sc[key-48] #获得缩放比例
img2=cv2.resize(img,None,fx=x,fy=y) #缩放图像 dsize=None 目标图像高度=原始图像*fx
cv2.imshow('showimg',img2) #显示图像
- 翻转
#test4-6.py:翻转图像
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('showimg',img) #显示图像
img2=cv2.flip(img,0)
cv2.imshow('绕X轴垂直翻转',img2) #绕X轴垂直翻转
img3=cv2.flip(img,1)
cv2.imshow('绕y轴水平翻转',img3) #绕y轴水平翻转
img4=cv2.flip(img,-1)
cv2.imshow('水平、垂直翻转',img4) #水平、垂直翻转
key=cv2.waitKey(0)
- 仿射
3.1 平移
平移是指将图像沿水平或垂直方向移动一定像素。
#test4-7.py:图像向左移动100像素,向下移动50像素
import cv2
import numpy as np
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('img',img) #显示图像
height=img.shape[0] #获得图像高度
width=img.shape[1] #获得图像宽度
dsize=(width,height)
m=np.float32([[1,0,100],[0,1,50]])#创建转换矩阵
img2=cv2.warpAffine(img,m,dsize) #平移图像
cv2.imshow('imgx+100y+50',img2) #显示图像
cv2.waitKey(0)
3.2 缩放
缩放矩阵M=[[h,0,0],[0,v,0]
#test4-8.py:图像缩放
import cv2
import numpy as np
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('img',img) #显示图像
height=img.shape[0] #获得图像高度
width=img.shape[1] #获得图像宽度
dsize=(width,height)
m=np.float32([[0.5,0,0],[0,0.5,0]])#创建转换矩阵 缩放矩阵M=[[h,0,0],[0,v,0]
img2=cv2.warpAffine(img,m,dsize) #执行缩放
cv2.imshow('img0.5x+0.5y',img2) #显示图像
cv2.waitKey(0)
3.3 旋转
#test4-9.py:图像旋转
import cv2
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('img',img) #显示图像
height=img.shape[0] #获得图像高度
width=img.shape[1] #获得图像宽度
dsize=(width,height)
m=cv2.getRotationMatrix2D((width/2,height/2), -60, 0.5)#创建转换矩阵 (ceter,angle,scale) angele负数表示顺时针旋转
img2=cv2.warpAffine(img,m,dsize) #执行旋转
cv2.imshow('imgRotation',img2) #显示图像
cv2.waitKey(0)
3.4 三点映射变换
将图像转换为任意的平行四边形
#test4-10.py:图像的三点映射变换
import cv2
import numpy as np
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('img',img) #显示图像
height=img.shape[0] #获得图像高度
width=img.shape[1] #获得图像宽度
dsize=(width,height)
src=np.float32([[0,0],[width-10,0],[0,height-1]])#取原图像中三个点
dst=np.float32([[50,50],[width-100,80],[100,height-100]])#设置三点在目标图像中的坐标
m = cv2.getAffineTransform(src, dst)#创建转换矩阵
img2=cv2.warpAffine(img,m,dsize) #执行转换
cv2.imshow('imgThreePoint',img2) #显示图像
cv2.waitKey(0)
3.4 透视
#test4-11.py:图像的透视变换
import cv2
import numpy as np
img=cv2.imread('bee.jpg') #读取图像
cv2.imshow('img',img) #显示图像
height=img.shape[0] #获得图像高度
width=img.shape[1] #获得图像宽度
dsize=(width,height)
src=np.float32([[0,0],[width-10,0],
[0,height-10],[width-1,height-1]])#取原图像中四个点
dst=np.float32([[50,50],[width-50,80],
[50,height-100],[width-100,height-10]])#设置四点在目标图像中的坐标
m = cv2.getPerspectiveTransform(src, dst)#创建转换矩阵
img2=cv2.warpPerspective(img,m,dsize)#执行转换
cv2.imshow('imgFourPoint',img2) #显示图像
cv2.waitKey(0)
三、4.3 图像模糊
1. 均值滤波
卷积核为3x3
卷积核为5x5
卷积核为21x21
代码如下:
#test4-12.py:均值滤波
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.blur(img,(21,21)) #可调整卷积核大小查看不同效果
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)
高斯滤波
#test4-13.py:高斯滤波
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.GaussianBlur(img,(3,3),0,0)#可调整卷积核大小查看不同效果
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)
3.方框滤波
归一化
未归一化
未归一化时,滤波结果得到的像素值可能会超过允许的最大值,从而被截断为最大值,这时就会得到一副白色图像。(也就是说,未归一化时,滤波结果为像素值之和,可能会超过255,超过截断为255,那就是白色图像)
4.中值滤波
#test4-15.py:中值滤波
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.medianBlur(img,5)#可调整卷积核大小查看不同效果
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)
5. 双边滤波
#test4-16.py:双边滤波
import numpy as np
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.bilateralFilter(img,50,50,50)#可调整参数查看不同效果
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)
6. 2D卷积
#test4-17.py:2D卷积
import numpy as np
import cv2
img=cv2.imread('lena2.jpg')
k1=np.array([[3,3,3,3,3],
[3,9,9,9,3],
[3,11,12,13,3],
[3,8,8,8,3],
[3,3,3,3,3],])/25#自定义卷积核1
k2=np.ones((5,5),np.float32)/25#自定义卷积核2 1填充数组
img2=cv2.filter2D(img,-1,k1)
cv2.imshow('imgK1',img2)
img2=cv2.filter2D(img,-1,k2)
cv2.imshow('imgK2',img2)
cv2.waitKey(0)
7.阈值处理
#test4-18.py:二值化阈值处理
import cv2
img=cv2.imread('bee.jpg')
cv2.imshow('img',img)
ret,img2=cv2.threshold(img,150,255,cv2.THRESH_BINARY)#阈值处理
cv2.imshow('imgTHRESH_BINARY',img2)
cv2.waitKey(0)
9.反二值化阈值处理
#test4-19.py:反二值化阈值处理
import cv2
img=cv2.imread('bee.jpg')
cv2.imshow('img',img)
ret,img2=cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)#阈值处理
cv2.imshow('imgTHRESH_BINARY_INV',img2)
cv2.waitKey(0)
10. 截断阈值处理
#test4-20.py:截断阈值处理
import cv2
img=cv2.imread('bee.jpg')
cv2.imshow('img',img)
ret,img2=cv2.threshold(img,150,255,cv2.THRESH_TRUNC)#阈值处理
cv2.imshow('imgTHRESH_TRUNC',img2)
cv2.waitKey(0)
11. 超阈值零处理
#test4-21.py:超阈值零处理
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
ret,img2=cv2.threshold(img,100,255,cv2.THRESH_TOZERO_INV)#超阈值0处理
cv2.imshow('imgTHRESH_TOZERO_INV',img2)
cv2.waitKey(0)
12.低阈值零处理
#test4-22.py:低阈值零处理
import cv2
img=cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
ret,img2=cv2.threshold(img,150,255,cv2.THRESH_TOZERO)#低阈值0处理
cv2.imshow('imgTHRESH_TOZERO',img2)
cv2.waitKey(0)
五、 4.5 形态变换
1.腐蚀
OpenCV-腐蚀cv::erode
迭代1次
迭代5次
通过腐蚀操作,图像的边界被侵蚀,白色区域缩小。
#test4-26.py:腐蚀
import cv2
import numpy as np
img=cv2.imread('zh2.jpg') #读取图像
cv2.imshow('img',img) #显示原图像
kernel = np.ones((5,5),np.uint8) #定义5×5核心
img2 = cv2.erode(img,kernel,iterations = 1) #腐蚀,迭代1次
#InputArray类型的src,输入图像,如Mat类型。
#OutputArray类型的dst,输出图像。
#InputArray类型的kernel,腐蚀操作的内核也就是上面所说的蒙版。为NULL时,默认表示以参考点为中心3*3的核。一般配合函数getStructuringElement使用,该函数可以构造一个指定形状和尺寸的蒙版。
#Point类型的anchor,锚点。默认值(-1,-1),表示位于单位中心,一般不用。
#int类型的iterations,迭代使用的次数,默认值为1。
#int类型的borderType,推断图像外部像素的边界模式,我OpenCV版本的默认值为BORDER_CONSTANT。如果图像边界需要扩展,则不同的模式下所扩展的像素,其生成原则不同。
#const Scalar&类型的borderValue,当边界为常数时的边界值,默认值为morphologyDefaultBorderValue()。
img3 = cv2.erode(img,kernel,iterations = 5) #迭代5次
cv2.imshow('img2_1',img2) #迭代1次结果
cv2.imshow('img2_5',img3) #迭代5次结果
cv2.waitKey(0)
2.膨胀
#test4-27.py:膨胀
import cv2
import numpy as np
img=cv2.imread('zh.jpg') #读取图像
cv2.imshow('img',img) #显示原图像
kernel = np.one((5,5),np.uint8) #定义5×5核心
img2 = cv2.dilate(img,kernel,iterations = 2) #膨胀,迭代2次
#src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
# dst:膨胀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
# kernel:用于膨胀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
# anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
# iterations:膨胀的次数,默认值为1。
# borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
# borderValue:使用边界不变外推法时的边界值。
cv2.imshow('img2',img2) #显示转换结果图像
cv2.waitKey(0)
3.开运算
对图像先执行腐蚀操作,再对腐蚀的结果执行膨胀操作
#test4-28.py:开运算
#对图像先执行腐蚀操作,再对腐蚀的结果执行膨胀操作
import cv2
import numpy as np
img=cv2.imread('zh2.jpg') #读取图像
cv2.imshow('img',img) #显示原图像
kernel = np.ones((5,5),np.uint8) #定义5×5核心
op=cv2.MORPH_OPEN #设置形态操作类型
img2 = cv2.morphologyEx(img,op,kernel,iterations=2) #形态操作,迭代2次
cv2.imshow('img2',img2) #显示转换结果图像
cv2.waitKey(0)
4.闭运算
#与开运算相反,先对图像执行膨胀操作,再对膨胀的结果执行腐蚀操作
#test4-29.py:闭运算
#与开运算相反,先对图像执行膨胀操作,再对膨胀的结果执行腐蚀操作
import cv2
import numpy as np
img=cv2.imread('zh.jpg') #读取图像
cv2.imshow('img',img) #显示原图像
kernel = np.ones((5,5),np.uint8) #定义5×5核心
op=cv2.MORPH_CLOSE #设置形态操作类型
img2 = cv2.morphologyEx(img,op,kernel,iterations=5) #形态操作,迭代5次
cv2.imshow('img2',img2) #显示转换结果图像
cv2.waitKey(0)
第4章实验1图像几何变换
#实验1 图像几何变换 旋转和缩放
import cv2
img = cv2.imread('clocktower.png')
cv2.imshow('showing',img)
h=img.shape[0] #读取到原图的高度
w=img.shape[1] #读取到原图的宽度 img.shape[2] ? 通道
angle = 1 #设置旋转的角度
scale = 1 #设置缩放比例
f = -1 #设置一个变量f=-1,f的作用就是控制缩放比例
while True:
m = cv2.getRotationMatrix2D((w/2,h/2),-angle,scale+f*0.1) #创建转换矩阵,以原图中心进行旋转
#顺时针选择 -angle
#缩放比例设置 第一次:1+(-1)*0.1=1-0.1=0.9
#第二次:
angle = (angle+10)%360 #设置选择角度
scale = scale+f*0.1 #计算下一个缩放比例 <0.1 0.05+0.1=0.15
if scale<=0.1 or scale >=1: #让缩放比例在10%~100%之间,通过变量f实现
f=f*(-1) # f是为了控制缩放
img2 = cv2.warpAffine(img,m,(w,h)) #执行旋转操作
key = cv2.waitKey(100) #设置0.1s
if key == 27:
break
cv2.imshow('showing',img2)
cv2.destroyWindow() #关闭窗口
实验2:图像形态变换
#实验2 开运算 先腐蚀再膨胀
import cv2
import numpy as np
img = cv2.imread('AB.png')
cv2.imshow('img',img)
kernel = np.ones((5,5),np.uint8) #利用numpy数组里面的ones()函数创建5x5的内核,内核全是1
op = cv2.MORPH_OPEN #表示开运算
img2 = cv2.morphologyEx(img,op,kernel,iterations=2)#迭代两次
img3 = cv2.morphologyEx(img,op,kernel,iterations=3)#迭代3次
cv2.imshow('img2_2',img2)
cv2.imshow('img2_3',img3)
cv2.waitKey(0)
习题
1.习题4-1:选择一幅图像,将其分别转换为RGB色彩空间、GRAY色彩空间、YCrCb色彩空间和HSV色彩空间
#习题4-1.py:选择一幅图像,将其分别转换为RGB色彩空间、GRAY色彩空间、YCrCb色彩空间和HSV色彩空间
import cv2
img=cv2.imread('clocktower.png') #读取图像
#print(img.depth())
cv2.imshow('original',img) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换色彩空间为RGB
cv2.imshow('RGB',img2) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转换色彩空间为GRAY
cv2.imshow('GRAY',img2) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb) #转换色彩空间为YCrCb
cv2.imshow('YCrCb',img2) #显示图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #转换色彩空间为HSV
cv2.imshow('HSV',img2) #显示图像
cv2.waitKey(0)
2.习题4-2:选择一幅图像,对其分别执行缩放、旋转、平移、透视等操作
#习题4-2.py:选择一幅图像,对其分别执行缩放、旋转、平移、透视等操作
import cv2
import numpy as np
img=cv2.imread('clocktower.png') #读取图像
cv2.imshow('original',img) #显示图像
h=img.shape[0] #获得图像高度
w=img.shape[1] #获得图像宽度
########################################################
#*************************1.缩放************************
########################################################
img2=cv2.resize(img,None,fx=0.3,fy=0.3) #缩小为20%
cv2.imshow('resize',img2) #显示图像
########################################################
#*************************2.旋转************************
########################################################
m=cv2.getRotationMatrix2D((w/2,h/2),90,0.5) #创建转换矩阵,center=(w/2,h/2)表示旋转中心
#angle=90 逆时针旋转90度,scale=0.5,缩小为50%
img2=cv2.warpAffine(img,m,(w,h)) #执行旋转 m是旋转矩阵,(w,h)表示旋转后图像的大小
cv2.imshow('Rotation',img2)
########################################################
#*************************3.平移************************
########################################################
m=np.float32([[1,0,100],[0,1,100]]) #创建平移转换矩阵,M=[[1,0,m],[0,1,n]]
#x+100,y+100 向右、向下分别平移100像素
img2=cv2.warpAffine(img,m,(w,h)) #平移图像
cv2.imshow('offset',img2) #显示图像
########################################################
#*************************4.透视************************
########################################################
src=np.float32([[0,0],[w,0],
[0,h],[w,h]]) #取原图像中四个点
#四个点分别对应四边形的四个顶点
dst=np.float32([[50,50],[w-100,50],[50,h-50],
[w-10,h-10]]) #设置四点在目标图像中的坐标
m = cv2.getPerspectiveTransform(src, dst) #创建透视转换矩阵 转换矩阵函数getPerspectiveTransform
img2=cv2.warpPerspective(img,m,(w,h)) #执行转换
cv2.imshow('Perspective',img2) #显示图像
cv2.waitKey(0)
3.习题4-3:选择一幅图像,对其分别执行均值滤波、高斯滤波、方框滤波、中值滤波和双边滤波等操作。
#习题4-3.py:选择一幅图像,对其分别执行均值滤波、高斯滤波、方框滤波、中值滤波和双边滤波等操作。
import cv2
import numpy as np
img=cv2.imread('clocktower.png') #读取图像
cv2.imshow('original',img) #显示原图像
##################################################################
#****************************1.均值滤波***************************
##################################################################
img2=cv2.blur(img,(20,20)) #均值滤波 ksize=(20,20)卷积核大小是20*20
cv2.imshow('blur',img2)
##################################################################
#****************************2.高斯滤波***************************
##################################################################
img2=cv2.GaussianBlur(img,(5,5),0,0) #高斯滤波(计算权重) ksize=(5,5),sigmaxX和sigmaxY均为0按照公式计算
cv2.imshow('GaussianBlur',img2)
##################################################################
#****************************3.方框滤波***************************
##################################################################
img2=cv2.boxFilter(img,-1,(3,3),normalize=False) #方框滤波(是否归一化)False不进行归一化,像素值之和
cv2.imshow('boxFilter',img2)
##################################################################
#****************************4.中值滤波***************************
##################################################################
img2=cv2.medianBlur(img,21) #中值滤波(取中间值) 卷积核为21*21
cv2.imshow('medianBlur',img2)
##################################################################
#****************************5.双边滤波***************************
##################################################################
img2=cv2.bilateralFilter(img,20,100,100) #双边滤波(考虑到距离和色差)
#为了简单起见,可以将两个sigma(sigmaColor和sigmaSpace)值设置为相同的。
# 如果它们的值比较小(例如小于10),滤波的效果将不太明显;如果它们的值较大
# (例如大于150),则滤波效果会比较明显,会产卡通效果。
cv2.imshow('bilateralFilter',img2)
##################################################################
#****************************6.2D卷积*****************************
##################################################################
k1=np.array([[3,3,3,3,3],[3,9,9,9,3],[3,11,12,13,3],[3,8,8,8,3],
[3,3,3,3,3],])/25 #自定义卷积核1
k2=np.ones((5,5),np.float32)/25 #自定义卷积核2 除以25表示用25领域的平均值作为该点的像素
img2=cv2.filter2D(img,-1,k1) #2D卷积
cv2.imshow('filter2D K1',img2)
img2=cv2.filter2D(img,-1,k2)
cv2.imshow('filter2D K2',img2)
cv2.waitKey(0)
5.习题4-5:绘制图4-49所示的图像,对其分别执行腐蚀、膨胀等各种形态变换操作。
#腐蚀、膨胀、开运算
import cv2
import numpy as np
img = cv2.imread('ball.png')
cv2.imshow('original',img)
kernel = np.ones((5,5),np.uint8) #定义一个5x5的核心
img2 = cv2.erode(img,kernel,iterations=2) #腐蚀操作
img3 = cv2.dilate(img2,kernel,iterations=2) #膨胀操作
op = cv2.MORPH_OPEN
img4 = cv2.morphologyEx(img,op,kernel,iterations=2) #开运算
#cv2.imshow('erode',img2)
cv2.imshow('dilate',img3)
cv2.imshow('kaiyunsuan',img4)
cv2.waitKey(0)
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。