我想创建一个程序,在 2 个不同时间拍摄同一区域的照片,然后比较这些图像,然后创建一个全新的图像,该图像仅具有 2 个图像之间的差异(发生了什么变化)。我正在使用 RGB 值,我想看看它们的值是否有超过 90% 的差异,然后我想将这些像素添加到将被映射的新矩阵中。 我对 Raspberry Pi 和 python 相当陌生,所以我遇到了一个错误,我不明白为什么它会给我这个错误。
我尝试过使用 PIL 和 Numpy,但这两种方法都会产生我无法修复的错误
这不是完整的代码,但这是给我错误的函数:
from PIL import Image
import numpy as np
import picamera
import time
import RPi.GPIO
from guizero import ...
def processimage():
before = Image.open('before.jpg')
after = Image.open('after.jpg')
beforeRGB = np.array(before)
afterRGB = np.array(after)
outputRGB = Image.new('RGB', (800,480))
x=0
y=0
for x in range(800):
for y in range(480):
if(((beforeRGB[x,y,0])/afterRGB[x,y,0])<0.9):
outputRGB[x,y,0] = afterRGB[x,y,0]
else:
output[x,y,0] = 255
if(((beforeRGB[x,y,1])/afterRGB[x,y,1])<0.9):
outputRGB[x,y,1] = afterRGB[x,y,1]
else:
output[x,y,1] = 255
if(((beforeRGB[x,y,2])/afterRGB[x,y,2])<0.9):
outputRGB[x,y,2] = afterRGB[x,y,2]
else:
output[x,y,2] = 255
y=y+1
x=x+1
Image.fromarray(outputRGB).save('output.jpg')
这是我遇到的错误
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1562, in __call__
return self.func(*args)
File "/usr/local/lib/python3.5/dist-packages/guizero/PushButton.py",
line 146, in _command_callback
self._command()
File "/home/pi/ButtonTest/GUI_interface.py", line 70, in mode
lifetime(key)
File "/home/pi/ButtonTest/GUI_interface.py", line 158, in lifetime
processimage()
File "/home/pi/ButtonTest/GUI_interface.py", line 115, in processimage
outputRGB[x,y,0] = afterRGB(x,y,0)
TypeError: 'numpy.ndarray' object is not callable
最佳答案
1) 错误消息与代码不匹配。该错误消息与代码的不同版本有关,其中意外使用了 ()
而不是 []
,请参阅错误消息的最后一个代码行。
2) 使用 Python 时,迭代单个像素非常慢。请阅读一些图像处理教程,以了解矢量化和广播。
例如,上面的代码可以缩短为:
output = np.where(beforeRGB/afterRGB < 0.9, afterRGB, 255]
3) for x in range()
已经迭代了范围内的所有 x 值。无需在循环结束时递增 x 或 y。
4) 为图像差异选择的公式会对至少一个 channel 为 0 的像素产生除以零的结果。进行一些研究并为图像差异选择更好的度量。
关于python - 找到两个图像像素值的差异,然后根据差异创建新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56651636/