gpt4 book ai didi

java - 实现 SAD(绝对差之和)算法

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:47 25 4
gpt4 key购买 nike

我正在实现一个 JAVA 程序来查找不同图像帧之间的相似性。目前我正在使用两种不同的算法来实现这一目标。基本上我将图像划分为 n*n 像素 block 并计算 SAD为他们进行比较。现在我的主要问题是获取对某个像素有意义的值,目前我以两种不同的方式获取像素值:

RGB值是0-255

 //average pixel value
double pixelValue = (getRed() + getGreen() + getBlue()) / 3.0;

或者

 //sum of RGB as a data for pixel value
double pixelValue = (getRed() + getGreen() + getBlue());

问题在于,这些值对于像素来说并不真正有意义,因为完全蓝色或完全红色的像素会给出相同的值,因此如果我的 n*n block 非常小,它可能会错误匹配。这会给渐变图像或类似图像带来严重问题。有哪些好的方法或函数可以获取作为像素良好指示符的整数或 float 像素值?数学函数也很好(甚至更好)。

最佳答案

彩色图像使用三个维度来编码每个空间位置的信息。(通常)不可能找到唯一“标识”某个像素的单个唯一值。

但是,可以使用不同的数学技术来获得单个 channel 的最大可变性。

最简单的方法就是通过 R、G 和 B channel 的串联生成一个 24 位数字。然而,这会导致问题,即差异函数对三个 channel 中每个 channel 的变化的响应会非常不同,具体取决于它们的连接顺序。

您已经探索了三个 channel 求和的可能性,并指出这有一些明显的缺点。

现在,对于数学上更严格的选项:

RGB 颜色可以被视为三维空间中的 vector ,其中每个维度都是颜色 channel 之一。一个名为 Principal Component Analysis 的数学工具(PCA) 可用于查找 3D 空间可投影到的一组新的正交基 vector 。这些新 vector 具有以下特性:每个连续 vector 都使沿该 vector 的方差最大化。然后可以将第一 vector 的值用作每个像素的最佳估计器。然而,PCA vector 必须根据一组数据计算得出,这意味着每个图像的 PCA vector 都不同。此外,PCA 计算可能非常昂贵。

还有一种廉价的替代品也可以使用。对于自然图像,第一个 PCA 通常与人类对亮度的感知非常一致(并非巧合,我们的人类视觉系统已经非常有效地进化)。对于使用 sRGB 原色存储的 RGB 图像(几乎所有消费者 RGB 图像),存在一个简单的线性变换来计算 Luma ,这是亮度的一个很好的近似值。

最常用的函数是:

Y' = 0.2126 R' + 0.7152 G' + 0.0722 B'

此函数将给出单个 channel 中最大方差的良好近似值。

因此,除非您确实需要最佳可能的解决方案 (PCA),否则上面的 Luma 方程将给出一个很好的近似值。但是,由于您正在降低数据的维度,因此您(几乎)永远不会获得完美的结果。

关于java - 实现 SAD(绝对差之和)算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23130736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com