Python怎么分析图片属性

2021-06-07 14:18发布

想要批量分析图片的属性,比如构图方式、色彩(对比度、饱和度、色调、色温什么的),请问有什么方法推荐吗

想要批量分析图片的属性,比如构图方式、色彩(对比度、饱和度、色调、色温什么的),请问有什么方法推荐吗

10条回答
樱田妮妮NiNi
2楼 · 2021-06-08 11:48

Python读取图片属性信息的实现方法


这篇文章介绍了利用Python读取图片属性信息的方法,读取的内容包括GPS 信息、图片分辨率、图片像素、设备商、拍摄设备等,有需要的朋友们可以参考借鉴。


本文是利用Python脚本读取图片信息,有几个说明如下:


1、没有实现错误处理


2、没有读取所有信息,大概只有 GPS 信息、图片分辨率、图片像素、设备商、拍摄设备等


3、简单修改后应该能实现暴力修改图片的 GPS 信息


4、但对于本身没有 GPS 信息的图片,实现则非常复杂,需要仔细计算每个描述符的偏移量

yuixan
3楼 · 2021-06-08 13:56
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=rootdir1

size = 315, 560
i=0

for parent,dirnames,filenames in os.walk(rootdir): 
    for filename in filenames:
        infile=os.path.join(parent,filename)
        im = Image.open(infile)   ### 此处Image.open(dir)为多数对象应用的基础.
        im.thumbnail(size)  ### 此处size 为长度为2的tuple类型,改变图片分辨率
        im.save(infile) ### im.save(dir),图片处理的最后都用这个,就是保存处理过后的图片
        i+=1
        print(i,"Done")要用pil包 安装如下:pip install pillow

.微信截图_20210609105947.png

猫的想法不敢猜
5楼 · 2021-06-14 14:28

对于本身没有 GPS 信息的图片,实现则非常复杂,需要仔细计算每个描述符的偏移量脚本运行后,读取结果如下

脚本读取的信息这里和 Windows 属性查看器读到的内容完全一致

c6d8cb3bda7d4ca476398a62fa6b4566.pngeb12c2dd78ff7df06e62398a3dcb2cef.png

源码如下 # -*- coding:utf-8 -*-


import binascii


class ParseMethod(object):


@staticmethod


def parse_default(f, count, offset):


pass


@staticmethod


def parse_latitude(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


latitude = [0,0,0]


for i in xrange(count):


byte = f.read(4)


numerator = byte.encode('hex')


byte = f.read(4)


denominator = byte.encode('hex')


latitude[i] = float(int(numerator, 16)) / int(denominator, 16)


print 'Latitude:\t%.2f %.2f\' %.2f\"' % (latitude[0], latitude[1], latitude[2])


f.seek(old_pos)


@staticmethod


def parse_longtitude(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


longtitude = [0,0,0]


for i in xrange(count):


byte = f.read(4)


numerator = byte.encode('hex')


byte = f.read(4)


denominator = byte.encode('hex')


longtitude[i] = float(int(numerator, 16)) / int(denominator, 16)


print 'Longtitude:\t%.2f %.2f\' %.2f\"' % (longtitude[0], longtitude[1], longtitude[2])


f.seek(old_pos)


@staticmethod


def parse_make(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(count)


a = byte.encode('hex')


print 'Make:\t\t' + binascii.a2b_hex(a)


f.seek(old_pos)


@staticmethod


def parse_model(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(count)


a = byte.encode('hex')


print 'Model:\t\t' + binascii.a2b_hex(a)


f.seek(old_pos)


@staticmethod


def parse_datetime(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(count)


a = byte.encode('hex')


print 'DateTime:\t' + binascii.a2b_hex(a)


f.seek(old_pos)


# rational data type, 05


@staticmethod


def parse_xresolution(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(4)


numerator = byte.encode('hex')


byte = f.read(4)


denominator = byte.encode('hex')


xre = int(numerator, 16) / int(denominator, 16)


print 'XResolution:\t' + str(xre) + ' dpi'


f.seek(old_pos)


@staticmethod


def parse_yresolution(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(4)


numerator = byte.encode('hex')


byte = f.read(4)


denominator = byte.encode('hex')


xre = int(numerator, 16) / int(denominator, 16)


print 'YResolution:\t' + str(xre) + ' dpi'


f.seek(old_pos)


@staticmethod


def parse_exif_ifd(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(2)


a = byte.encode('hex')


exif_ifd_number = int(a, 16)


for i in xrange(exif_ifd_number):


byte = f.read(2)


tag_id = byte.encode('hex')


#print tag_id,


byte = f.read(2)


type_n = byte.encode('hex')


#print type_n,


byte = f.read(4)


count = byte.encode('hex')


#print count,


byte = f.read(4)


value_offset = byte.encode('hex')


#print value_offset


value_offset = int(value_offset, 16)


EXIF_IFD_DICT.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)


f.seek(old_pos)


@staticmethod


def parse_x_pixel(f, count, value):


print 'X Pixels:\t' + str(value)


@staticmethod


def parse_y_pixel(f, count, value):


print 'y Pixels:\t' + str(value)


@staticmethod


def parse_gps_ifd(f, count, offset):


old_pos = f.tell()


f.seek(12 + offset)


byte = f.read(2)


a = byte.encode('hex')


gps_ifd_number = int(a, 16)


for i in xrange(gps_ifd_number):


byte = f.read(2)


tag_id = byte.encode('hex')


#print tag_id,


byte = f.read(2)


type_n = byte.encode('hex')


#print type_n,


byte = f.read(4)


count = byte.encode('hex')


#print count,


byte = f.read(4)


value_offset = byte.encode('hex')


#print value_offset


count = int(count, 16)


value_offset = int(value_offset, 16)


GPS_IFD_DICT.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)


f.seek(old_pos)


IFD_dict = {

'010f' : ParseMethod.parse_make ,


'0110' : ParseMethod.parse_model ,


'0132' : ParseMethod.parse_datetime ,


'011a' : ParseMethod.parse_xresolution ,


'011b' : ParseMethod.parse_yresolution ,


'8769' : ParseMethod.parse_exif_ifd ,


'8825' : ParseMethod.parse_gps_ifd


}


EXIF_IFD_DICT = {

'a002' : ParseMethod.parse_x_pixel ,


'a003' : ParseMethod.parse_y_pixel


}


GPS_IFD_DICT = {

'0002' : ParseMethod.parse_latitude ,


'0004' : ParseMethod.parse_longtitude


}


with open('image.jpg', 'rb') as f:


byte = f.read(2)


a = byte.encode('hex')


print 'SOI Marker:\t' + a


byte = f.read(2)


a = byte.encode('hex')


print 'APP1 Marker:\t' + a


byte = f.read(2)


a = byte.encode('hex')


print 'APP1 Length:\t' + str(int(a, 16)) + ' .Dec'


byte = f.read(4)


a = byte.encode('hex')


print 'Identifier:\t' + binascii.a2b_hex(a)


byte = f.read(2)


a = byte.encode('hex')


print 'Pad:\t\t' + a


print


print 'Begin to print Header.... '


print 'APP1 Body: '


byte = f.read(2)


a = byte.encode('hex')


print 'Byte Order:\t' + a


byte = f.read(2)


a = byte.encode('hex')


print '42:\t\t' + a


byte = f.read(4)


a = byte.encode('hex')


print '0th IFD Offset:\t' + a


print 'Finish print Header'


print 'Begin to print 0th IFD....'


print


#print 'Total: ',


byte = f.read(2)


a = byte.encode('hex')


interoperability_number = int(a, 16)


#print interoperability_number


for i in xrange(interoperability_number):


byte = f.read(2)


tag_id = byte.encode('hex')


#print tag_id,


byte = f.read(2)


type_n = byte.encode('hex')


#print type_n,


byte = f.read(4)


count = byte.encode('hex')


#print count,


byte = f.read(4)


value_offset = byte.encode('hex')


#print value_offset


count = int(count, 16)


value_offset = int(value_offset, 16)


# simulate switch


IFD_dict.get(tag_id, ParseMethod.parse_default)(f, count, value_offset)


print


print 'Finish print 0th IFD....'

————————————————

版权声明:本文为CSDN博主「戴文渊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_28675661/article/details/113678391


希希
6楼 · 2021-08-16 12:12

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



灰机带翅膀
7楼 · 2021-08-20 16:21

以下是Numpyand非常基本的图像数据分析步骤,其中一些涉及Python pacakges,如imageio,matplotlib等。

  • 导入图像并观察其属性

  • 拆分图层

  • Greyscale

  • 对像素值使用逻辑运算符

  • 使用逻辑运算符进行运算

  • 卫星图像数据分析


嘿呦嘿呦拔萝卜
8楼 · 2021-08-21 20:05

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): passelse: rootdir=rootdir1 size = 315, 560i=0 for parent,dirnames,filenames in os.walk(rootdir): for filename in filenames: infile=os.path.join(parent,filename) im = Image.open(infile) ### 此处Image.open(dir)为多数对象应用的基础. im.thumbnail(size) ### 此处size 为长度为2的tuple类型,改变图片分辨率 im.save(infile) ### im.save(dir),图片处理的最后都用这个,就是保存处理过后的图片 i+=1 print(i,"Done")

安之
9楼 · 2021-09-03 11:15

矢量图形是一种有点不同的存储图像方法,旨在避免与像素相关的问题。但是,即使是矢量图像,最终也会显示为像素一样的马赛克。颜色像素表示图像元素,描述每个像素的简单方法是使用三种颜色的组合,即红色,绿色,蓝色,这就是我们所说的RGB图像。  在RGB图像中,每个像素分别与红色,绿色,蓝色的值相关联的三个8比特数字表示。最后,如果使用放大镜观察缩放的图片,我们会看到图片由微小的光点或更具体的像素组成,更有趣的是这些小光点实际上具有多个不同颜色。  每张照片都以数字形式由像素组成,它们是构成图片的最小信息单位,通常是圆形或方形,它们通常布置在二维网格中。

如果三个颜色都处于最大值,则意味着它们是255,那就会显示为白色,如果三种颜色都处于最小值,或者值为0,则颜色显示为黑色。反过来,这三者的组合将为我们提供特定的像素颜色。由于每个颜色数字都是8个比特,因此值范围为0-255。

由于每个值可以具有256个不同的强度或亮度值,因此三种颜色总共有1680万个shade。

以下是Numpyand非常基本的图像数据分析步骤,其中一些涉及Python pacakges,如imageio,matplotlib等。导入图像并观察其属性拆分图层Greyscale对像素值使用逻辑运算符使用逻辑运算符进行运算卫星图像数据分析  导入图像  现在让我们加载图像并观察各种属性:  if __name__ == '__main__':  import imageio  import matplotlib.pyplot as plt  %matplotlib inline  pic = imageio.imread('F:/demo_2.jpg')  plt.figure(figsize = (15,15))  plt.imshow(pic)观察图像的基本属性  print('Type of the image : ' , type(pic))  print('Shape of the image : {}'.format(pic.shape))  print('Image Hight {}'.format(pic.shape[0]))  print('Image Width {}'.format(pic.shape[1]))  print('Dimension of Image {}'.format(pic.ndim))  Type of the image :   Shape of the image : (562, 960, 3)  Image Hight 562  Image Width 960  Dimension of Image 3


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问