yyzn  2022-04-06 14:11:02  图像处理 |   查看评论   

生成一张纯色的图片

先设置图片的颜色,接着利用Image模块的new方法新生成一张图片,png格式的图片需要设置成rgba,类似的还有rgb,L(灰度图等),尺寸设定为640,480,这个可以根据自己的情况设定,颜色同样如此。

批量生成图片

上面生成了一张图片,那要生成十张图片呢,这种步骤一样,只是颜色改变的,利用循环就可以解决。首先创建一个颜色列表,把要生成的图片颜色放进去。接着循环获取不同的颜色,保存的时候利用字符串拼接的方法改变图片的名字。

本地生成的图片

封装成函数

前面的方法已经可以批量生成图片了,为了通用性强一点,我们可以封装成函数,把哪些可以改变的参数单独抽离出来。尺寸也同样,使用的时候,可以根据自己的需要定义颜色列表和尺寸。当然还有加一些提示用语和报错兼容性,这里就不讲了。

本地生成的图片

目录1.机器是如何存储图像的?2.在Python中读取图像数据3.从图像数据中提取特征的方法#1:灰度像素值特征4.从图像数据中提取特征的方法#2:通道的平均像素值5.从图像数据中提取特征的方法#3:提取边缘是一张数字8的图像,仔细观察就会发现,图像是由小方格组成的。这些小方格被称为像素。但是要注意,人们是以视觉的形式观察图像的,可以轻松区分边缘和颜色,从而识别图片中的内容。然而机器很难做到这一点,它们以数字的形式存储图像。请看下图:机器以数字矩阵的形式储存图像,矩阵大小取决于任意给定图像的像素数。假设图像的尺寸为180 x 200或n x m,这些尺寸基本上是图像中的像素数(高x宽)。这些数字或像素值表示像素的强度或亮度,较小的数字(接近0)表示黑色,较大的数字(接近255)表示白色。通过分析下面的图像,读者就会弄懂到目前为止所学到的知识。下图的尺寸为22 x 16,读者可以通过计算像素数来验证:图片源于机器学习应用课程刚才讨论的例子是黑白图像,如果是生活中更为普遍的彩色呢?你是否认为彩色图像也以2D矩阵的形式存储?彩色图像通常由多种颜色组成,几乎所有颜色都可以从三原色(红色,绿色和蓝色)生成。因此,如果是彩色图像,则要用到三个矩阵(或通道)――红、绿、蓝。每个矩阵值介于0到255之间,表示该像素的颜色强度。观察下图来理解这个概念:图片源于机器学习应用课程左边有一幅彩色图像(人类可以看到),而在右边,红绿蓝三个颜色通道对应三个矩阵,叠加三个通道以形成彩色图像。请注意,由于原始矩阵非常大且可视化难度较高,因此这些不是给定图像的原始像素值。此外,还可以用各种其他的格式来存储图像,RGB是最受欢迎的,所以笔者放到这里。读者可以在此处阅读更多关于其他流行格式的信息。用Python读取图像数据下面开始将理论知识付诸实践。启动Python并加载图像以观察矩阵:import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inlinefrom skimage.io import imread, imshowimage = imread('image_8_original.png', as_gray=True)imshow(image)#checking image shape image.shape, image(28,28)矩阵有784个值,而且这只是整个矩阵的一小部分。用一个LIVE编码窗口,不用离开本文就可以运行上述所有代码并查看结果。下面来深入探讨本文背后的核心思想,并探索使用像素值作为特征的各种方法。方法#1:灰度像素值特征从图像创建特征最简单的方法就是将原始的像素用作单独的特征。考虑相同的示例,就是上面那张图(数字‘8’),图像尺寸为28×28。能猜出这张图片的特征数量吗?答案是与像素数相同!也就是有784个。那么问题来了,如何安排这784个像素作为特征呢?这样,可以简单地依次追加每个像素值从而生成特征向量。如下图所示:下面来用Python绘制图像,并为该图像创建这些特征:image = imread('puppy.jpeg', as_gray=True) image.shape, imshow(image)(650,450)该图像尺寸为650×450,因此特征数量应为297,000。可以使用NumPy中的reshape函数生成,在其中指定图像尺寸:#pixel featuresfeatures = np.reshape(image, (660*450))features.shape, features(297000,)array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588, 0.96470588])这里就得到了特征――长度为297,000的一维数组。很简单吧?在实时编码窗口中尝试使用此方法提取特征。但结果只有一个通道或灰度图像,对于彩色图像是否也可以这样呢?来看看吧!方法#2:通道的平均像素值在读取上一节中的图像时,设置了参数‘as_gray = True’,因此在图像中只有一个通道,可以轻松附加像素值。下面删除参数并再次加载图像:image = imread('puppy.jpeg') image.shape(660, 450, 3)这次,图像尺寸为(660,450,3),其中3为通道数量。可以像之前一样继续创建特征,此时特征数量将是660*450*3 = 891,000。或者,可以使用另一种方法:生成一个新矩阵,这个矩阵具有来自三个通道的像素平均值,而不是分别使用三个通道中的像素值。下图可以让读者更清楚地了解这一思路:这样一来,特征数量保持不变,并且还能考虑来自图像全部三个通道的像素值。image = imread('puppy.jpeg')feature_matrix = np.zeros((660,450)) feature_matrix.shape(660, 450)现有一个尺寸为(660×450×3)的三维矩阵,其中660为高度,450为宽度,3是通道数。为获取平均像素值,要使用for循环:for i in range(0,iimage.shape[0]): for j in range(0,image.shape[1]): feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)新矩阵具有相同的高度和宽度,但只有一个通道。现在,可以按照与上一节相同的步骤进行操作。依次附加像素值以获得一维数组:features = np.reshape(feature_matrix, (660*450)) features.shape(297000,)方法#3:提取边缘特征请思考,在下图中,如何识别其中存在的对象:识别出图中的对象很容易――狗、汽车、还有猫,那么在区分的时候要考虑哪些特征呢?形状是一个重要因素,其次是颜色,或者大小。如果机器也能像这样识别形状会怎么样?类似的想法是提取边缘作为特征并将其作为模型的输入。稍微考虑一下,要如何识别图像中的边缘呢?边缘一般都是颜色急剧变化的地方,请看下图:笔者在这里突出了两个边缘。这两处边缘之所以可以被识别是因为在图中,可以分别看到颜色从白色变为棕色,或者由棕色变为黑色。如你所知,图像以数字的形式表示,因此就要寻找哪些像素值发生了剧烈变化。假设图像矩阵如下:图片源于机器学习应用课程该像素两侧的像素值差异很大,于是可以得出结论,该像素处存在显著的转变,因此其为边缘。现在问题又来了,是否一定要手动执行此步骤?当然不!有各种可用于突出显示图像边缘的内核,刚才讨论的方法也可以使用Prewitt内核(在x方向上)来实现。以下是Prewitt内核:获取所选像素周围的值,并将其与所选内核(Prewitt内核)相乘,然后可以添加结果值以获得最终值。由于±1已经分别存在于两列之中,因此添加这些值就相当于获取差异。还有其他各种内核,下面是四种最常用的内核:图片源于机器学习应用课程现在回到笔记本,为同一图像生成边缘特征:#importing the required librariesimport numpy as npfrom skimage.io import imread, imshowfrom skimage.filters import prewitt_h,prewitt_vimport matplotlib.pyplot as plt%matplotlib inline#reading the image image = imread('puppy.jpeg',as_gray=True)#calculating horizontal edges using prewitt kerneledges_prewitt_horizontal = prewitt_h(image)#calculating vertical edges using prewitt kerneledges_prewitt_vertical = prewitt_v(image)imshow(edges_prewitt_vertical, cmap='gray')

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自python处理图片数据?

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]