python处理图片数据?

作者&投稿:刘宽 (若有异议请与网页底部的电邮联系)
如何用python提取图片中数值?~

这个还是比较难的
问题关键不在数值
而是你怎么识别出线条和原点

用image模块更直接,可以用getpixel获得像素值,给你个例子吧。
01.#!/usr/bin/env python
02.import Image
03.import sys
04.im = Image.open(sys.argv[1])
05.width = im.size[0]
06.height = im.size[1]
07.print "/* width:%d */"%(width)
08.print "/* height:%d */"%(height)
09.count = 0
10.for h in range(0, height):
11. for w in range(0, width):
12. pixel = im.getpixel((w, h))
13. for i in range(0,3):
14. count = (count+1)%16
15. if (count == 0):
16. print "0x%02x,/n"%(pixel[i]),
17. else:
18. print "0x%02x,"%(pixel[i]),

生成一张纯色的图片

先设置图片的颜色,接着利用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 pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = 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 features

features = 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 libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline

#reading the image
image = imread('puppy.jpeg',as_gray=True)

#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)

imshow(edges_prewitt_vertical, cmap='gray')


python怎么用PIL模块处理BMP图像 二值化
遍历图片对象?可是怎么个遍历法呢?Pillow 提供了一个 .load() 方法,用来处理像素。图片嘛,当然是二维的,有宽和高的。pixels = image.load()for x in ramge(image.width):for y in range(image.height):pixsels[x, y] = 255 if pixsels[x, y] > 125 else 0 当然了,只是最简单的...

python通过format给图片名称加个前缀
1、启动图像批量处理工具以及图片文件。2、右键调出菜单下拉框。3、点击菜单里的批处理按钮。4、.出现批处理窗口后就可以批量给图片名称添加前缀了。

Python可以用来做什么有趣的事情?
2、查询资料 学会Python之后,很容易通过几行代码在网络上爬取各种各样的资源。目前有很多工作,都会招一些查阅汇总资料的兼职。学会Python的小白,便可以利用业余时间,通过Python帮助个人或者一些公司企业进行资料搜罗整理,还可以赚一笔小钱丰富自己的生活。3、P图 通过Python可以利用相关代码进行批量处理图片...

数字图像处理基于Python如何数一张图片的物体有多少个?
如果要使用Python进行数字图像处理,可以使用OpenCV库来数一张图片的物体有多少个。下面是一个简单的例子,可以使用OpenCV库来数一张图片中的小球数量:import cv2 读取图片 img = cv2.imread("balls.jpg")将图片转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)使用阈值分割法,得到二值...

python怎么添加图片角色
安装PIL库、导入所需模块、打开背景图片、打开角色图片、调整角色大小、将角色粘贴到背景上、保存合成后的图片。1、安装PIL库:安装PIL库,可以使用pip进行安装。2、导入所需模块:在Python代码中,需要导入PIL库中的Image和ImageDraw模块。3、打开背景图片:使用Image模块的open()函数打开背景图片。4、打开...

在Python中如何添加背景图?
创建窗口并显示背景图片。可以使用pygame.display.set_mode()函数创建窗口,然后使用blit()函数将背景图片绘制到窗口上。例如:pythonCopy codewindow = pygame.display.set_mode((800, 600))window.blit(background_image, (0, 0))pygame.display.flip()在上述代码中,我们创建了一个大小为800x600像素...

怎么用python把多个图片变成gif 格式?
解决这个问题需要用到PIL库 from PIL import Imageimport os第一步 获得所有图像文件列表,过滤不需要扩展名 filelist = [] path = os.getcwd()files = os.listdir(path)for f in files: if(os.path.isfile(path + '\/' + f)): if (os.path.splitext(f)[1] == ".BMP"): ...

python plt.imshow 怎么用
用法以既步骤:1、给出一张图片。2、用python读取图片:img = mpimg.imread('a.gif')注意:这里的gif就是上图,虽然是gif格式,但却只有一帧图片,因此是可以读取的;img实际上是一个多维列表。把数组在转化为图片:plt.imshow(img):3、img[:,:,1]是一个单通道图像,应该是灰度图,但是...

自学Python能干些什么副业
自学Python能干的副业:1、兼职处理数据,Python在搜集整理分析数据的过程中更加便捷;2、兼职查询资料,很容易通过几行代码在网络上爬取各种各样的资源;3、兼职P图,通过Python可以利用相关代码进行批量处理图片。自学Python能干的副业:1、兼职处理数据互联网时代下,越来越多的人离不开电脑办公。而与电脑...

python两个图片的坐标判断图片是否平移
判断两个图片是否平移可以通过比较图片中特定点的坐标来进行。在Python中,可以使用图像处理库(例如OpenCV)来实现这个功能。首先,需要选择两个图片中相对固定的特征点,比如角点或者明显的物体轮廓。然后,通过相应的图像处理算法(例如角点检测算法或特征匹配算法),提取这些特征点的坐标信息。接下来,对...

罗山县13185946671: python可以用来处理图像吗 -
印肤朗悦: 可以的, PythonWare公司提供了免费的Python图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等.虽然...

罗山县13185946671: 怎样利用Python进行图片分析 -
印肤朗悦: from PIL import Image ### 此处为导出包,注意字母大小写 import os, os.path# 指明被遍历的文件夹 rootdir =os.path.abspath(os.curdir)+'/Image/' rootdir1=os.path.abspath(os.pardir)+"/Image/"#打包用 if os.path.isdir(rootdir):pass else:rootdir...

罗山县13185946671: 怎样使用Python图像处理 -
印肤朗悦: 安装一个 PIL(python imageing Library) 拥有常见的操作 缩放 模糊 旋转 切片 滤镜 输出文字 调色板 等等

罗山县13185946671: 使用python PIL处理图片.怎么获取图片的像素数据? -
印肤朗悦: 用image模块更直接,可以用getpixel获得像素值,给你个例子吧. 01.#!/usr/bin/env python 02.import Image 03.import sys 04.im = Image.open(sys.argv[1]) 05.width = im.size[0] 06.height = im.size[1] 07.print "/* width:%d */"%(width) 08.print "/* ...

罗山县13185946671: 如何实现用python处理app上传的图片? -
印肤朗悦: 接收到图片之后讲图片保存到服务器上,然后返回给app端图片的路径即可.

罗山县13185946671: 写一个Python脚本批处理图片? -
印肤朗悦: · 找出所有图片 · PIL 载入图片 · 判断图片是否需要编辑 · 如需要,进行编辑 · 保存 · 回到第二步.

罗山县13185946671: python图像处理初学者求助 -
印肤朗悦: Pillow是Python里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等. 1)使用 Image 类 PIL最重要的类是 Image class, 你可...

罗山县13185946671: 请问可以用python实现将大图片变成小图片处理吗,这边要做一个图像识别,太大的分辨率运行慢 -
印肤朗悦: python有一个图像处理库——PIL,可以处理图像文件.PIL提供了功能丰富的方法,比如格式转换、旋转、裁剪、改变尺寸、像素处理、图片合并等等等等,非常强大.举个简单的例子,调整图片的大小:12345678910111213141516171819 ...

罗山县13185946671: 可用python语言做图像处理入门吗? -
印肤朗悦: python 很适合做图像处理.有一个第三方类库 PLI .

罗山县13185946671: python图像处理opencv cv.createimage怎么用 -
印肤朗悦: 在处理图片的时候,经常会需要把一些信息直接以文字的形式输出在图片上,下面的代码将实现这个效果:import cv2.cv as cv image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网