python - 找到两个图像像素值的差异,然后根据差异创建新图像

标签 python numpy raspberry-pi python-imaging-library rgb

我想创建一个程序,在 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/

相关文章:

python - Pandas loc 查找已应用过 5 个或更多事物的用户

python - 如何填充 kinect v1 深度图像中的黑色补丁

python - setuptools 如何构建扩展,在哪里添加编译器选项?

opencv - 属性错误 : MultiTracker_create() Not Found in cv2 on Raspberry Pi

python - 如何在 Django 表单中创建用户无法编辑的只读字段?

python 输入被读取错误?

python - numpy 中的互相关,与 FFT - 奇怪的结果?

python - "Setting an array element with a sequence"numpy 错误

python - 如何在 Python 中记录和保存带有日期和时间戳的文件

python - 使用child_process(node js)在后台运行python脚本