




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章Python图像处理基础2.1图像处理类PIL2.2绘图类Matplotlib2.3科学计算类库NumPy2.4数值运算类库SciPy2.1图像处理类PIL在Python2中,PIL(PythonImagingLibrary)是一个非常好用的图像处理库,但PIL不支持Python3。因此开发者在Python3中提供了Pillow库,它是PIL库的1.1.7版本的一个分岔,在使用时需要导入PIL,而不是导入Pillow。在Pillow库中,除了有很多模块,还有许多插件。其中最常用也最为基础的是Image模块中同名的Image类,其他很多模块都是在Image模块的基础之上对图像进行进一步的处理。表2-1列出了Image类的一些常用属性。2.1.1图像打开与模式转换常用属性描述mode图像模式,如RGB表示真彩图像,L表示灰度图像等width图像的像素宽度height图像的像素高度format图像的格式,如JPG,PNG,BMP,GIF等size图像的大小,由宽度和高度组成的一个元组readonly表示图像是否为只读info表示图像信息,是一个包含图像信息的字典category表示图像的类别表2-1Image类常用属性2.1.1图像打开与模式转换首先使用open()方法打开图像,并且获取图像的一些属性。表2-1列出使用Image类的一些常用属性。下面演示一个实例。fromPILimportImageimg=Image.open("pictures\\cvb.png");img.show()print(img.width,img.height,img.size)print(img.mode,img.format,img.readonly,img._category);print()输出如下:19201080(1920,1080)RGBPNG00{'dpi':(96.012,96.012)}2.1.1图像打开与模式转换上述代码引入了Image模块,并以open()方法打开了“cvb.png”这个图像,构建了名为img的实例。如果打开失败,则会抛出IOError异常。图2-1使用open()方法打开的图像2.1.1图像打开与模式转换图像模式是在数字图像处理和计算机图形领域中广泛使用的一种重要概念。这些模式定义了图像如何编码和表示,决定了图像中可用的颜色和信息量。每种模式都有其特定的应用领域和优势,根据需要选择合适的模式可以有效地处理和呈现图像。表2-2给出了图像模式mode的常用类别描述。图像模式图像描述11位像素,黑白L8位像素,黑白P8位像素,使用调色板映射到其他模式RGB24位像素,真彩色2.1.1图像打开与模式转换RGBA32位像素,带透明蒙版的真彩色CMYK32位像素,分色YCbCr24位像素,彩色视频格式LAB24位像素,Lab颜色空间HSV24位像素,色相,饱和度,值颜色空间I32位有符号整数像素F32位浮点像素表2-2图像模式mode的类别2.1.1图像打开与模式转换下面演示一个实例。fromPILimportImageimg=Image.open("pictures//cvb.png")#原图为RGB模式img.show()img1=img.convert("1")#改为1模式img1.save("cvb_1.png");img1.show()img2=img.convert("L")#改为L模式img2.save("cvb_L.png");img2.show()img3=img.convert("P")#改为P模式img3.save("cvb_P.png");img3.show()RGB模式1模式L模式P模式图2-2convert()方法转换图像格式2.1.1图像打开与模式转换在方法convert中有5个参数,有时根据需要会另外设置一些参数的值。(1)mode,图片的模式,传入需要转换的模式。部分模式之间不支持转换,代码会报错。(2)matrix,转换矩阵。传入该参数时,应该传入由浮点数构成的元组,元组长度为4或12。matrix只支持从'RGB'转换成'L'或'RGB'。(3)dither,控制颜色抖动的参数,当从一种颜色模式转换为另一种颜色模式时,它可以帮助保持图像的视觉质量。它有两种可用的参数:'NONE'和'FLOYDSTEINBERG'。'NONE':不使用抖动。当转换灰度('L')或真彩('RGB')图像为二值图像('1')时,如果dither参数设置为'NONE',图像中的所有像素值大于128的部分将被设置为255(白),而所有其他值将被设置为0(黑)。这意味着图像会变成纯黑白图像,没有任何灰度过渡。'FLOYDSTEINBERG':使用Floyd-Steinberg抖动算法,该算法通过在图像中引入噪声来平滑颜色过渡,从而减少颜色带来的视觉失真。这种方法在进行颜色模式转换时可以更好地保留图像的细节。特殊情况:当提供了matrix参数时,dither功能将不会被使用。convert(self,mode=None,matrix=None,dither=None,palette=WEB,colors=256)2.1.1图像打开与模式转换(4)palette参数用于控制调色板的生成,当从模式'RGB'转换为模式'P'时使用。它有两种可用的方法:'WEB'和'ADAPTIVE'。'WEB'(默认):使用预定义的web安全颜色调色板。这种调色板包含216种颜色,这些颜色在所有显示设备上都能可靠地显示,是一种标准的调色板。'ADAPTIVE':使用自适应的调色板。(5)colors,自适应调色板使用的颜色数。当palette参数为'ADAPTIVE'时,用于控制调色板的颜色数目。默认是最大值,即256种颜色。2.1.1图像打开与模式转换下面演示一个实例,说明参数matrix对图像转换的影响。fromPILimportImageimage=Image.open("pictures//cvb.png");image.show()image1=image.convert('L');image1.show()matrix1=(0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5)image2=image.convert('L',matrix=matrix1)image2.show()matrix2=(0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.,0.1)image3=image.convert('L',matrix=matrix2)image3.show()原始RGB图像
L图像L图像带参数matrix1L图像带参数matrix2图2-3matrix参数对图像色彩的影响2.1.1图像打开与模式转换将图像模式'RGB'转换为模式'1'以后,像素点变成黑白两种点,要么是0,要么是255。而从模式'1'转换成'RGB'时,'RGB'的三个通道都是模式'1'的像素值的拷贝。下面演示一个实例:fromPILimportImageimg=Image.open("pictures//fj1.jpg")img_1=img.convert("1")img_rgb=img_1.convert("RGB")print(img.getpixel((0,0)))print(img_1.getpixel((0,0)))print(img_rgb.getpixel((0,0)))以上代码输出结果如下:(134,55,24)0(0,0,0)模式'RGB'转换为模式'L'以后,像素值为[0,255]之间的某个数值。而从模式'L'转换成'RGB'时,'RGB'的三个通道都是模式'L'的像素值的拷贝。下面演示一个实例:fromPILimportImageimg=Image.open("pictures//fj1.jpg")img_L=img.convert("L")img_rgb=img_L.convert("RGB")print(img.getpixel((0,0)))print(img_L.getpixel((0,0)))print(img_rgb.getpixel((0,0)))以上代码输出结果如下:(134,55,24)75(75,75,75)2.1.1图像打开与模式转换#创建一个新的RGB图像,宽度为100像素,高度为100像素,背景色为白色new_image=Image.new('RGB',(100,100),color='white')#打开一个图像original_image=Image.open('example.jpg')#复制图像copied_image=original_image.copy()在Pillow库中的Image类提供了创建新图像、复制图像和粘贴图像的方法。下面是如何使用这些方法的具体说明:(1)创建新图像可以使用Image.new()函数创建新图像。这个函数是Image模块中的一个函数,而不是Image类的实例方法。它的调用格式如下:(2)复制图像可以使用copy()方法复制一个图像。这个方法是Image类的实例方法。用法如下:2.1.1图像打开与模式转换(3)粘贴图像可以使用paste()方法将一个图像粘贴到另一个图像上。用法如下:#打开两个图像base_image=Image.open('base_image.jpg')overlay_image=Image.open('overlay_image.png')#定义粘贴位置(左上角坐标)position=(50,50)#将overlay_image粘贴到base_image上base_image.paste(overlay_image,box=position)2.1.2调整图像尺寸与旋转在Image类中,关于图像缩放可以使用resize()方法,下面介绍resize()方法的几个参数。(1)size,指定缩放后的图像尺寸,传入一个长度为2的元组(width,height)。(2)resample,用于指定图像缩放时使用的重采样过滤器。重采样是图像缩放过程中对像素进行插值的过程,影响图像的最终质量和处理速度。可用的重采样过滤器包括:Image.NEAREST(最近邻插值)、Image.BILINEAR(双线性插值)、Image.BOX(盒状滤波器)等过滤器。默认情况下,resize()方法使用Image.BICUBIC作为重采样过滤器。(3)box,用于指定缩放图像的区域。它是一个长度为4的元组(x0,y0,x1,y1),定义了一个矩形区域,其中(x0,y0)是矩形的左上角坐标,(x1,y1)是右下角坐标。这个矩形区域必须完全位于原图的边界内,如果指定的区域超出原图的边界,则会引发错误。(4)reducing_gap,用于提高在图像缩小时的性能和质量。传入一个浮点数,用于优化图像缩放效果,默认不进行优化,值大于3.0时优化效果基本已经是公平的重采样。2.1.2调整图像尺寸与旋转如果只是图像本身的放大和缩小,不需要提供box参数,如果选择图像的某一部分进行放大和缩小,就需要指定box参数说明要操作的区域。下面演示一个实例。fromPILimportImageimage=Image.open("pictures//cat.jpg")#原始图像为800x500image.show()image_1=image.resize((400,250),resample=Image.LANCZOS,reducing_gap=5.0)image_1.show()image_2=image.resize((960,600),resample=Image.LANCZOS,reducing_gap=5.0)image_2.show()原始图像缩小后的图像放大后的图像图2-4resize函数缩放图像2.1.2调整图像尺寸与旋转下面演示一个实例,将裁剪区域放大和缩小。fromPILimportImageimage=Image.open("pictures//cat.jpg")image_crop=image.crop(box=(200,100,600,350))image_crop.show()image_1=image.resize((240,150),resample=Image.LANCZOS,box=(200,100,450,250),reducing_gap=5.0)image_1.show()image_2=image.resize((800,500),resample=Image.LANCZOS,box=(200,100,450,250),reducing_gap=5.0)image_2.show()原始图像缩小后的裁剪区域放大后的裁剪区域裁剪区域以上所有实例都维持了图像的宽高比不变,可根据需要任意调整图像的尺寸。有时候需要获取彩色图像的单通道图像,如R通道,G通道等,这时需要使用Image类中的split()方法和getchannel()方法,在单通道图像复合时,使用函数merge()函数,它是模块中的函数,并不是类中的方法。图2-5resize函数缩放裁剪区域2.1.2调整图像尺寸与旋转其中,split()方法用于从彩色图像中提取单独的颜色通道。这一方法将图像分解成其不同的通道图像,并返回一个包含这些通道图像的元组。例如,对于RGB图像,split()方法将图像分解为红色、绿色和蓝色通道,并返回一个包含这三个通道图像的元组。对于CMYK图像,则返回四个通道图像(青色、品红色、黄色和黑色)。merge(mode,bands)是Imagem模块中的一个函数,用于将多个单通道图像合并成一个多通道图像。它接受两个参数:mode,指定目标图像的颜色模式(如'RGB'、'RGBA'),以及bands,一个包含单通道图像的列表或元组,其长度必须与mode中的通道数量匹配。例如,合并RGB图像时,bands应包含红色、绿色和蓝色通道图像。合并后的图像将按照指定的模式创建,允许重新构建彩色图像或添加透明度通道。所有单通道图像必须具有相同的尺寸,否则函数会报错。2.1.2调整图像尺寸与旋转在Image类中,使用rotate方法旋转图像。方法调用格式如下rotate(angle,resample=NEAREST,expand=0,center=None,translate=None,fillcolor=None)参数名称参数说明angle旋转的角度。必传参数,它表示图像将被旋转的角度,按逆时针方向旋转。例如,如果设置角度为90度,则图像将顺时针旋转90度。resample可选的重采样过滤器用于指定旋转时的重采样方法。可以选择使用Image.NEAREST(最近邻插值)、Image.BILINEAR(双线性插值)或Image.BICUBIC(双三次插值)expand可扩展性。这是一个布尔值参数,可传入0或1。如果设置为0,旋转后的图像将保持与原始图像相同的尺寸,可能会裁剪部分内容。如果设置为1,图像将根据旋转角度自动调整尺寸,以确保完整图像仍可见。默认情况下,它是0。2.1.2调整图像尺寸与旋转center旋转的中心。传入长度为2的元组(x,y),表示旋转中心的像素点。默认为原图的几何中心。translate平移的坐标。传入长度为2的元组(x,y),将原图按(x,y)进行平移,默认为(0,0)。fillcolor填充颜色。传入一个颜色值,颜色值可以是元组表示法,也可以是颜色的十六进制表示法或颜色英文。如上面的(0,0,255)可以换成'#0000FF'或'blue'。当图像旋转后,原图变斜了,但返回图像还是矩形的,所以空出的部分需要进行填充,默认为黑色。表2-3rotate()方法的参数2.1.2调整图像尺寸与旋转下面演示使用一个rotate()方法旋转图像的实例:fromPILimportImageimg=Image.open('pictures//xiongmao.jpg')print(img.size);img.show()img1=img.rotate(15,expand=0,fillcolor=(255,255,0))print(img1.size);img1.show()img2=img.rotate(15,expand=0,center=(0,0),fillcolor=(255,255,0))print(img2.size);img2.show()img3=img.rotate(15,expand=0,translate=(50,50),fillcolor=(255,255,0))print(img3.size);img3.show()img4=img.rotate(15,expand=1,center=(0,0),fillcolor=(255,255,0))print(img4.size);img4.show()img5=img.rotate(15,expand=1,translate=(50,50),fillcolor=(255,255,0))print(img5.size);img5.show()img6=img.rotate(15,expand=1,fillcolor=(255,255,0))print(img6.size);img6.show()img7=img.rotate(180,expand=1,fillcolor=(255,255,0))print(img7.size);img7.show()以上代码输出结果如下:(920,575)(920,575)(920,575)(920,575)(1038,794)(1039,795)(1038,795)(920,575)原图扩展,旋转180°扩展,不加偏移,不改变旋转中心扩展,加偏移扩展,改变旋转中心不扩展,改变旋转中心不扩展,加偏移不扩展图2-6使用rotate方法旋转图像2.1.2调整图像尺寸与旋转在Image类中,转置和翻转图像,也可以使用transpose()方法。方法transpose(method)返回转置后的图像副本。下面演示一个实例:fromPILimportImageimage=Image.open("pictures//xiong.jpg")image.show()image1=image.transpose(Image.FLIP_LEFT_RIGHT)image1.show()image2=image.transpose(Image.FLIP_TOP_BOTTOM)image2.show()image3=image.transpose(Image.ROTATE_90)image3.show()image4=image.transpose(Image.TRANSVERSE)image4.show()image5=image.transpose(Image.TRANSPOSE)image5.show()原图TRANSPOSETRANSVERSEROTATE_90FLIP_LEFT_RIGHTFLIP_TOP_BOTTOM图2-7使用transpose方法旋转图像2.1.3创建缩略图缩略图(thumbnailimage)即为原图像经过压缩之后的预览图像,如windows系统中,一个含有图像的文件夹打开后,呈现给用户的就是一幅幅缩略图像。用户不用点击打开图像,就可以了解一幅幅图像的大概信息,这会给用户带来很大的方便。在创建缩略图的时候,我们会用到方法resize()和thumbnail(),上一小节我们学过方法resize(),它会按照指定尺寸缩小或放大图像。但是thumbnail()方法只能缩小图像,且不会严格按照指定尺寸大小缩小图像,但是它不会改变图像的宽高比。假如原图像大小为(x1,x2),指定大小为(m1,m2),a=x1/m1,b=x1/m2。如果a>b,按照a为缩小比例来缩小图像,因为要维持图像的宽高比,所以缩小后的图像高度不会是m2。如果a<b,同理。2.1.3创建缩略图下面演示一个实例:fromPILimportImageim=Image.open("fj1.jpg")im0=im.copy();im1=im.copy();im_=im.copy()print(im.size)size0=(300,300);size1=(700,300)im0.thumbnail(size0)im1.thumbnail(size1)print(im0.size);print(im1.size)im_.paste(im0,(0,0))#将缩小后图像粘贴到原图像上im.paste(im1,(0,0))im_.show();im.show()以上代码结果输出如下:(960,540)(300,169)(533,300)300×169533×300图2-8使用thumbnail函数缩放图像2.2绘图类MatplotlibMatplotlib是python的一个绘图库,与numpy,pandas共享数据科学三剑客的美誉,也是很多高级可视化库的基础。Matplotlib不是python的内置库,调用前需要手动安装,有时候需要和numpy库结合使用。2.2.1绘制图像、点和线调用Matplotlib库绘图一般是用pyplot模块,其集成了绝大部分常用方法接口。它的内部调用了Matplotlib路径下的大部分子模块,共同完成各种丰富的绘图功能。使用Matplotlib绘图主要是理解figure(画布),axes(坐标系),axis(坐标轴)三者之间的关系。2.2.1绘制点和线图像下面演示一个简单的绘制直线图的实例:importmatplotlib.pyplotasplt#导入pyplot模块x=[0,1,2,3,4];y=xplt.xlabel("x");plt.ylabel("y")#给x,y轴取标题plt.title("y=x")#取标签plt.axis([0,5,0,5])plt.plot(x,y)plt.show()下面演示一个实例使用scatter()方法绘制散点图:importmatplotlib.pyplotaspltimportnumpyasnpdata={'a':np.arange(50),'c':np.random.randint(0,50,50),'d':np.random.randn(50)}data['b']=data['a']+10*np.random.randn(50)data['d']=np.abs(data['d'])*100x1=np.random.rand(10)y1=np.random.rand(10)x2=np.arange(10)y2=np.random.randn(10)figure=plt.figure()axes1=figure.add_subplot(221)axes2=figure.add_subplot(222)axes3=figure.add_subplot(223)axes1.scatter('a','b',c='c',s='d',data=data)axes2.scatter(x1,y1)axes3.scatter(x2,y2,color='red',marker='+')plt.show()图2-9绘制直线图2-10绘制散点图2.2.1绘制点和线图像有时候我们需要将多幅函数图像绘制在一张图像上,下面演示一个实例:importmatplotlib.pyplotaspltimportnumpyasnpfig=plt.figure()#这两行代码使得pyplot画出的图形中可以显示中文plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falseax1=fig.add_subplot(111)ax1.set(xlim=[-5,5],ylim=[-2,4],title='坐标轴示例')x1=np.arange(-4,4,0.01)y1=np.sin(x1)/x1x2=np.arange(-4,4,0.01)y2=x2**2x3=np.arange(-1,1,0.01)y3=x3**3ax1.plot(x1,y1,'r:',x2,y2,'b-.',x3,y3,'g')plt.show()图2-11同一坐标轴创建多个函数图像2.2.1绘制点和线图像在Matplotlib中,绘制多个图像需要创建一个Figure对象作为图形的容器,并在其上添加多个Axes对象,每个Axes对象代表一个子图。首先,通过plt.figure()创建一个Figure对象,然后使用fig.add_subplot()方法添加子图,例如fig.add_subplot(121)在一个1行2列的布局中创建第一个子图。另一种方法是使用fig.subplots()一次性创建多个子图,这会返回一个包含所有Axes对象的数组。每个Axes对象允许设置坐标轴属性并绘制数据。importmatplotlib.pyplotaspltimportnumpyasnpplt.rcParams["font.sans-serif"]=["SimHei"]#设置字体plt.rcParams["axes.unicode_minus"]=False#正常显示负号fig=plt.figure()ax1=fig.add_subplot(121)ax1.set(xlim=[-5,5],ylim=[-2,2],title='第一个坐标轴',ylabel='Y轴',xlabel='X轴')x=np.arange(-4,4,0.01)y=np.sin(np.pi*x)ax1.plot(x,y)ax2=fig.add_subplot(122)ax2.set(xlim=[-5,5],ylim=[-2,2],title='第二个坐标轴',ylabel='Y轴',xlabel='X轴')x=np.arange(-4,4,0.01)y=np.cos(np.pi*x)ax2.plot(x,y,color='r')plt.show()图2-12同一窗口创建多个函数图像2.2.2绘制图像轮廓和直方图绘制一些轮廓图,使用pyplot模块中的一些函数,例如contour()可以用绘制等高线,contourf()可以用来进行颜色填充,colorbar()可以用来添加颜色条,clabel()可以用来添加等高线标签。importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']#以下两行代码,用于输出中文plt.rcParams['axes.unicode_minus']=Falsestep=1x=np.arange(-4,4,step)y=np.arange(-3,3,step)X,Y=np.meshgrid(x,y)#将原始数据变成网格数据形式Z=X**2+Y**2plt.figure(figsize=(15,10))cset=plt.contourf(X,Y,Z,alpha=0.8)contour=plt.contour(X,Y,Z,colors=('red','orange'))plt.clabel(contour,fontsize=10,colors='k')#添加等高线的标签plt.colorbar(cset)plt.grid()plt.title("函数Z=X^2+Y^2等高线图")plt.show()图2-13网络数据绘制函数等高线2.2.2绘制图像轮廓和直方图绘制直方图可以使用pyplot模块中的hist函数,其比较重要的参数是density选项。当为真(True)时,纵轴y表示概率密度,即频数/(样本总数*组距);当它为假(False)时,纵轴y表示频数,也即在样本中出现的次数importnumpyasnpimportmatplotlib.pyplotaspltplt.rcParams["font.sans-serif"]=["SimHei"]#设置字体plt.rcParams["axes.unicode_minus"]=False#正常显示负号np.random.seed(10000)#随机生成1000个数,满足标准正态分布,即均值为0,标准差为1b=np.random.randn(1000)mu,sigma=100,15#数组x均值为100,标准差为15x=mu+sigma*bplt.figure(figsize=(15,6))#直方图分为40个块,density参数为真,显示概率密度,即所有直方图面积和为1n,bins,patches=plt.hist(x,40,density=True,facecolor='blue',alpha=0.8)plt.xlabel('智商');plt.ylabel('概率密度')plt.title('智商的直方图')plt.text(94,.033,r'$\mu=100,\\sigma=15$',color='g')plt.xlim(40,160);plt.ylim(0,0.04)plt.grid();plt.savefig("11.jpg",dpi=72);plt.show()图2-14直方图(纵轴y是概率密度)2.2.3图像交互式标注在使用matplolib库画图像时,我们常常会添加一些注释使得图像的说明性更好。基本的设置属性,如设置坐标轴刻度,添加图像标题,添加曲线标签等我们在第一小节的一些实例中已经涉及,下面演示一个实例:importnumpyasnpimportmatplotlib.pylabasplt#这两行代码使得pyplot画出的图形中可以显示中文plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#创建一个8*8点(point)的图plt.figure(figsize=(10,10),dpi=80)X=np.linspace(-np.pi*2,np.pi*2,256,endpoint=True)C,S=np.cos(X),np.sin(X)#绘制余弦曲线,使用蓝色的、连续的、宽度为1的线条plt.plot(X,C,color='red',linewidth=3.0,linestyle='-',label='y=cos(x)')#绘制余弦曲线,使用蓝色的、连续的、宽度为1的线条plt.plot(X,S,color='green',linewidth=3.0,linestyle='-',label='y=sin(x)')#设置横轴、纵轴刻度plt.xticks(np.linspace(-np.pi*2,np.pi*2,9,endpoint=True),fontproperties='TimesNewRoman',size=20)plt.yticks(np.linspace(-1,1,5,endpoint=True),fontproperties='TimesNewRoman',size=20)#设置横纵坐标的名称以及对应字体格式font={'family':'TimesNewRoman','weight':'normal','size':20}plt.xlabel('X',font)#设置横轴标签plt.ylabel('Y',font)#设置纵轴标签plt.title('Python画三角函数',size=20)#设置图像标题plt.legend(loc='lowerleft',prop={'size':20})#设置曲线标签显示的位置和大小#plt.grid()#设置图像网格plt.show()
图2-15图像简单标注2.3科学计算类库NumPyNumPy是Python语言的一个扩展程序库,其拥有一个类似于列表的、强大的n维数组对象ndarray,具有矢量运算和多维数组操作能力。其中提供了许多向量和矩阵操作,能让用户轻松完线性代数、积分、常微分方程求解以及其他科学与工程中常用的计算,不仅方便易用而且效率更高。2.3.1图像数组表示根据图像处理的知识可知,一副RGB彩色图像的数据通常是三维的,而灰度图像和二值图像的数据通常是二维的。下面结合PIL库中Image模块演示一个例子。importnumpyasnpfromPILimportImageimg=Image.open('cat.png')img.show()img=np.array(img)print(img.shape,img.dtype)print(img[:2,:4,:])#转换为灰度图像img2=Image.open('cat.png').convert('L')img2.show()img2=np.array(img2)print(img2.shape,img2.dtype)print(img2[:2,:4])(400,600,3)uint8[[[486974][426368][385764][355461]]
[[497075][436470][365663][335360]]]
(400,600)uint8[[63575249][64585148]]代码输出如下
RGB原图灰度图图2-16图像转换2.3.2图像灰度转换在图像处理的学习中,我们经常会遇到将彩色RGB图像转换为灰度图像,数据维度上的区别在于,RGB图像是一个三维数组,而灰度图像是一个二维数组。我们可以直接调用PIL库中Image模块中convert函数转换,也可根据公式,通过NumPy库中的函数来计算灰度像素值来转换。下面演示一个实例。fromPILimportImageimportnumpyasnpimg=Image.open('cat.png')
#转换数据格式为ndarray类型img=np.array(img)'''计算公式:L=0.299*R+0.587*G+0.114*B'''img_l=np.dot(img[...,:3],[0.299,0.587,0.114])#转换数据类型为uint8img_l=img_l.astype(np.uint8)img=Image.fromarray(img_l)img.show()
#直接调用函数生成img2=Image.open('cat.png').convert('L')img2.show()调用函数生成公式计算生成图2-17图像灰度转换2.3.3直方图均衡化直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强目的。2.3.3直方图均衡化对一幅灰度图像,其直方图反映了该图像中不同灰度级出现的统计情况。图2-18给出了一个直方图的示例,左图是一幅图像,其灰度直方图可表示为右图,其中横轴表示图像的各灰度级,纵轴表示图像中各灰度级像素的个数。需要注意,灰度直方图表示了在图像中各个单独灰度级的分布,而图像对比度则取决于相邻近像素之间灰度级的关系。图2-18统计图像灰度级2.3.3直方图均衡化
直方图均衡化操作可用公式(2-1)来计算,其中S是总的像素数,Zmax是像素的最大取值(8位灰度图像为255),h(i)为图像像素取值为i
及小于i
的像素的总数。(2-1)2.3.3直方图均衡化下面演示一个灰度图像的直方图均衡化实例:importcv2importnumpyasnpimportmatplotlib.pyplotasplt#用于显示中文标题plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#直方图均衡化defequalization(img,z_max=255): H,W=img.shape S=H*W*1. out=img.copy() sum_h=0. foriinrange(1,255): ind=np.where(img==i) sum_h+=len(img[ind]) z_prime=z_max/S*sum_h out[ind]=z_prime out=out.astype(np.uint8) returnout
img=cv2.imread("cat2.png",0)plt.subplot(2,1,1)plt.hist(img.ravel(),bins=255,rwidth=0.8,range=(0,255),label='原图',color='red')plt.legend(loc=2)plt.title("灰度直方图对比")img=img.astype(np.float64)out=equalization(img)plt.subplot(2,1,2)plt.hist(out.ravel(),bins=255,rwidth=0.8,range=(0,255),label='均衡化后',color='blue')plt.legend(loc=2)plt.savefig("hist.png")plt.show()cv2.imshow("result",out)cv2.imwrite("out.png",out)cv2.waitKey(0)cv2.destroyAllWindows()原始图像直方图均衡化
图2-19操作前后灰度直方图对比图2-20均衡化前后图像对比2.3.4图像主成分分析PCA主成分分析(PrincipalComponentAnalysis,PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。PCA算法思想在于最大方差理论。方差越大,信息量就越大。协方差矩阵的每一个特征向量就是一个投影面,每一个特征向量所对应的特征值就是原始特征投影到这个投影面之后的方差。由于投影过去之后,我们要尽可能保证信息不丢失,所以要选择具有较大方差的投影面对原始特征进行投影,也就是选择具有较大特征值的特征向量。然后将原始特征投影在这些特征向量上,投影后的值就是新的特征值。每一个投影面生成一个新的特征,k个投影面就生成k个新特征。2.3.4图像主成分分析PCA假设有M个样本{X¹,X²,X³,...,XM}每个样本有N维特征Xi=(xi1,xi2,...,xiN)T这里以两个特征属性为例,如下图所示。(1)对所有特征进行中心化:去均值。x1特征的平均值:x1=(1+3+2+4+5)/5=3x2特征的平均值:x2=(-1+0+2+4+1)/5=1.2x3特征的平均值:x3=(3+2+2+4+1)/5=2.4将上述三个样本的每个特征值减去各自样本特征的平均值,结果如图所示。
图2-21样本表格图2-22特征值均值化2.3.4图像主成分分析PCA
其中,conv(x1,x1)计算公式(2-3)如下,其他同理。(2-2)(2-3)2.3.4图像主成分分析PCA
2.3.4图像主成分分析PCA(3)求协方差矩阵C的特征值和相对应的特征向量。
利用矩阵知识Cu=λu,求解协方差矩阵C的特征值和相对应的特征向量u。
计算得出的三个特征值如下
[4.782545242.276600140.44085462]
对应的特征向量如下
[[-0.52159279-0.691557750.49968874]
[-0.841208860.31901482-0.43657439]
[-0.142508290.648056650.74814034]]2.3.4图像主成分分析PCA
2.3.4图像主成分分析PCA
2.4数值运算类库SciPySciPy是一个用于高级科学计算的Python库,它构建在NumPy的基础之上,提供了各种功能强大的模块和函数,用于解决科学、工程和数据分析领域的各种数学、统计和工程问题。它包括了优化、积分、线性代数、傅里叶变换、信号处理、图像处理、统计分析等模块,使得在Python中进行复杂的科学计算和数据分析变得更加容易。SciPy库包含着许多子模块,不同的子模块可以实现不同的功能。其中常用的子模块如表2-4所示。子模块功能SciPy.cluster用于向量计算和聚类分析SciPy.fftpack傅里叶变换SciPegrate积分和微分SciPy.linalg线性代数SciPy.optimize优化和求根SciPy.signal信号处理SciPerpolate插值SciPy.sparse稀疏矩阵SciPy.stats统计SciPy.ndim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 16262.4-2025信息技术抽象语法记法一(ASN.1)第4部分:ASN.1规范的参数化
- 外部审计的重要性与目的试题及答案
- 办公室装修协议
- 微生物检验技师基础知识试题及答案
- 注册会计师实务中的定量分析与试题及答案
- 注册会计师考试影响因素分析试题及答案
- 特许金融分析师考试实践总结试题及答案
- 行政管理师考试常见知识题及答案
- 证券从业资格证考试倍增记忆法试题及答案
- 2025年考试的新变化分析试题及答案
- 耳穴压豆治疗失眠
- 人教版九年级化学下册实验题专项训练含答案
- 【学考试卷】2023年6月 福建省学考英语真题及答案
- 建筑施工职业病危害因素识别、分析及预防
- 《民宿管家》课件-项目四 创意策划与活动组织
- 政策评估的理论、模型与方法
- 国家税务总局个人所得税培训
- 2024年江苏省南通市交通运输综合行政执法支队招聘20人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 吲达帕胺片在心血管疾病中的应用
- 无人机故障应急预案
- 工程设备安装及调试、运行方案
评论
0/150
提交评论