基于OpenCV的数字图像处理 课件 项目三 应用图像增广技术_第1页
基于OpenCV的数字图像处理 课件 项目三 应用图像增广技术_第2页
基于OpenCV的数字图像处理 课件 项目三 应用图像增广技术_第3页
基于OpenCV的数字图像处理 课件 项目三 应用图像增广技术_第4页
基于OpenCV的数字图像处理 课件 项目三 应用图像增广技术_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

图像缩放图像缩放函数OpenCV中,使用函数cv2.resize()函数可以实现对图像的缩放,函数的形式如下:dst=cv2.resize(src,dsize[,fx[,fy[,interpolation]]])

dst为输出的目标图像,类型与src相同

src代表源图像

dsize代表输出图像的大小

fx表示水平方向的缩放比例

fy表示垂直方向的缩放比例

interpolation代表插值方式

注:该函数可以使用两种方式指定目标图像大小,第一种是dsize,第二种是fx,fy。

插值方式插值方式插值类型说明cv2.INTER_NEAREST最邻近插值cv2.INTER_LINEAR双线性插值cv2.INTER_CUBIC三次样条插值cv2.INTER_AREA区域插值cv2.INTER_LANCZOS4使用8*8近邻的Lanczos插值方法cv2.INTER_LINEAR_EXACT位精确双线性插值cv2.INTER_MAX插值编码掩码

插值是指将图像进行所方式,给无法通过映射得到像素值的像素点赋值的方法。例如,将图像放大为原来的1.5倍,会多出一些无法映射到的像素点,插值可以获得这些多出来的像素点的值。常见的插值方法有如下几种,如图所示。图像缩放案例-使用参数dsize进行图像缩放importcv2importnumpyasnpimg=np.random.randint(0,255,[2,4],dtype=np.uint8)rows,cols=img.shape

#获取原图的列数、行数size=(int(cols*0.7),int(rows*0.5))

#设定目标图像的尺寸dst=cv2.resize(img,size)#使用dsize设定目标图像大小print("img.shape=\n",img.shape)print("img=\n",img)print("dst.shape=\n",dst.shape)print("dst=\n",dst)【disze.py】随机创建一个2*4的二位数组,通过dsize参数对其进行缩放输出结果:img.shape=(2,4)img=[[318622158][213639671]]dst.shape=(1,2)dst=[[98112]]

使用参数dsize进行图像缩放结果解析:原始图像大小位2行4列,将列数缩小为原来的0.7倍,即4*0.7=2.8,舍去小数点后变为2列,行数变为原来的0.5倍,即2*0.5=1行,因此目标图像的大小为1行2列。图像缩放案例-使用参数dsize进行图像缩放importcv2importnumpyasnpgirl=cv2.imread("image//girl.jpg",0)rows,cols=girl.shape

#获取原图的列数、行数size=(int(cols*0.5),int(rows*0.8))#设定目标图像的尺寸dst=cv2.resize(girl,size)#进行图片缩放print("原图尺寸=",girl.shape)print("变换后的尺寸=",dst.shape)cv2.imshow("girl",girl)cv2.imshow("resize_girl",dst)cv2.waitKey()cv2.destroyAllWindows()【dsize_girl.py】将图像girl.jpg宽度变为原来的0.5倍,高度变为原来的0.8倍,使用disize作为参数。输出结果:原图尺寸=(200,300)变换后的尺寸=(160,150)

使用参数dsize进行图像缩放图像缩放案例-使用参数dsize进行图像缩放结果解析

原图尺寸中200为图像的行数,即图像高度,300为图像的列数即图像的宽度,变换尺寸后,200*0.8=160,高度变为160,宽度位300*0.5=150,宽度变为150。此处特别注意行数和高度相同,列数和宽度相同。图像缩放案例-使用参数dsize进行图像缩放importcv2importnumpyasnpgirl=cv2.imread("image//girl.jpg",0)dst=cv2.resize(girl,None,fx=0.5,fy=0.8)#注意此处的dsize值为None,不能省略print("原图尺寸=",girl.shape)print("变换后的尺寸=",dst.shape)cv2.imshow("girl",girl)cv2.imshow("resize_girl",dst)cv2.waitKey()cv2.destroyAllWindows()【fxfy_girl.py】将图像girl.jpg宽度变为原来的0.5倍,高度变为原来的0.8倍,使用fx,fy作为参数。输出结果:原图尺寸=(200,300)变换后的尺寸=(160,150)

使用参数fx,fy进行图像缩放图像缩放案例-使用参数fx,fy进行图像缩放结果解析

原图高度为200,fy=0.8,表示高度变为原来的0.8倍,因此200*0.8=160,原图宽度为300,fx=0.5表示宽度变为原来的0.5倍,因此300*0.5=150。该程序中特别注意调用cv2.risize()函数没有指定dsize的值,必须用None代替,None不可省略。图像缩放案例-使用参数fx,fy进行图像缩放谢谢!图像翻转图像翻转函数OpenCV库中种的cv2.flip()函数可以实现图像在水平方向、垂直方向以及两个方向同时翻转,语法结构如下:dst=cv2.filp(src,flipcode)

dst代表和原始图像具有相同大小和类型的目标图像。

src代表待翻转的原始图像

flipcode代表翻转类型,其中0表示绕x轴翻转,1(或者任意正整数)表示绕y轴翻转,-1(或者任意负整数)表示绕x、y轴同时反转。

图像翻转案例importcv2img=cv2.imread("image//girl.jpg")x=cv2.flip(img,0)#绕x轴翻转y=cv2.flip(img,1)

#绕y轴翻转xy=cv2.flip(img,-1)#绕x、y轴同时翻转cv2.imshow("img",img)cv2.imshow("x",x)cv2.imshow("y",y)cv2.imshow("xy",xy)cv2.waitKey()cv2.destroyAllWindows()【flip_girl.py]将girl.jpg分别沿x轴、y轴、xy轴同时翻转。图像翻转案例结果解析

图(a)是原始图像,图(b)是沿x轴翻转后的图像,图(c)是沿y轴翻转后的图像,图(d)是沿x、y轴同时翻转的图像。(a)

(b)

(c)

(d)执行结果输出结果如图所示:谢谢!图像仿射变换图像仿射变换的概念

仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。仿射变换能保持图像的平直性和平行性。平直性指图像经过仿射变换后,直线仍然是直线;平行性是指图像在完成仿射变换后,平行线仍然是平行线。图像仿射变换函数OpenCV提供了仿射变换函数cv2.warpAffine(),仿射变换函数需要通过变换矩阵M实现,其结构如下:dst=cv2.warpAffine(src,M,dsize[,flags[,borderMode[,borderValue]]])

M代表一个2*3的矩阵,使用不同的变换矩阵,就可以实现不同的仿射变换。

dsize代表输出图像的尺寸大小。

flag为插值方法,默认为INTER_LINEAR插值方式。

borderMode代表边界值,默认为0。

图像仿射变换-平移通过转换矩阵M实现将原始图像src转换为目标图像dstdst(x,y)=src(M11x+M12y+M13,M21x+M22y+M23),其中M11为x方向变换的倍数,M13为x方向移动的距离,M22为y轴方向变换的倍数,M23为y轴方向移动的距离。将原始图像src向右侧移动200个向,向下方移动50个像素,对应关系为dst(x,y)=src(x+200,y+50)补充完整上式子:dst(x,y)=src(1*x+0*y+200,0*x+1*y+50)

M11=1

M12=0

M13=200

M21=0

M22=1

M23=50将上述值放入矩阵,可以得到如下2*3的矩阵:M=102000150importcv2importnumpyasnpimg=cv2.imread("image//girl.jpg")height,width=img.shape[:2]x=100y=50M=np.float32([[1,0,x],[0,1,y]])

#定义变换矩阵Mmove=cv2.warpAffine(img,M,(width,height))

#调用仿射函数cv2.imshow("original",img)cv2.imshow("move",move)cv2.waitKey()cv2.destroyAllWindows()【trans_girl.py】设计程序,利用仿射函数将图像girl.jpg向右平移100,向下平移50。图像仿射变换-平移的案例图像仿射变换-平移的案例结果解析

图3.2(a)是原图,3.2(b)是平移之后的图像,结果可以看出图像向右移动了200,向下移动了50(注意在该坐标系中,y轴的正方向是向下,负方向是向上),同学们可以通过修改M矩阵中的各个值来观察输出结果。输出结果(a)

(b)

图像仿射变换-旋转在使用函数cv2.warpAffine()对图像进行旋转时,可以通过函数cv2.getRotationMatrix2D()获取旋转矩阵M。M=cv2.getRotationMatrix2D(center,angle,scale)

center为旋转的中心点

angle为旋转角度,正数表示逆时针旋转,负数表示顺时针旋转

scale为变换尺寸,即缩放大小如果想让图像沿图像中心位置逆时针旋转90,并且将图像缩小为0.5倍,则构建如下旋转矩阵:M=cv2.getRotationMatrix2D((width/2,height/2),95,0.5)其中(height/2,width/2)代表图像的中心位置坐标,位于图像高度一半的位置和宽度一半的位置的交叉点。图像仿射变换-旋转的案例importcv2img=cv2.imread("image//girl.jpg")height,width=img.shape[:2]#此处的0.8代表图片大小变为原来的0.8倍M=cv2.getRotationMatrix2D((width/2,height/2),45,0.8)rotate=cv2.warpAffine(img,M,(width,height))cv2.imshow("original",img)cv2.imshow("rotation",rotate)cv2.waitKey()cv2.destroyAllWindows()【rotate_girl.py】设计程序,将图像girl.jpg逆时针旋转45读,将图像大小调整为原来的0.8倍。结果解析:图(a)是原图,图(b)是旋转后的图像,图像变为原来的0.8倍,并且逆时针旋转了45度。图像仿射变换-旋转的案例输出结果(a)

(b)

动动手将rotate_girl.py中cv2.warpAffine(img,M,(width,height))语句中的width变为width*2,height变为height*2,观察输出结果有何变化?在构建矩阵M时指定的图像大小和在进行仿射变换时仿射变换函数cv2.warpAffine(img,M,(width,height))的参数(width,height)分别代表什么的代表。谢谢!图像的透视变换透视变换概念

图像透视变换(PerspectiveTransformation)是一种基于投影几何的图像处理技术,通过模拟三维空间中物体的投影效果,将图像从一个视角映射到另一个视角。其核心是‌改变图像的透视关系‌,例如将倾斜的视角(如侧拍的照片)转换为正视图(如正面投影),或模拟三维空间中的变形效果。透视变换会改变图像中直线的平行性。透视变换函数

图像的仿射变换不改变图像的平直性和平行性,但是图像的透视变换会改变图像的平行性。OpenCV的透视函数为cv2.warpPerspective(),语法结构如下:dst=cv2.warpPerspective(src,M,dsize[,flags[,borderMode[,borderValue]]])

M代表3*3的变换矩阵。

dsize代表输出图像的尺寸大小。

flags代表插值方法,默认为INTER_LINEAR。

borderMode表示边类型,默认为BORDER_CONSTANT。

borderValue代表边界值,默认是0。透视变换函数

与仿射类似,透视也需要一个函数生成转换矩阵,该函数是cv2.getPerspectiveTransform(),语法格式:M=cv2.getPerspectiveTransform(src,dst)。

src代表输入图像的四个顶点坐标。

dst代表输出图像的四个顶点坐标。

通过透视变换,将图像src的四个顶点坐标分别映射到dst的四个顶点位置。图像透视变换案例importcv2importnumpyasnpimg=cv2.imread('image//box.jpg')rows,cols=img.shape[:2]print(rows,cols)#查看原图的宽度和高度,获取原图的四个顶点坐标#四个坐标依次是左上、右上、右下、左下pts1=np.float32([[0,0],[277,0],[277,266],[0,266]])pts2=np.float32([[10,80],[250,30],[200,180],[50,170]])#创建仿射矩阵M=cv2.getPerspectiveTransform(pts1,pts2)dst=cv2.warpPerspective(img,M,(cols,rows))cv2.imshow("img",img)cv2.imshow("dst",dst)cv2.waitKey()cv2.destroyAllWindows()【perspective.py】设计程序完成图像box.jpg的透视变换。结果解析

图(a)是原始图像,图(b)是透视变换后的图像,可见,透视变换改变了图像的平行性,但是保留了图像的平直性。同学们可以修改目标图像的坐标观察输出结果。(a)

(b)输出结果图像透视变换案例谢谢!图像均衡化图像均衡化的概念

图像均衡化是一种通过调整图像像素的亮度分布来增强对比度的技术,其核心是使图像的直方图分布更均匀。均衡化的目的是通过调整像素灰度分布,将原始图像的直方图转换为近似均匀分布,从而增强图像整体对比度。均衡化前均衡化后直方图的概念图像的像素矩阵

直方图是从图像内部灰度级的角度对图像进行表述,是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数,从直方图的图形上观察,横坐标是图像中各像素点的灰度级,纵坐标是该灰度级的像素个数。

1123451255324425112352425灰度级12345出现的次数57346图像中各灰度级像素点出现的次数

一副有16个像素点的图像,存在1、2、3、4、5共5个灰度级直方图的概念由图像中各灰度级像素点出现的次数绘制该图的折线图(a)和柱状图(b),一般情况下,这两个图都称为直方图。图中横坐标代表灰度级,纵坐标为该灰度级出现的次数。

图像的直方图(a)

(b)

有时为了便于表示,会采用归一化方式绘制直方图,此时x轴仍然表示灰度级别,y轴表示该灰度级出现的频率。

将图像中各灰度级像素点出现的次数改为频率可生成频率表。

灰度级12345出现的频率5/257/253/254/256/25图像中不同灰度级别出现的频率使用灰度级和频率绘制的直方图直方图的概念对应的直方图直方图绘制OpenCV提供了函数cv2.calHist()来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数,利用matplotlib.pyplot模块中的plot函数,可以将cv2.calcHist()统计结果绘制成直方图,函数语法格式如下:hist=cv2.calcHist(images,channels,mask,histSize,ranges,accumulate)

imaes:输入的图像

channels通道编号,用[]括起来,如果是单通道,值为0,如果是彩色图像值为0,1,2分别对应B,G,R三个通道。

mask掩模图像,如果没有掩膜,则设置为None。

histSize:BINS的值,表示灰度的分组情况。

ranges:像素值的范围,一般为[0,255]表示0~255

accumulate:累计表示,默认false,如果是True,则直方图开始计算时不被清零。importcv2importmatplotlib.pyplotaspltfish=cv2.imread("image\\gray_fish.jpg")hist=cv2.calcHist([fish],[0],None,[256],[0,255])print(hist.shape)print(hist)plt.plot(hist,color='b')plt.show()【calchist.py】使用cv2.calcHist()函数绘制灰度图像gray_fish.jpg的直方图。直方图绘制案例结果解析

输出结果中的(256,1),表示有256行、1列数据,也就是横轴由256个值,分别表示0到255个像素级别,纵轴是各个像素级别的像素个数。gray_fish.jpg是灰度图像,单通道,因此函数的第二个参数是[0];mask为空,因此第三个参数为None;histSize设置为256,因OpenCV中有256个灰度级,因此横坐标中表示256个灰度级,纵坐标表示每个灰度级出现的频率;ranges的值为[0,255]表示图像的像素值范围。输出结果直方图绘制案例动动手将函数

cv2.calcHist([fish],[0],None,[256],[0,255])参数histSize值设置为16,表示相邻的每16个像素的频率作为一组统计,将像素级别分为16个,同学们可以修改参数观察输出结果。彩色图像的直方图绘制importcv2importmatplotlib.pyplotasplto=cv2.imread("image\\girl.jpg")histb=cv2.calcHist([o],[0],None,[256],[0,255])histg=cv2.calcHist([o],[1],None,[256],[0,255])histr=cv2.calcHist([o],[2],None,[256],[0,255])plt.plot(histb,color='b')plt.plot(histg,color='g')plt.plot(histr,color='r')plt.show()【hist_girl.py】使用cv2.calcHist()函数绘制彩色图像girl.jpg的直方图。彩色图像的直方图绘制结果解析

程序中三次调用函数cv2.calcHist(),其中的第二个参数分别为[0]、[1]、[2],表示第0个通道、第1个通道、第2个通道,因此三次调用分别构建了三个通道的直方图,然后调用plt.plot()函数以不同的颜色输出,如图所示,蓝色表示的是b通道的直方图,绿色表示g通道直方图,红色表示r通道直方图。

输出结果带掩膜的直方图以上两个案例均将掩膜mask设置为None,表示绘制整幅图像的直方图,有时希望仅针对感兴趣的区域统计直方图,则需要使用掩膜。将掩模看作一块玻璃板,白色区域是透明的,黑色区域是不透明的,掩模运算就是将玻璃盖在图像上,通过玻璃板显示处理的部分就是掩模运算的结果。通常先构造一个像素值都为0的二维数组,再将数组中指定区域的像素值设定为255,得到掩模图像。带掩膜的直方图绘制案例importcv2importnumpyasnpimportmatplotlib.pyplotaspltimage=cv2.imread("image\\girl.jpg",cv2.IMREAD_GRAYSCALE)mask=np.zeros(image.shape,np.uint8)#mask[0:130,90:210]=255

#构造掩膜result=cv2.bitwise_and(image,mask)cv2.imshow("original",image)cv2.imshow("with_mask",result)histImage=cv2.calcHist([image],[0],None,[256],[0,255])#无掩膜的直方图histMI=cv2.calcHist([image],[0],mask,[256],[0,255])#有掩膜的直方图plt.plot(histImage,color='blue')plt.plot(histMI,color='red')plt.show()【hist_mask_girl.py】使用掩膜绘制girl.jpg的直方图。带掩膜的直方图绘制案例结果解析

图(a)是原图,图(b)是使用掩膜的图像,图(c)中蓝色曲线代表无掩膜的图像的直方图,红色曲线代表有掩膜图像的直方图,有掩膜的直方图只统计了图(b)中非黑色背景部分的图像,因此总像素点个数明显减少。输出结果(a)

(b)(c)直方图均衡化如果一幅图像拥有全部可能的灰度级,并且像素值分布均匀,那么这幅图就有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大,在外观上,这样的图具有更丰富的色彩,不会过暗或过亮。直方图均衡化通常用来增加图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。这种方法可以更好的显示X光图像中的骨骼结构。

OpenCV提供了cv2.equalizeHist(src)函数实现直方图的均衡化,其语法格式如下:

dst=cv2.equalizeHist(src)

src是8位单通道原始图像。直方图均衡化案例importcv2importmatplotlib.pyplotaspltimg=cv2.imread('image\\grass.jpg',cv2.IMREAD_GRAYSCALE)#以灰度图像读取equ=cv2.equalizeHist(img)#直方图均衡化cv2.imshow("befor",img)#均衡前的图像cv2.imshow("after",equ)#均衡后的图像histImage=cv2.calcHist([img],[0],None,[256],[0,255])#均衡前的直方图histequ=cv2.calcHist([equ],[0],None,[256],[0,255])#均衡后的直方图plt.plot(histImage,color='blue')#均衡前用蓝色绘制plt.plot(histequ,color='red')#均衡后用红色绘制plt.show()cv2.waitKey()cv2.destroyAllWindows()【equ_grass.py】将图像grass.jpg进行均衡化处理,比较均衡化前后的图像效果及直方图的区别。直方图均衡化案例结果解析

图(a)是原图,图(b)是均衡化后的图像,可以看出,均衡化之后图像更清晰,图(c)中蓝色曲线是均衡化前的直方图,红色曲线是均衡化后的直方图,可以看出,均衡化后的图像灰度级丰富且覆盖范围较大,并且分布更均匀。(a)

(b)(c)证书小贴士图像均衡化是百度计算机视觉1+x考试经常出现的试题,同学们要学会进行图像的均衡化处理,并能够判断哪幅图像是均衡化之后,哪幅直方图是均衡化之前。谢谢!图像亮度及对比度图像亮度及对比度函数图像的亮度和对比度调整可以为人们带来不同的观感,在计算机视觉领域,可以通过亮度和对比度调整增加样本数量,OpenCV提供了函数convertScaleAbs(src[,dst[,alpha[,beta]]])来实现亮度和对比度的调整,语法格式如下:cv2.convertScaleAbs(src[,dst[,alpha[,beta]]])

src:输入图像。

dst:输出图像。如果不指定,则返回新分配的输出数组。

alpha:乘法因子。默认值为1,表示不进行对比度调整。

beta:加法因子。默认值为0,表示不进行亮度调整。图像亮度及对比度案例importcv2img=cv2.imread("image//girl.jpg")img_contrast=cv2.convertScaleAbs(img,dst=None,alpha=1.5,beta=10)cv2.imshow("girl",img)cv2.imshow("img_contrast",img_contrast)cv2.waitKey()cv2.destroyAllWindows()【bright_girl.py】对图像girl.jpg进行对比度和亮度调整,观察输出结果。图像亮度及对比度案例结果解析

图(a)是原图,图(b)是将对比度调整为1.5倍、亮度增加10后的结果。可以看出,图像的亮度和对比度均增加。输出结果(a)

(b)动动手

该函数中注意如果alpha=1,beta=0,表示图像对比度和亮度均未变化,如果alpha小于1,则会使图像对比度减小;如果alpha大于1,则会使图像对比度增加。如果beta为负数,则会使整个图像变暗;如果beta为正数,则会使整个图像变亮。

同学们可以自由调整alpha和beta的值运行程序,查看输出结果的变化。谢谢!图像增广技术学习目标技能目标掌握图像缩放、图像翻转、图像旋转、图像仿射变换、图像透视变换技能。掌握图像的各种平滑处理技术。掌握使用matplotlib绘制直方图素质目标

具备对数据的敏感性,能够识别和分析图像数据中的关键特征。

增强社会责任感,关注社会发展大局,认识到技术对于社会进步的重要性。项目背景

图像增广(ImageAugmentation)作为机器学习领域的核心技术,具有非常重要的意义。提升模型泛化能力‌。解决数据不足与分布偏差问题。优化模型鲁棒性与场景适配性。支持小样本学习与个性化需求。任务引入

作为一位图像处理工程师,您肩负着一项至关重要的任务:为计算机视觉工程师的模型训练准备大量的样本图像。

然而,目前的样本数量尚显不足。因此,您需通过图像的几何变换、平滑处理和增加噪声等操作,将现有的10张图像扩充至100张,并按照相关要求进行命名。任务准备

完成该项任务,需要掌握以下基础知识:图像的几何变换图像均衡化图像亮度对比度图像的平滑处理谢谢!均值滤波均值滤波的原理图像的像素矩阵

均值滤波是指用当前像素点周围的M*M个像素点的平均值代替当前像素点的值,使用该方法对图像内的每一个像素点进行处理,即可完成均值滤波。

图为像素矩阵,如果取像素值为20的像素点周围3*3区域(图中的浅灰色底纹区域)的像素值的平均值计算,则(99+104+92+107+20+112+99+100+102)/9=93,图像平滑处理后20被替换为93。10098110961051029910492979910720112107989910010298均值滤波的原理

针对图中的每一个像素点进行同样的处理即可完成均值滤波,但是对于边缘不够3*3区域的像素点,如图所示第0行0列的像素值100,可选择其存在的区域的像素的平均值,如图中浅灰色区域所选,计算方法为(100+98+102+99)/4=100。除此之外,还可以通过扩充边缘的方法进行,扩充后在新增的行、列中填充不同的像素,之后再在此基础上对原来的像素矩阵进行求均值。OpenCV提供了多种边界处理方式,可以根据实际需要选择不同的边界处理模式。特殊位置的像素值处理10098110961051029910492979910720112107989910010298均值滤波案例OpenCV提供了均值滤波函数cv2.blur(),语法格式如下:

dst=cv2.blur(src,ksize,anchor,borderType)

src为待处理的图像。

dst为处理后的图像。

ksize是滤波核的大小,滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度,例如5*5,7*7等。

anchor是锚点,默认值是(-1,1),表示当前计算均值的点位于核的中心点位置,使用默认即可。

borderType是边界样式,该值决定了以何种方式处理边界,可以使用默认值。anchor和borderType使用默认值,所以函数简化为。

dst=cv2.blur(src,ksize)均值滤波importcv2o=cv2.imread("image\\house.jpg")r3=cv2.blur(o,(3,3))r7=cv2.blur(o,(7,7))cv2.imshow("original",o)cv2.imshow("3*3kernal",r3)#3*3滤波核cv2.imshow("7*7kernal",r7)#7*7滤波核cv2.waitKey()cv2.destroyAllWindows()【blur_img.py】通过不同大小的滤波和对图像进行均值滤波,观察输出结果。均值滤波案例结果解析

图(a)是原图,(b)是使用3*3的核进行均值滤波的结果,(c)是使用7*7滤波和进行滤波的结果,由输出图像结果可见,滤波核越大,去噪效果越好,但是图像也越模糊,因此在进行去噪时要选择合适的滤波核。输出结果

(a)

(b)(c)谢谢!方框滤波方框滤波概念进行归一化的结果

方框滤波可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和还是邻域像素和的平均值。如果使用3*3的滤波核,则不进行归一化和进行归一化的结果分别如图3.17和3.18所示,由图可以看出,不进行归一化则整个图像中的几乎所有像素的值都是255,图像呈全白色,而进行归一化后图像的像素值范围比较正常。10098110961051029910492979910720112107989910010298

不进行归一化的结果55255255255255255255255255255255255255255255255255255255255

不进行归一化10098110961051029910492979910720112107989910010298

进行归一化1001011009998101939394102101929392101101879090105方框滤波函数

OpenCV提供函数cv2.boxFilter()实现均值滤波,语法格式如下:dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderTyper)

src表示待进行滤波的图像。

ddepth表示处理图像的图像深度,一般用-1表示与原始图像使用相同的图像深度。

ksize是卷积核的大小。

anchor锚点,默认(-1,-1),表示当前点为核的中心位置。

normalize表示是否归一化,1表示进行归一化,用邻域像素值除以面积,默认为1。

0表示不归一化,直接使用像素值之和。

borderType是边界样式。方框滤波案例importcv2img=cv2.imread("image\\house.jpg")r3_y=cv2.boxFilter(img,-1,(3,3))#核为3*3,进行归一化r3_n=cv2.boxFilter(img,-1,(3,3),normalize=0)#核为3*3,不进行归一化cv2.imshow("original",img)cv2.imshow("kernal=3*3,normalize=1",r3_y)cv2.imshow("kernal=3*3,normalize=0",r3_n)cv2.waitKey()cv2.destroyAllWindows()【boxfilter.py】采用方框滤波对图像进行平滑处理,观察使用归一化和不使用归一化的效果。方框滤波案例结果解析

图(a)位原图,(b)是进行方框率滤波并归一化的结果,(c)是方框滤波不进行归一化的结果,由结果可以看出,进行归一化的方框滤波可以去噪,并与原图保持高度一致,不进行归一化的图像整体颜色几乎成为白色,因为所有的像素值均增大,很多像素值达到255变成白色。输出结果(a)

(b)(c)谢谢高斯滤波高斯滤波概念高斯滤波卷积过程

均值滤波和方框滤波邻域像素值的权重相同,均为1,而高斯滤波会将中心点权重加大,远离中心点的权重减小。如图3.20中要对像素值为20的点求其高斯滤波后的结果,滤波核中像素值99、92、102的位置距离像素值20最远,因此权重最小,权重值为1,像素值为104、107、100、102的点距离像素点20较近,因此权重为2,像素点20距离自己最近,因此权重最大,权重值为8。计算像素点20的高斯滤波后的值,公式为:(99*1+104*2+92*1+107*2+20*8+112*2+99*1+100*2+102*1)/(1+2+1+2+8+2+1+2+1)=70高斯滤波函数

对图中的每一个像素值根据卷积核权重求像素值即可得到高斯滤波后的像素值。OpenCV提供了函数cv2.GaussianBlur()实现高斯滤波,语法格式如下:dst=cv2.GaussianBlur(src,ksize,sigmaX[,sigmaY,borderType])

dst是返回值;

src是需要处理的图像;

ksize是滤波核大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度;

sigmaX是卷积核水平方向(X轴方向)的标准差,其控制的是权重比例。如图3.21所示是不同的sigmaX决定的卷积核,他们

在水平方向上的标准差不同。

sigmaY是卷积核水平方向(Y轴方向)的标准差。如果将其设置为0,则只采用sigmaX的值。

borderType是边界样式。不同sigmaX决定的卷积核112111242124842144211121111211124212484214421112111121112421248421442111211不同sigmaX决定的卷积核高斯滤波案例importcv2img=cv2.imread("image\\house.jpg")img_gaus3=cv2.GaussianBlur(img,(3,3),0,0)#卷积核为3*3,sigmaX=0,sigmaY=0img_gaus7=cv2.GaussianBlur(img,(7,7),0,0)#卷积核为7*7,sigmaX=0,sigmaY=0cv2.imshow("original",img)cv2.imshow("img_gaus3",img_gaus3)cv2.imshow("img_gaus7",img_gaus7)cv2.waitKey()cv2.destroyAllWindows()【gaussianBlur.py】采用高斯滤波对图像进行平滑处理,观察输出结果。高斯滤波案例结果解析

图(a)是原图,图(b)是卷积核位3*3的高斯滤波结果,图(C)是卷积核位7*7的高斯滤波结果,可以看出,卷积核越大去噪效果越好,但是图像也越模糊,因此应选择合适大小的卷积核。输出结果(a)

(b)(c)谢谢!中值滤波中值滤波概念

图像的像素矩阵

中值滤波与其名字意义相同,它用邻域内所有像素值的中间值来替代当前像素点的值。即将其邻域内的所有像素点进行排序,然后将位于中间位置的像素点作为当前像素点的像素值。

图中像素点20的3*3邻域的像素值分别为99、104、92、107、20、112、99、100、102,将其排序后得到20、92、99、99、100、102、104、107、112,其中间值为100,因此20被100替代,对图像中所有像素点进行该项运算,即可得到中值滤波的结果。10098110961051029910492979910720112107989910010298中值滤波函数

OpenCV提供了函数cv2.medianBlur()实现中值滤波,语法格式如下:

dst=cv2.medianBlur(src,ksize)

dst是返回值,表示进行中值滤波后的结果

src是需要处理的图像,即源图像。它能够由任意数量的通道,并能对各个通道进行独立处理。

ksize是滤波和大小,指滤波处理过程中其邻域图像高度和宽度,核大小必须是比1大的奇数。中值滤波案例importcv2img=cv2.imread("image\\house.jpg")r3=cv2.medianBlur(img,3)#卷积核为3*3r7=cv2.medianBlur(img,7)#卷积核为7*7cv2.imshow("original",img)cv2.imshow("kernal=3*3",r3)cv2.imshow("kernal=7*7",r7)cv2.waitKey()cv2.destroyAllWindows()【medianBlur.py】采用中值滤波对图像进行平滑处理,观察输出结果。中值滤波结果解析

图(a)是原图,图(b)是使用3*3卷积核进行中值滤波的结果,图(c)是使用7*7的卷积核进行中值滤波的结果,由图可见,中值滤波比均值滤波、方框滤波、高斯滤波的效果都相对更好一些。输出结果(a)

(b)(c)谢谢!双边滤波双边滤波概念

双边滤波综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效保护图像内的边缘信息。均值滤波、高斯滤波、中值滤波只考虑了空间的权重信息,但在边缘信息的处理上存在较大的问题,最终造成了边界模糊和部分信息的丢失。

双边滤波在计算某个像素点的的新值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小),双边滤波综合考虑距离和色彩权重的结果,既能有效去除噪声,又能较好保护边缘信息。当处于边缘时,与当前点色彩相近的像素点(颜色距离很近)会被赋予较大的权重值,而与当前色彩差别较大的像素点(颜色距离很远)会被赋予较小的像素权重值(极端情况下权重值可能为0,直接忽略该点),这样就保护了边缘信息。

图(a)是原始图像,左侧白色255,右侧黑色0,图(b)是进行均值滤波的结果,图(c)c进行双边滤波的结果。某图像的边缘像素100981029999107989910098102999910798991009810299991079899(a)

(b)(c)双边滤波函数双边滤波的计算过程是在计算白色区域滤波结果时:对于白色点,给予的权重最大,对黑色的点,由于色彩差异较大,颜色距离很远,因此权重设置为0,

这样计算白色区域仍然是白色;在计算黑色区域滤波结果时:对于黑色的点,给予权重较大,对于白色的点,由于色彩差异较大,权重为0。OpenCV提供了函数cv2.bilateralFilter()来实现双边滤波,函数语法格式如下:dst=cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

dst是返回值

src是要进行双边滤波的图像,

d是在滤波时选取的空间距离参数,即以当前像素点为中心的直径。如果该值为非正数,则会自动从参数

sigmaSpace计算得到。如果滤波空间较大(d>5),则速度较慢,实际应用是推荐d=5。

sigmaColor是滤波处理时选取的颜色范围,小于该值的像素点可以参与到滤波中

sigmaSpace是坐标空间的sigma值,值越大,说明有越多的点能够参与到滤波中来.当d>0时,无论sigmaSpace的值如何,d都指定邻域大小;否则d与sigmaSpace的值成正比。

borderType是边界样式,决定了边界的处理方式。一般采用默认值。双边滤波案例importcv2img=cv2.imread("image\\noise.bmp")gaus=cv2.GaussianBlur(img,(5,5),0,0)#高斯滤波box=cv2.boxFilter(img,-1,(5,5))#方框滤波bil=cv2.bilateralFilter(img,5,100,100)#双边滤波cv2.imshow("original",img)cv2.imshow("Gaussian",gaus)cv2.imshow("boxFilter",box)cv2.imshow("bilateral",bil)cv2.waitKey()cv2.destroyAllWindows()【bilateralFilter.py】对图像分别进行高斯滤波、方框滤波、双边滤波,观察对边界的影响。双边滤波案例结果解析

图(a)是原图,图(b)是高斯滤波结果,图(c)是方框滤波结果,图(d)是双边滤波结果,由图可以看出,高斯滤波和方框滤波模糊了边缘,而双边滤波更好的保护了边缘信息。

输出结果(a)

(b)(c)(d)

多种滤波方式结果比较importcv2img=cv2.imread("image\\house.jpg")gaus=cv2.GaussianBlur(img,(5,5),0,0)#高斯滤波box=cv2.boxFilter(img,-1,(5,5))#方框滤波median=cv2.medianBlur(img,5)#中值滤波bil=cv2.bilateralFilter(img,5,100,100)#双边滤波cv2.imshow("original",img)cv2.imshow("Gaussian",gaus)cv2.imshow("boxFilter",box)cv2.imshow("medianBlur",median)cv2.imshow("bilateral",bil)cv2.waitKey()cv2.destroyAllWindows()【blur.py】分别使用高斯滤波、方框滤波、均值滤波和双边滤波对图像进行去噪,观察输出结果。双边滤波结果解析

图(a)是原图,图(b)是高斯滤波结果,图(c)是方框滤波结果,图(d)是中值滤波结果,图(e)是双边滤波结果,由结果可见,中值滤波效果最好,双边滤波效果最差。

输出结果(a)

(b)(c)(d)

(e)

谢谢!2D卷积2D卷积概念以上几种滤波方式可以灵活的指定卷积核大小,但有时我们希望能使用特定的卷积核,实现自定义卷积核,OpenCV提供了函数cv2.filter2D()函数实现自定义卷积核,语法格式如下:cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)

src是要进行滤波的图像;

ddepth是处理结果图像的深度,-1代表与源图像相同;

kernal是卷积核,是一个单通道的数组,如果要处理彩色图像,让每个单通道使用不同的卷积核,则必须将彩

色图像分解后使用不同的核进行卷积;

anchor是锚点,默认值是(-1,-1),表示当前计算均值的点位于核的中心位置;一般使用默认值

delta是修正值,可选,如果存在,会在基础滤波的基础上加上该值作为最终滤波处理结果。

borderType是边界样式,改值决定了以何种情况处理边界,通常选用默认值即可。常用形式为:dst=cv2.filter2D(src,ddepth,kernel)2D卷积案例importcv2importcv2importnumpyasnpimg=cv2.imread("image\\house.jpg")ker1=np.ones((3,3),np.float32)/9#定义3*3的全1/9卷积核ker2=np.ones((3,3),np.float32)/9ker2[1,1]=3#将ker2的第1行1列的权重设置为3r1=cv2.filter2D(img,-1,ker1)r2=cv2.filter2D(img,-1,ker2)cv2.imshow("original",img)cv2.imshow("kernal1",r1)cv2.imshow("kernal2",r2)cv2.waitKey()cv2.destroyAllWindows()【filter2d.py】通过定义不同的卷积核对图像进行2D卷积,比较卷积结果2D卷积案例结果解析

图(a)是原图,图(b)是使用全1/9的卷积核进行卷积的结果,图(c)是使用部分值为1的卷积核进行卷积的结果,可见,不同卷积核卷积后得到不同效果的图像。

输出结果(a)

(b)(c)谢谢!图像平滑处理图像平滑处理的概念在尽量保留图像信息的情况下,过滤图像内部的噪声,这个过程称为图像平滑处理(Smoothingimages),处理后的图像称为平滑图像。如图所示,图像像素矩阵中大部分像素值为90到110之间,而其中第三行第三列的像素值为20,不在此范围中,反映在图像上,该点比其他像素点的颜色要深很多,图像平滑处理时会认为该点是噪声点,会将其处理为和周围颜色趋于一致的颜色。图像的像素矩阵10098110961051029910492979910720112107989910010298图像平滑处理的应用医学影像增强‌卫星与遥感图像处理‌数码摄影与图像修复‌计算机视觉预处理图像平滑处理的应用‌图像分割辅助‌工业检测与自动化‌光学字符识别(OCR)‌图像平滑处理的方法

针对图像中的所有像素点均进行平滑处理后就能完成图像的平滑处理,有效去除图像中的噪声信息。因此图像平滑处理的原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。根据取近似值方法的不同,可以分为以下几种平滑处理方法:均值滤波方框滤波高斯滤波中值滤波双边滤波2D卷积滤波

像平滑处理改变了图像中像素的值,从而导致图像的模糊效果,因此图像的平滑处理也被称为图像的模糊处理(BlurringImages)。谢谢!任务实施任务要求项目的样本数据存放在data目录下,通过图像的几何变换、图像平滑处理、增加噪声等操作将给定的10张图像增广到100张图像,所有图像均处理为256*256大小,尺寸变换后的图像命名为resize0.jpg、resize1.jpg...等;随机翻转后的图像以flip0.jpg,flip1.jpg等命名,旋转后的图像以rotate0.jpg、rotate1.jpg等命名,均衡化后的图像以equ0.jpg,equ1.jpg等命名,亮度调整后的图像以bright0.jpg、bright1.jpg等命名,添加噪声后的图像以noise0.jpg,noise1.jpg等命名,平移后的图像以move0.jpg、move1.jpg等命名,增广后的图像存放在aug文件夹下。分析步骤(1)分别定义图像缩放、图像旋转、图像翻转、图像平滑处理、图像均衡化、图像亮度变化、增加噪声、图像平移函数。(2)使用for循环依次读取每一张图片,对每一张图片应用第一步定义的函数进行变换,然后保存。项目代码importcv2importosimportrandomimportnumpyasnpfromskimageimportutildata_path=”data”#设置基本路径result_path=”aug”ifnotos.path.exists(result_path):os.mkdir(result_path)#多级目录使用os.makedirs()defresize(img,size=[256,256]):#定义图像缩放函数img=cv2.resize(img,size)returnimgdefflip(img):#定义翻转函数

code=random.randint(-1,2)img=cv2.flip(img,code)returnimg项目代码defrotate(img):#定义随机旋转函数angle=np.random.randint(-10,11)#设定随机旋转阈值height,weight=img.shape[:2]M=cv2.getRotationMatrix2D((weight/2,height/2),angle,1)img=cv2.warpAffine(img,M,(weight,height))returnimgdefequalize_hist(img):#定义直方图均衡化函数B,G,R=cv2.split(img)#分别对三个颜色通道进行直方图均衡化EB=cv2.equalizeHist(B)EG=cv2.equalizeHist(G)ER=cv2.equalizeHist(R)Eimg=cv2.merge((EB,EG,ER))#将均衡化后的三个通道的图像进行合并还原returnEimgdefrandom_bright(img):#定义亮度对比度调整函数alpha=np.random.uniform(0,2)beta=np.random.uniform(0,100)img_contrast=cv2.convertScaleAbs(img,dst=None,alpha=alpha,beta=beta)returnimg_contrast项目代码#设置噪声的类型,包括高斯噪声,泊松噪声和椒盐噪声defrandom_noise(img):#定义噪声函数

noise_type=['gaussian','poisson','salt']index=random.randint(0,2)#随机选择一种噪声img=util.random_noise(img,mode=noise_type[index])#应用噪声img=img*255#因skimage的噪声函数会将图像进行像素归一化至[0,1],为了正常显示,需要恢复到[0,255]returnimgdefrandom_move(img,x,y):#定义平移函数height,width=img.shape[:2]M=np.float32([[1,0,x],[0,1,y]])#定义变换矩阵Mmove=cv2.warpAffine(img,M,(width,height))#调用仿射函数returnmoveimg_list=os.listdir(data_path)#遍历图像目录并执行图像增广变换count=0项目代码#设置噪声的类型,包括高斯噪声,泊松噪声和椒盐噪声defrandom_noise(img):#定义噪声函数

noise_type=['gaussian','poisson','salt']index=random.randint(0,2)#随机选择一种噪声img=util.random_noise(img,mode=noise_type[index])#应用噪声img=img*255#因skimage的噪声函数会将图像进行像素归一化至[0,1],为了正常显示,需要恢复到[0,255]returnimgdefrandom_move(img,x,y):#定义平移函数height,width=img.shape[:2]M=np.float32([[1,0,x],[0,1,y]])#定义变换矩阵Mmove=cv2.warpAffine(img,M,(width,height))#调用仿射函数returnmove项目代码#遍历图像目录并执行图像增广变换img_list=os.listdir(data_path)count=0forimginimg_list:img_name,img_ext=img.split('.')img_path=os.path.join(data_path,img)image=cv2.imread(img_path,1)count+=1#计数器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论