图像中的Exif信息及其处理

1.Exif

可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息[1]。

xif标准最初由日本电子工业发展协会(JEIDA - Japan Electronic Industry Development Association)制订,目前的最新版本是发布于2010年04月的 Exif 2.3 版,该版本曾在2012年12月以及2013年5月有所修正 ,并已经应用到各个厂商的新影像设备中。2

Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看 Exif 文件,但图像一旦被修改,Exif 信息可能会永久丢失,故编辑 Exif 必须使用专门的软件。所有的JPEG图像以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。0xFFE0 – 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。3

在这里插入图片描述

标签号Exif 定义名中文定义名备注
0x010EImageDescription图像描述
0x013BArtist作者
0x010FMake生产商
0x0110Model型号相机型号
0x0112Orientation方向
0x011AXResolution水平方向分辨率
0x011BYResolution垂直方向分辨率
0x0128ResolutionUnit分辨率单位
0x0131Software软件固件Firmware版本或者编辑软件
0x0132DateTime日期和时间照片最后修改时间
0x0213YCbCrPositioningYCbCr定位
0x8769ExifOffsetExif子IFD偏移量
0x829AExposureTime曝光时间快门速度
0x829DFNumber光圈系数光圈的F值
0x8822ExposureProgram曝光程序自动曝光、光圈优先、快门优先、M档等
0x8827ISOSpeedRatingsISO感光度
0x9000ExifVersionExif 版本
0x9003DateTimeOriginal拍摄时间照片拍摄时间
0x9004DateTimeDigitized数字化时间照片被写入时间
0x9204ExposureBiasValue曝光补偿
0x9205MaxApertureValue最大光圈
0x9207MeteringMode测光模式平均测光、中央重点测光、点测光
0x9208Lightsource光源一般记录白平衡
0x9209Flash闪光灯闪光灯状态
0x920AFocalLength镜头焦距镜头物理焦距
0x927CMakerNote厂商注释
0x9286UserComment用户注释
0xA000FlashPixVersionFlashPix版本
ColorSpace色彩空间AdobeRGB、sRGB等
ExifImageWidth图像宽度
0xA003ExifImageLength图像高度
0xA433LensMake镜头生产商
0xA434LensModel镜头型号

通过以上可知,Exif信息是可以修改的,包含部分隐私数据,发送原图时很有可能会附带Exif信息。

2.对计算机视觉模型的影响

在使用手机或相机拍照时,有时候会横握设备有时候又竖握设备,手持方向发生变化,设备内部的重力感应器件会告诉设备,照片究竟哪个边是向上的。然而,实际图像的像素数据不会旋转,因为图像传感器是对连续的像素信息流进行逐行读取的,因此无论纵向和横向握持相机,图像都是按照一个方向进行存储,拍照设备和电脑之所以能够按照正确的方向显示图片,正是因为照片中保存的Exif信息。下图参考自4

在这里插入图片描述

图片阅读器之所以能够将横向排列的图像数据显示为正常图像,是因为根据Exif中的orientation参数对展示图像进行了处理,如果图片处理程序不处理Exif信息,那么图像将横向展示如下图:
在这里插入图片描述

一些图像处理程序不会去解析Exif信息,如NumPy、SciPy,TensorFlow,Keras等,当使用这些工具导入图像时,都将获得原始的未旋转图像数据,如横竖上下颠倒等,将如此数据输入视觉模型中时,会影响模型的分类检测分割效果

PIL库中,Exif的编码可通过如下方式获取

from PIL.ExifTags import TAGS
print(TAGS)
{
	11: 'ProcessingSoftware',
	254: 'NewSubfileType',
	255: 'SubfileType',
	256: 'ImageWidth',
	257: 'ImageLength',
	258: 'BitsPerSample',
	259: 'Compression',
	262: 'PhotometricInterpretation',
	263: 'Thresholding',
	264: 'CellWidth',
	265: 'CellLength',
	266: 'FillOrder',
	269: 'DocumentName',
	270: 'ImageDescription',
	271: 'Make',
	272: 'Model',
	273: 'StripOffsets',
	274: 'Orientation',
	277: 'SamplesPerPixel',
	278: 'RowsPerStrip',
	279: 'StripByteCounts',
	280: 'MinSampleValue',
	281: 'MaxSampleValue',
	282: 'XResolution',
	283: 'YResolution',
	284: 'PlanarConfiguration',
	285: 'PageName',
	288: 'FreeOffsets',
	289: 'FreeByteCounts',
	290: 'GrayResponseUnit',
	291: 'GrayResponseCurve',
	292: 'T4Options',
	293: 'T6Options',
	296: 'ResolutionUnit',
	297: 'PageNumber',
	301: 'TransferFunction',
	305: 'Software',
	306: 'DateTime',
	315: 'Artist',
	316: 'HostComputer',
	317: 'Predictor',
	318: 'WhitePoint',
	319: 'PrimaryChromaticities',
	320: 'ColorMap',
	321: 'HalftoneHints',
	322: 'TileWidth',
	323: 'TileLength',
	324: 'TileOffsets',
	325: 'TileByteCounts',
	330: 'SubIFDs',
	332: 'InkSet',
	333: 'InkNames',
	334: 'NumberOfInks',
	336: 'DotRange',
	337: 'TargetPrinter',
	338: 'ExtraSamples',
	339: 'SampleFormat',
	340: 'SMinSampleValue',
	341: 'SMaxSampleValue',
	342: 'TransferRange',
	343: 'ClipPath',
	344: 'XClipPathUnits',
	345: 'YClipPathUnits',
	346: 'Indexed',
	347: 'JPEGTables',
	351: 'OPIProxy',
	512: 'JPEGProc',
	513: 'JpegIFOffset',
	514: 'JpegIFByteCount',
	515: 'JpegRestartInterval',
	517: 'JpegLosslessPredictors',
	518: 'JpegPointTransforms',
	519: 'JpegQTables',
	520: 'JpegDCTables',
	521: 'JpegACTables',
	529: 'YCbCrCoefficients',
	530: 'YCbCrSubSampling',
	531: 'YCbCrPositioning',
	532: 'ReferenceBlackWhite',
	700: 'XMLPacket',
	4096: 'RelatedImageFileFormat',
	4097: 'RelatedImageWidth',
	4098: 'RelatedImageLength',
	18246: 'Rating',
	18249: 'RatingPercent',
	32781: 'ImageID',
	33421: 'CFARepeatPatternDim',
	33422: 'CFAPattern',
	33423: 'BatteryLevel',
	33432: 'Copyright',
	33434: 'ExposureTime',
	33437: 'FNumber',
	33723: 'IPTCNAA',
	34377: 'ImageResources',
	34665: 'ExifOffset',
	34675: 'InterColorProfile',
	34850: 'ExposureProgram',
	34852: 'SpectralSensitivity',
	34853: 'GPSInfo',
	34855: 'ISOSpeedRatings',
	34856: 'OECF',
	34857: 'Interlace',
	34858: 'TimeZoneOffset',
	34859: 'SelfTimerMode',
	36864: 'ExifVersion',
	36867: 'DateTimeOriginal',
	36868: 'DateTimeDigitized',
	37121: 'ComponentsConfiguration',
	37122: 'CompressedBitsPerPixel',
	37377: 'ShutterSpeedValue',
	37378: 'ApertureValue',
	37379: 'BrightnessValue',
	37380: 'ExposureBiasValue',
	37381: 'MaxApertureValue',
	37382: 'SubjectDistance',
	37383: 'MeteringMode',
	37384: 'LightSource',
	37385: 'Flash',
	37386: 'FocalLength',
	37387: 'FlashEnergy',
	37388: 'SpatialFrequencyResponse',
	37389: 'Noise',
	37393: 'ImageNumber',
	37394: 'SecurityClassification',
	37395: 'ImageHistory',
	37396: 'SubjectLocation',
	37397: 'ExposureIndex',
	37398: 'TIFF/EPStandardID',
	37500: 'MakerNote',
	37510: 'UserComment',
	37520: 'SubsecTime',
	37521: 'SubsecTimeOriginal',
	37522: 'SubsecTimeDigitized',
	37888: 'AmbientTemperature',
	37889: 'Humidity',
	37890: 'Pressure',
	37891: 'WaterDepth',
	37892: 'Acceleration',
	37893: 'CameraElevationAngle',
	40091: 'XPTitle',
	40092: 'XPComment',
	40093: 'XPAuthor',
	40094: 'XPKeywords',
	40095: 'XPSubject',
	40960: 'FlashPixVersion',
	40961: 'ColorSpace',
	40962: 'ExifImageWidth',
	40963: 'ExifImageHeight',
	40964: 'RelatedSoundFile',
	40965: 'ExifInteroperabilityOffset',
	41483: 'FlashEnergy',
	41484: 'SpatialFrequencyResponse',
	41486: 'FocalPlaneXResolution',
	41487: 'FocalPlaneYResolution',
	41488: 'FocalPlaneResolutionUnit',
	41492: 'SubjectLocation',
	41493: 'ExposureIndex',
	41495: 'SensingMethod',
	41728: 'FileSource',
	41729: 'SceneType',
	41730: 'CFAPattern',
	41985: 'CustomRendered',
	41986: 'ExposureMode',
	41987: 'WhiteBalance',
	41988: 'DigitalZoomRatio',
	41989: 'FocalLengthIn35mmFilm',
	41990: 'SceneCaptureType',
	41991: 'GainControl',
	41992: 'Contrast',
	41993: 'Saturation',
	41994: 'Sharpness',
	41995: 'DeviceSettingDescription',
	41996: 'SubjectDistanceRange',
	42016: 'ImageUniqueID',
	42032: 'CameraOwnerName',
	42033: 'BodySerialNumber',
	42034: 'LensSpecification',
	42035: 'LensMake',
	42036: 'LensModel',
	42037: 'LensSerialNumber',
	42240: 'Gamma',
	50341: 'PrintImageMatching',
	50706: 'DNGVersion',
	50707: 'DNGBackwardVersion',
	50708: 'UniqueCameraModel',
	50709: 'LocalizedCameraModel',
	50710: 'CFAPlaneColor',
	50711: 'CFALayout',
	50712: 'LinearizationTable',
	50713: 'BlackLevelRepeatDim',
	50714: 'BlackLevel',
	50715: 'BlackLevelDeltaH',
	50716: 'BlackLevelDeltaV',
	50717: 'WhiteLevel',
	50718: 'DefaultScale',
	50719: 'DefaultCropOrigin',
	50720: 'DefaultCropSize',
	50721: 'ColorMatrix1',
	50722: 'ColorMatrix2',
	50723: 'CameraCalibration1',
	50724: 'CameraCalibration2',
	50725: 'ReductionMatrix1',
	50726: 'ReductionMatrix2',
	50727: 'AnalogBalance',
	50728: 'AsShotNeutral',
	50729: 'AsShotWhiteXY',
	50730: 'BaselineExposure',
	50731: 'BaselineNoise',
	50732: 'BaselineSharpness',
	50733: 'BayerGreenSplit',
	50734: 'LinearResponseLimit',
	50735: 'CameraSerialNumber',
	50736: 'LensInfo',
	50737: 'ChromaBlurRadius',
	50738: 'AntiAliasStrength',
	50739: 'ShadowScale',
	50740: 'DNGPrivateData',
	50741: 'MakerNoteSafety',
	50778: 'CalibrationIlluminant1',
	50779: 'CalibrationIlluminant2',
	50780: 'BestQualityScale',
	50781: 'RawDataUniqueID',
	50827: 'OriginalRawFileName',
	50828: 'OriginalRawFileData',
	50829: 'ActiveArea',
	50830: 'MaskedAreas',
	50831: 'AsShotICCProfile',
	50832: 'AsShotPreProfileMatrix',
	50833: 'CurrentICCProfile',
	50834: 'CurrentPreProfileMatrix',
	50879: 'ColorimetricReference',
	50931: 'CameraCalibrationSignature',
	50932: 'ProfileCalibrationSignature',
	50934: 'AsShotProfileName',
	50935: 'NoiseReductionApplied',
	50936: 'ProfileName',
	50937: 'ProfileHueSatMapDims',
	50938: 'ProfileHueSatMapData1',
	50939: 'ProfileHueSatMapData2',
	50940: 'ProfileToneCurve',
	50941: 'ProfileEmbedPolicy',
	50942: 'ProfileCopyright',
	50964: 'ForwardMatrix1',
	50965: 'ForwardMatrix2',
	50966: 'PreviewApplicationName',
	50967: 'PreviewApplicationVersion',
	50968: 'PreviewSettingsName',
	50969: 'PreviewSettingsDigest',
	50970: 'PreviewColorSpace',
	50971: 'PreviewDateTime',
	50972: 'RawImageDigest',
	50973: 'OriginalRawFileDigest',
	50974: 'SubTileBlockSize',
	50975: 'RowInterleaveFactor',
	50981: 'ProfileLookTableDims',
	50982: 'ProfileLookTableData',
	51008: 'OpcodeList1',
	51009: 'OpcodeList2',
	51022: 'OpcodeList3',
	51041: 'NoiseProfile'
}

使用PIL库时,一幅图像数据Exif信息的获取可通过getexif方法获得。

from PIL import Image
img = Image.open("./m.jpg")
print(img.getexif())
{
	34665: 290,
	36864: b '0210',
	37121: b '\x01\x02\x03\x00',
	37377: 29.8973,
	36867: '2020:09:02 23:02:43',
	36868: '2020:09:02 23:02:43',
	37378: 2.52,
	37379: 0.0,
	37380: 0.0,
	37383: 5,
	37384: 1,
	37385: 24,
	37386: 3.38,
	40961: 1,
	40962: 2448,
	40965: 8434,
	41990: 0,
	37520: '438870',
	37521: '438870',
	37522: '438870',
	40963: 3264,
	41996: 0,
	41495: 2,
	41728: b '\x03',
	33434: 0.04,
	33437: 2.4,
	41729: b '\x01',
	34850: 2,
	41985: 1,
	34855: 250,
	41986: 0,
	40960: b '0100',
	41987: 0,
	41988: 1.0,
	41989: 26,
	41991: 0,
	41992: 0,
	41993: 0,
	41994: 0,
	37500: b 'Auto\x00',
	296: 2,
	282: 72.0,
	256: 2448,
	257: 3264,
	258: (8, 8, 8),
	34853: {
		0: b '\x02\x02\x00\x00',
		1: 'N',
		2: (22.0, 38.0, 54.697723),
		3: 'E',
		4: (114.0, 3.0, 35.029907),
		5: b '\x01',
		6: 0.0,
		7: (15.0, 2.0, 42.0),
		27: 'CELLID',
		29: '2020:09:02'
	},
	41995: b 'ipp\x00',
	270: 'bty',
	271: 'HUAWEI',
	272: 'KNT-UL10',
	305: 'KNT-UL10 8.0.0.556(C00)',
	274: 0,
	306: '2020:09:02 23:02:43',
	531: 1,
	283: 72.0
}

譬如274表示orientation。其处理可参考5

参考:
1.https://zh.wikipedia.org/wiki/Exif
2.https://zhuanlan.zhihu.com/p/366726838
3.https://baike.baidu.com/item/EXIF%E4%BF%A1%E6%81%AF/3297493
4.https://mp.weixin.qq.com/s?__biz=MzAxNTc4MTc1Ng==&mid=2649395978&idx=2&sn=9d19517b41e30069787c6998924fb850&chksm=83e0e919b497600fb7a630b0474f9b4a25866f997b6c4eca359c70cee8a6bf9aeead22a4f589&mpshare=1&scene=1&srcid=1008W3nbLinwcMZgf49emKar&sharer_sharetime=1633664055894&sharer_shareid=715337ab6f6483872d17f37de2f7e4bf&notreplace=true&exportkey=A0i5QEYtCX3RYqAQLZ%2B%2FfNg%3D&pass_ticket=evQ%2BD4tN43xMZl5Nol%2BrBPpJxKHbPr9OuEQIL6mbg3eRRC%2F%2BbEwUDklPhQa8gB4M&wx_header=0#rd
5.https://github.com/ageitgey/image_to_numpy

部分使用说明: 点击开始菜单-运行命令,在对话框输入: "jhead –命令参数 jpeg文件" 例如: “jhead -de D:\A.jpg” 删除D盘盘根目录下A.jpg文件的exif信息。 “jhead -de D:\*.jpg” 删除D盘根目录下所有jpg文件的exif信息。其中星号是通配符。 二、通用指令参数 -te 将其他jpeg文件的eixf导入目标jpeg。例如"jhead –te D:\B.jpg D:\A.jpg" -dc 删除jpeg信息中的备注。注意,jpeg文件有两个备注,一是和其他文件一样的备注,另一个是exif信息中的备注。jhead仅对exif信息有效。 -de 完全删除exif信息。 -du 删除非原始exif信息,例如Photoshop、Turbophoto之类编辑后修改exif留下的信息。 -purejpg 删除所有jpeg文件非必须的信息。相当于-de、-dc和-du的集合,可以将文件减小数k。 -ce 修改文件的jpeg文件头部分备注(此备注并非exif信息)。该指令会打开文本编辑器,并在编辑器关闭时将备注信息存入文件。 -cs 导出备注。例如"jhead –cs D:\988.txt D:\A.jpg" -ci 导入备注。例如"jhead –ci D:\988.txt D:\A.jpg" -cl 直接输入备注。。例如"jhead –cl 我的备注 D:\A.jpg" 三、其他指令 时间日期 -ft 将jpeg文件的“修改时间”修改为exif信息中记录的时间。 -n[] 该指令会将文件名修改为exif信息中记录的“创建时间”;如果jpeg文件没有exif或者exif中的创建时间不可用,则将文件名修改为文件的“修改时间”。 默认的格式-顺序为MMDD-HHMMSS 格式-顺序参数如下: %d-日(01-31) %H-小时(00-23) %j-一年中的第几天(001-366) %m-月(01-12) %M-分钟(00-59) %S-秒(00-59) %U-一年中的第几周(00-53) %w-星期几(0-6,周日为0) %y-两位数纪年(00-99) %Y-四位数几年 %i-添加数字序号 例如: jhead -n%Y%m%d-%H%M%S d:\*.jpg 将所有jpg文件修改为YYYYMMDD-HHMMSS.jpg的格式。 -nf 与“-n”相同功能相同,不保留原文件名。 -a 修改不同扩展名的同名文件名,相机拍摄的avi短片exif信息存储在与其同名的thm文件中,可用此指令给avi文件更名。一般与“-n”指令共同使用。 -ta 修正时差,例如时差根据时区确定,例如+1:00或者-1:00 -da- 修正日期。日期格式是yyyy:mm:dd、yyyy:nn:dd+hh:mm或者 yyyy:mm:dd+hh:mm:ss。根据前后参数时间差调整exif的时间。 -ts 直接修改exif中的拍摄时间,日期-时间格式为yyyy:mm:dd-hh:mm:ss 缩略图 -dt 删除exif中的缩略图。这个缩略图一般为240x160像素,10k大小,用于数码相机、Windows XP查看照片,删除它不会影响工作。 -st 将exif中的缩略图复制为另一个jpeg文件 -rt 用另一个jpeg文件替换exif中的缩略图 -rgt[大小] 刷新exif缩略图,其中大小为缩略图的最大边长。 旋转 -autorot 根据exif中记录的水平方向信息转动jpeg照片。 -norot 清除exif中的水平方向信息。 四、使用技巧 1)用开始菜单的"运行"指令并不直观,可以通过运行cmd命令进入DOS命令提示符界面操作。在DOS界面进入操作照片文件夹(不懂DOS操作的朋友建议稍稍学习DOS指令,今后也会受用无穷),在文件夹中运行jhead命令,用“*.jpg”表示文件夹中所有的jpeg文件,可以进行批处理。 2)-te(复制exif信息)作用在于可以恢复被其他编辑软件删除的exif信息。编辑照片之前,先在照片文件夹中建立一个名为“backup”的备份文件夹,将原是照片复制到backup文件夹中,然后再编辑照片,编辑软件可能会删除或修改exif。编辑结束后进入DOS界面照片文件夹输入: jhead –te “backup\&i” *.jpg 照片的exif信息就会从backup文件夹的原始文件中复制回来。其中“&i”表示与目标文件同名的文件,前面的“backup\”表示原始文件位置。 3)-purejpg指令可以删除所有exif信息,让照片减小若干k字节
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值