2

假设我们有一个黑白图像(像素缓冲区),那么每个像素要么是黑色要么是白色(不是灰度)。

现在在图像中间的某个地方,放置一个绿点。出于渲染目的,它的半径可能为 n,但它确实是一个公正的点。给点一个随机选择的方向和速度,然后开始移动。如果图像全是白色像素,点会从图像边缘反弹,在图片周围无限游荡。这很容易......只需反转点向量的上升或运行。

接下来,假设图像有一些黑色像素团。当点遇到这些黑色像素团时,需要计算反射角。这也很容易,黑色像素有一个固定的斜率,就像我的草图一样(蓝色 X 代表黑色像素)。您可以找到蓝色 X 的斜率并轻松计算新向量。

但是黑色像素形成非常不友好的表面的情况呢?有哪些方法可以确定这个角度?

在此处输入图像描述

这是我感兴趣的主题。

一定有一些算法可以用于这种目的,但我在学校从来没有遇到过。我不是在问如何编写代码,而是在问如何编写算法来做到这一点。我有一些想法我会尝试,但如果有一些标准的方法可以做到这一点,我想了解它们。

显然我想从黑白开始,然后进入 RGBA。

我正在寻找有关此类主题的任何参考资料。非常欢迎网站、书籍或其他参考资料。

另外,如果有不同的 StackOverflow 标签可能很好,请告诉我。

非常感谢!

编辑**********更多图片和信息

也许我不清楚我所说的“不友好的表面”是什么意思。在上图中,我们的蓝色 X 恰好是一条线。想象一下它不是一条线,而是一个奇怪的形状的情况。

我们从以 2 斜率行进的绿色像素开始。假设它的向量是每帧 12 个像素的向量。它会有这样的预计路径: 在此处输入图像描述

但是假设我们有这样一条友好的线路,而不是一条友好的线路: 在此处输入图像描述

在我看来,如果这是一个球和一些墙壁,我可以看到会发生什么。

4

2 回答 2

2

寻找图像处理中使用的边缘检测算法。一些边缘检测器也近似于边缘的方向。

您可以将绿点的像素邻域(可能介于 3x3 和 7x7 之间)视为一个小的边缘方向检测问题。一种方法是在像素处进行两次传递:

  1. 在第一遍中,使用高斯滤波器平滑锐利的黑/白像素。
  2. 在第二遍中,应用边缘检测算子(例如SobelPrewittRoberts)来生成像素强度的 X 和 Y 导数。然后,您可以将方向近似为:

    angle = arctan(dx/dy)

平滑通道的动机是为边缘检测算子提供来自较远像素的信息。

Canny 边缘检测器上的 Wikipedia 页面对获取边缘的方向(“梯度”)进行了很好的讨论,包括可用于平滑的特定高斯滤波器的示例。

于 2013-05-18T17:05:10.807 回答
0

我正在用一个球和随机生成的背景做类似的事情。

过滤器和边缘检测技术性很强,但使用 5*5 或 3*3 网格的所有其他过程似乎同样困难。

但是,我想我可能有一个便宜的方法来解决这个问题。假设一个球向任何方向移动,扫描球的所有前缘 - 一个半圆。越靠近球的边缘发生碰撞,碰撞越接近垂直。同样,我认为,这应该可以让您轻松推断背景正常,并且从那里答案相当简单

于 2014-11-26T20:31:35.100 回答