‘壹’ python如何获取图片长宽等信息
使用PIL模块,windows安装包下载:
http://www.pythonware.com/procts/pil/
使用方法
#coding:utf8
#获取指定图片的长和宽
fromPILimportImage
img=Image.open("img.jpg")
printimg.size
运行结果:
(52,54)
‘贰’ python 创建固定大小的图片
不知道你对图片的格式有没有要求,如果是bmp的话是没有压缩的。也就是说大小和颜色深度决定了图片的大小。这样也比较容易控制。当然也就不能不改size随便调节文件的大小。
如果是jpg的话,可以通过改变图片的质量来调节文件的大小。
比如
im = Image.open("aa.JPG")
print im.format, im.size, im.mode
print im.size[0]
im.resize((720,540), Image.ANTIALIAS).save('a.jpg', quality = 95)
你也可以做一个循环,对生成的文件大小与目标大小做比较,直到满足条件为止。
只是给个思路,也许帮不上忙。
‘叁’ python处理图片数据
目录
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怎么编辑画出的图形大小
pli模块。
‘伍’ python如何固定图片像素的大小
你是想固定图片的大小的话,可以利用opencv读取图片后,resize到你想要的大小,再保存到本地。
‘陆’ python中PLE调整图片大小,等比例压缩文件,怎么写代码
How do I read image data from a URL in Python?
importosimportImagefileName='c:/py/jb51.jpg'fp=open(fileName,'rb')im=Image.open(fp)fp.close()x,y=im.sizeifx <300or y <300:os.remove(fileName)from PIL import Imageimport requestsimport numpy as npfrom StringIO import StringIOresponse = requests.get(url)img = np.array(Image.open(StringIO(response.content)))
from PIL import Imageimport urllib2
im = Image.open(urllib2.urlopen(url))
or if you userequests:
from PIL import Imageimport requests
im = Image.open(requests.get(url, stream=True).raw)
[python] view plain
[html] view plain
#coding:utf-8
'''
python图片处理
'''
importImageasimage
#等比例压缩图片
defresizeImg(**args):
args_key={'ori_img':'','dst_img':'','dst_w':'','dst_h':'','save_q':75}
arg={}
forkeyinargs_key:
ifkeyinargs:
arg[key]=args[key]
im=image.open(arg['ori_img'])
ori_w,ori_h=im.size
widthRatio=heightRatio=None
ratio=1
if(ori_wandori_w>arg['dst_w'])or(ori_handori_h>arg['dst_h']):
ifarg['dst_w']andori_w>arg['dst_w']:
widthRatio=float(arg['dst_w'])/ori_w#正确获取小数的方式
ifarg['dst_h']andori_h>arg['dst_h']:
heightRatio=float(arg['dst_h'])/ori_h
ifwidthRatioandheightRatio:
ifwidthRatio<heightRatio:
ratio=widthRatio
else:
ratio=heightRatio
ifwidthRatioandnotheightRatio:
ratio=widthRatio
ifheightRatioandnotwidthRatio:
ratio=heightRatio
newWidth=int(ori_w*ratio)
newHeight=int(ori_h*ratio)
else:
newWidth=ori_w
newHeight=ori_h
im.resize((newWidth,newHeight),image.ANTIALIAS).save(arg['dst_img'],quality=arg['save_q'])
'''
image.ANTIALIAS还有如下值:
NEAREST:usenearestneighbour
BILINEAR:
BICUBIC:
ANTIALIAS:bestdown-sizingfilter
'''
#裁剪压缩图片
defclipResizeImg(**args):
args_key={'ori_img':'','dst_img':'','dst_w':'','dst_h':'','save_q':75}
arg={}
forkeyinargs_key:
ifkeyinargs:
arg[key]=args[key]
im=image.open(arg['ori_img'])
ori_w,ori_h=im.size
dst_scale=float(arg['dst_h'])/arg['dst_w']#目标高宽比
ori_scale=float(ori_h)/ori_w#原高宽比
ifori_scale>=dst_scale:
#过高
width=ori_w
height=int(width*dst_scale)
x=0
y=(ori_h-height)/3
else:
#过宽
height=ori_h
width=int(height*dst_scale)
x=(ori_w-width)/2
y=0
#裁剪
box=(x,y,width+x,height+y)
#这里的参数可以这么认为:从某图的(x,y)坐标开始截,截到(width+x,height+y)坐标
#所包围的图像,crop方法与php中的image方法大为不一样
newIm=im.crop(box)
im=None
#压缩
ratio=float(arg['dst_w'])/width
newWidth=int(width*ratio)
newHeight=int(height*ratio)
newIm.resize((newWidth,newHeight),image.ANTIALIAS).save(arg['dst_img'],quality=arg['save_q'])
#水印(这里仅为图片水印)
defwaterMark(**args):
args_key={'ori_img':'','dst_img':'','mark_img':'','water_opt':''}
arg={}
forkeyinargs_key:
ifkeyinargs:
arg[key]=args[key]
im=image.open(arg['ori_img'])
ori_w,ori_h=im.size
mark_im=image.open(arg['mark_img'])
mark_w,mark_h=mark_im.size
option={'leftup':(0,0),'rightup':(ori_w-mark_w,0),'leftlow':(0,ori_h-mark_h),
'rightlow':(ori_w-mark_w,ori_h-mark_h)
}
im.paste(mark_im,option[arg['water_opt']],mark_im.convert('RGBA'))
im.save(arg['dst_img'])
#Demon
#源图片
ori_img='D:/tt.jpg'
#水印标
mark_img='D:/mark.png'
#水印位置(右下)
water_opt='rightlow'
#目标图片
dst_img='D:/python_2.jpg'
#目标图片大小
dst_w=94
dst_h=94
#保存的图片质量
save_q=35
#裁剪压缩
clipResizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h,save_q=save_q)
#等比例压缩
#resizeImg(ori_img=ori_img,dst_img=dst_img,dst_w=dst_w,dst_h=dst_h,save_q=save_q)
#水印
#waterMark(ori_img=ori_img,dst_img=dst_img,mark_img=mark_img,water_opt=water_opt)
‘柒’ python opencv中imshow输出图像太大,如何调整输出尺寸
通过resize重置图片尺寸
参数:图片,输出图片尺寸(一般我不用这个,我传None),宽的比例,高的比例
例子:将图片img,缩小一半显示,那么宽高为原尺寸的0.5倍
img = cv2.resize(img,None,fx=0.5,fy=0.5)
设置完尺寸后再显示
cv2.imshow('img',img)
cv2.waitKey(0)
.......
希望我的回答对你有帮助!
‘捌’ 怎样调整python图形界面的大小
Python有自己内置的标准GUI库--Tkinter,只要安装好Python就可以调用。今天学习到了图形界面设计的问题,刚开始就卡住了。为啥
呢?就是用geometry(size)设置窗口尺寸大小,如800X600,“X”从哪里来成了问题。首先想到,这是个乘号,但是在程序中没有插
入特殊符号这一说啊。所以,插入特殊符号的方法肯定不行了。然后我心血来潮,从word的公式里复制了一个乘号过来(我也是服了我
自己了),运行程序,可想而知,报错没商量。看来求助外面是没用了。必须在Python内部解决,好,接下来就试了大写的“X”,oh
my god!继续报错。莫非是不能用字母代替?我竟然在这里打住了!其实再走一步就成功了!那就是试试小x。有的时候,路是被自己堵
住的。下面就通过书中的简单程序走一下这个简单的尺寸设置问题。
一、默认大小尺寸显示
二、设置尺寸大小为800x600
这样就实现了尺寸大小的调整。
更多技术请关注Python视频教程。
‘玖’ python可以用来处理图像吗
可以的,
PythonWare公司提供了免费的Python图像处理工具包PIL(Python Image Library),该软件包提供了基本的图像处理功能,如:
改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。虽然在这个软件包上要实现类似MATLAB中的复杂的图像处理算法并不太适合,但是Python的快速开发能力以及面向对象等等诸多特点使得它非常适合用来进行原型开发。
在PIL中,任何一副图像都是用一个Image对象表示,而这个类由和它同名的模块导出,因此,最简单的形式是这样的:
import Image img = Image.open(“dip.jpg”)
注意:第一行的Image是模块名;第二行的img是一个Image对象;
Image类是在Image模块中定义的。关于Image模块和Image类,切记不要混淆了。现在,我们就可以对img进行各种操作了,所有对img的
操作最终都会反映到到dip.img图像上。
PIL提供了丰富的功能模块:Image,ImageDraw,ImageEnhance,ImageFile等等。最常用到的模块是
Image,ImageDraw,ImageEnhance这三个模块。下面我对此分别做一介绍。关于其它模块的使用请参见说明文档.有关PIL软件包和
相关的说明文档可在PythonWare的站点www.Pythonware.com上获得。
Image模块:
Image模块是PIL最基本的模块,其中导出了Image类,一个Image类实例对象就对应了一副图像。同时,Image模块还提供了很多有用的函数。
(1)打开一文件:
import Image img = Image.open(“dip.jpg”)
这将返回一个Image类实例对象,后面的所有的操作都是在img上完成的。
(2)调整文件大小:
import Image img = Image.open("img.jpg") new_img = img.resize
((128,128),Image.BILINEAR) new_img.save("new_img.jpg")
原来的图像大小是256x256,现在,保存的new_img.jpg的大小是128x128。
就是这么简单,需要说明的是Image.BILINEAR指定采用双线性法对像素点插值。
在批处理或者简单的Python图像处理任务中,采用Python和PIL(Python Image Library)的组合来完成图像处理任务是一个很不错的选择。设想有一个需要对某个文件夹下的所有图像将对比度提高2倍的任务。用Python来做将是十分简单的。当然,我也不得不承认Python在图像处理方面的功能还比较弱,显然还不适合用来进行滤波、特征提取等等一些更为复杂的应用。我个人的观点是,当你要实现这些“高级”的算法的时候,好吧,把它交给MATLAB去完成。但是,如果你面对的只是一个通常的不要求很复杂算法的图像处理任务,那么,Python图像处理应该才是你的最佳搭档。
‘拾’ 如何用Python方法获取图片的准确尺寸
先安装pillow库
然后运行:
from PIL import Image
img = Image.open('图片路径')
print(img.size)
返回的是图片的 高×宽