检测两个快照/图像之间的移动和脏区

信息处理 图像处理 运动检测
2022-02-22 12:45:14

我是图像处理的新手,并试图找出识别两个桌面屏幕截图之间“移动”和“脏”矩形的最佳方法。基本上,假设屏幕上有一个圆形移动,有一个文本正在改变例如毫秒计数器,并且有一个正在更新的图像。所有这些都以 60fps 的速度发生。该算法应将移动圆识别为“移动”区域(并在源/初始和第二/最终图像中提供移动对象的边界矩形)。任何就地更改的内容,例如颜色/图像更改、文本更改等,都应标识为“脏”区域(具有相关的边界矩形)。可能有多个脏和移动区域,因此该技术在典型的计算机硬件(i5 处理器)上应该非常快,并且能够达到 60+ fps。一世'

4个回答

我喜欢抽象艺术。它与图书馆外的我内心的东西说话,它用文字而不是文字说话。我最喜欢的艺术家之一是瓦西里·康定斯基

一个能满足问题要求的他的形象,无论是“文本”还是一个圆圈的翻译,都是他的“圆圈中的圆圈”弹跳地球动画是原始的,没有纹理,并且没有文本。

此外,现实世界是混乱而复杂的,因此除了明确指定“这必须仅适用于计算机生成的内容”之外,任何可行的方法都必须处理一些现实世界的曲线球。

这是它的副本:
在此处输入图像描述

所以使用 MS Paint,我移动了一个圆圈,并以一种与本地文本更改一致的方式对线条进行散列。

这里是:
在此处输入图像描述

因此,让我们打开文件,转换为灰度,然后减去它们。

这是一些代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image

#read in images
#name of input file
fname1 = './wassily-kandinsky(A).png'
fname2 = './wassily-kandinsky(B).png'

#read the files, convert to grayscale
img1 = Image.open(fname1).convert("L")
img2 = Image.open(fname2).convert("L")

#convert to numpy array for math
arr1 = np.asarray(img1)
arr2 = np.asarray(img2)

#smooth (to remove some of the manual-editing real-world images artifacts)
kernel_width = 11
arr1b = cv2.bilateralFilter(arr1, kernel_width,75,75)
arr2b = cv2.bilateralFilter(arr2, kernel_width,75,75)

#subtract images
arr_diff = np.abs(arr2b-arr1b)


#show them
plt.imshow(arr1, cmap='gray')
plt.savefig("figure1.png", dpi=300)
plt.show()

plt.imshow(arr2, cmap='gray')
plt.savefig("figure2.png", dpi=300)
plt.show()

plt.imshow(arr_diff, cmap='gray')
plt.savefig("figure_diff.png", dpi=300)
plt.show()

这给出了稍微不同的初始图像,并允许一个不错的差异图像。

新(平滑、灰度)“未更改”图像:
在此处输入图像描述

新的(平滑的、灰度的)“改变的”图像:
在此处输入图像描述

两者的区别:
在此处输入图像描述

这是“信号区域”的放大图:
在此处输入图像描述

接下来的步骤(当我有时间时做):

  • 清理圆形信号,显示边缘直方图如何清楚地给出位置
  • 阻止来自不同图像的位置,显示来自同一位置的替代文本的“椒盐”的位置。

您没有提供很多详细信息,但根据您提供的内容,这是一个建议:

  • 要检测已更改的内容,您可以用图像 B 减去图像 A,然后您将仅在值已更改的像素上具有不同于零的值。

  • 然后,要检测圆圈,您可以应用霍夫变换(https://en.wikipedia.org/wiki/Circle_Hough_Transform)。该算法有很多实现,作为第一种方法,您可以检查 Matlab 或 Python 进行快速测试。

  • 发生变化且不是圆圈的东西应该归类为文本。

我一直在做一些研究,看起来答案是块匹配算法:https ://en.wikipedia.org/wiki/Block-matching_algorithm

这些可用于识别已移动的区域,未识别为已移动的区域可标记为脏。

很多年前我做过类似的事情。我将一个网络摄像头指向我的窗口并编写了一个程序,该程序将当前图像显示在一个图像旁边,该图像是当前图像和前一个图像除以二加到中灰色的差值。如果没有任何移动,图像将保持灰色。一旦移动的东西在灰色图像上清晰地显示出来。这是在 486 或早期的 Pentium 上,我怀疑它是否超过 15 fps。

你的情况略有不同。由于您正在谈论屏幕截图,因此不移动的背景应该保持完全相同,而不仅仅是靠近。这意味着您不必担心指示变化的正确阈值。

我做了另一个项目,相机发现了一个点图案,形成了一个校准平面,有点像棋盘校准方法。当点被识别时,网络摄像头可以位于由点所在的纸张定义的 3D 坐标系中的十分之一英寸内。

找到移动的东西比找到改变的东西要困难得多。我会先集中精力找到你的脏区,然后尝试将脏区与你圈子的前后相匹配。是纯色球还是实际的圆圈?

您可以通过跳过每隔一行和每隔一列来加快计算速度。毕竟,您不是在寻找像素大小的区域。当你扫描你的行时,建立一个脏间隔列表(行、开始列、结束列)。然后,您可以在保持最小起始列和最大结束列的行之间匹配间隔。当它不与下一行上下重叠时,您已经找到了您的垂直范围,并且(起始行,最小起始列,结束行,最大起始列)将形成您的边界矩形。在文本区域中,您可能需要进行一些区间合并,或者在定义区间时稍微松散一些。

一个移动的球可能很棘手。它可以是一个肮脏的球,它在哪里,也可以是一个肮脏的球。边界矩形应该是正方形,因此应该很容易找到。但是,如果它稍微移动,您将有两条脏弧条。好消息是边界矩形的形状应该相似。