挖掘数字图像:安全地自动批量提取位置数据 - iYouPort
挖掘数字图像:安全地自动批量提取位置数据
- 不推荐使用在线平台,尤其是当您的调查涉及敏感的政治问题和人权迫害时,这些在线平台的服务器不会是那种能让您感觉放心的地方
这是一份操作指南,涵盖了在桌面上使用开源元数据提取软件和从大量图像中提取地理位置信息的基本步骤。
当使用智能手机或相机拍摄一张图片时,通常会附加某些元数据字段。这些字段可能包括相机的型号、拍摄时间、是否使用了闪光灯、快门速度、焦距、甚至是位置。您可以 在这里看到具体介绍 。
从图像中检索地理位置数据有几种方法,最简单的是使用在线工具,如 readexifdata.com 或 Jeffrey 的 Exif查看器 ,用户可以上传图像并查看现有的元数据信息。然而,用户不可能知道这些在线服务是如何工作的,以及当上传的图像被上传到未知的服务器时,其安全性如何,而且通常这些在线服务在给定时间内可以处理的图像数量上是有限制的。
本文提供的方法包括两点:在您的桌面上使用开源元数据提取软件的基本步骤;以及,如何从大量的图像中提取地理位置信息。
安装
ExifTool 是一款可以读写和编辑不同元数据格式的软件,包括 EXIF、GPS、IPTC、XMP、JFIF、GeoTIFF、ICC Profile、Photoshop IRB、FlashPix、AFCP 和 ID3。它是一个具有多种可能性的强大工具,它为用户提供了按元数据 组织图像 和提取地理位置信息的选项。
您可以通过他们的网站获得源码并下载 ExifTool,或者您应该能够使用您自己的软件包管理系统,如 yum、pacman、apt-get 或 brew,在任何UNIX操作系统(MacOS或Linux)上轻松安装它。
这个例子展示了如何在 Debian 终端上安装 ExifTool:
sudo apt-get install exiftool
读取图像元数据的基本用法
进入终端,输入以下命令: exiftool Ibiza.jpg,使用您正确的图像路径和文件名。
正确的路径取决于文件的存储位置,如果它在您的桌面上,正确的命令应该是 “exiftool /home/user/Desktop/Ibiza.jpg”
您应该期待看到一个描述图像的数据列表,比如下面这样:
从上面的元数据信息中,可以看到图像的地理位置、拍摄的手机(本示例中是iPhone 4)、拍摄的确切日期、图像是亮是暗(等级),等等信息。为了使这种地理定位被大多数在线地图服务处理,您必须提供一种不同于 ExifTool 默认格式的方式来表示经纬度。
简洁的格式是用-c参数设置的,如下面的命令所示。在您的终端键入以下命令:
exiftool -c “%.6f” Ibiza.JPG
这样,您就可以用这个位置进行反向地理编码 — — 从这些坐标数据中获得可读的地址或地名数据的过程。Nominatim OpenStreetMap 网络服务 可以提供与这些坐标相关的精确地理元数据。
也可以仅通过查询此纬度和经度 在 OpenStreetMaps 上 直接搜索它。
处理大量的图像
然而,想象一下您有50、1000或100000张图片,您想看看它们是否有与图片相关的地理位置元数据。
要单独检查每一张图,几乎是不可能的。在进行调查时,这种地理位置信息可能是非常重要的一块拼图。然而,当用户将图像上传到服务器时,社交媒体平台通常会剥离这些元数据,而个人在网上上传图像时也可能会剥离这些元数据。
如果您错过了《 社交媒体照片也能找到元数据痕迹以实现追踪,这件事怎么做? 》
在一批在线图片中,您可能会发现只有2%的图片有地理位置信息的元数据。考虑到这一点,将筛选成百上千张图片的过程自动化的作用就更加明显了。
下面使用Ruby编程语言写了一个小脚本,它不仅可以筛选图片,自动挑选出这些地理位置数据,还可以将它们绘制在地图上。
把这个脚本放在一个叫做 “geobatch.rb” 的文件中,然后在有您想处理的所有图片的文件夹中运行:
def get_gps_from_exif file
`exiftool -c "%.6f" #{file} | grep GPS | grep Position`.scan(/(\d+\.\d+)/)
end
zoom = 2
path = "*.JPG"
map_url = "http://staticmap.openstreetmap.de/staticmap.php?&zoom=#{zoom}&size=865x512&maptype=mapnik&markers="
all = Dir.glob(path)
total = all.count
has_gps = 0
meta_exif = 0
all.each do |file|
if gps = get_gps_from_exif(file)
if gps.count==2 # lat and long
coord = "#{gps[0][0]},#{gps[1][0]}"
puts "=> #{file} @ #{coord}"
map_url += "#{coord},lightblue#{file}|"
meta_exif+=1
has_gps+=1
end
end
end
puts "=> Total #{total} images | #{meta_exif} with EXIF | #{has_gps} with location"
puts ("=> Percentage with location = %3.2f" % [(has_gps*100).to_f/total])
puts "=> Map URL: #{map_url}"
结果将与下面的文本类似,并带有附加了地理位置信息的图像数量(在这种情况下,有四个图像):
$ ruby geo batch.rb
...
=> 4.JPG @ 37.529000,122.266000
=> 3.JPG @ 43.740167,7.430000
=> 2.JPG @ 37.421833,122.084333
=> 1.JPG @ 41.373167,2.189500
=> Total 35 images | 5 with EXIF | 4 with location
=> Percentage with location = 80.00
=> Map URL: http://staticmap.openstreetmap.de/staticmap.php?&zoom=2&size=865x512&maptype=mapnik&markers=37.529000,122.266000,lightblue4.JPG|43.740167,7.430000,lightblue3.JPG|37.421833,122.084333,lightblue2.JPG|41.373167,2.189500,lightblue1.JPG
这就产生了所有这些可用的坐标,并可在一个URL上访问,可在OpenStreetMaps上查看,如下图。
⚪️
Digging into digital images: Extracting batch location data automatically
文章版权归原作者所有。