今天要探讨一下这个问题,还是因为在用python3写的一个截长图的tool时涉及到这方面的知识.
理论上两张图内容相同的行(注意:不是相同行的内容)其像素值(RGB值,因为当前保存的格式为jpeg)应该是相同的,这一度让我在图片拼接需要从第一张图中自上而下的找到第二张图相同的行,以便于crop再完美拼接时,一直找不到相同的行,
原因就在于就算是内容相同的行,其pixel值还是有些差异的。
如上两张图片,我们通过以下脚本找到img2中249行的内容在img1中相同的行.
from PIL import Image
import os
# 得到PC桌面路径
def getDesktopPath():
return 'C:\\Users\\' + os.getlogin() + '\\Desktop\\'
def findSameH(img1, img2):
img2pixelList = list()
# 取img2中某一行的pixel值,当前为249行
for w in range(img2.width):
img2pixelList.append(img2.getpixel((w, 249)))
# 在img1中查找相同内容的行
for h in range(img1.height):
img1pixelList = list()
total = 0
for w in range(img1.width):
# 将img1图片的h行的所有pixel info添加至img1pixelList中
img1pixelList.append(img1.getpixel((w, h)))
# 对比img1的h行内容是否与img1的249行内容一致
for i in range(img1.width):
a, b, c = img1pixelList[i]
x, y, z = img2pixelList[i]
if abs(a-x)<25 and abs(b-y)<25 and abs(c-z)<25:
total += 1
if total == img1.width:
print(f'找到了相同的行:{h}')
return h
if __name__ == '__main__':
path1 = getDesktopPath() + 'img1.jpg'
path2 = getDesktopPath() + 'img2.jpg'
img1 = Image.open(path1)
img2 = Image.open(path2)
findSameH(img1, img2)
在img1中找到相同内容的行是861行
我们分别取得img1的861行的pixel内容和img2的249行的pixel内容,分别保存在桌面的img1.txt和img2.txt中.
if __name__ == '__main__':
path1 = getDesktopPath() + 'img1.jpg'
path2 = getDesktopPath() + 'img2.jpg'
img1 = Image.open(path1)
img2 = Image.open(path2)
h = findSameH(img1, img2)
os.chdir(getDesktopPath())
for w in range(img2.width):
print(f'W:{w}')
with open('img2.txt', 'a+') as f2:
f2.write(str(img2.getpixel((w, 249))) + '\n')
with open('img1.txt', 'a+') as f1:
f1.write(str(img1.getpixel((w, 861))) + '\n')
再将img1和img2用notepad打开,并通过插件compare打开对比。就会发现相同内容的pixel在不同图片中还是有些差异的。
以下是截取的一小段,明显可以看出是有些差异的,而有了对这一特性的了解,那对图片的对比就变得容易了,所以对比时必须得有一些的容错机制才行. 然后再理解以下这段code就容易了.
# 对比img1的h行内容是否与img1的249行内容一致
for i in range(img1.width):
a, b, c = img1pixelList[i]
x, y, z = img2pixelList[i]
if abs(a-x)<25 and abs(b-y)<25 and abs(c-z)<25:
total += 1
if total == img1.width:
print(f'找到了相同的行:{h}')
return h
需要注意的事,对于图片比较多的页面,容错范围可能会超出想像,故如果通过对比pixel值来找到是否存在相同内容的行的话,有一定的概率是找不到相同内容行的,因为可能pixel相差的太大,而我们又不通将容错值写得太大
出现这种差异的原因,我认为应该跟JPG为一种有损压缩的的图像格式有关,而不同图片整体内容,导致内容相同的行其压缩的结果也会存在一定的差异。