numpy 计算平方差和时出错

rkttyhzu  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(91)

假设我有两个图像,图像1和模板作为图像2。我想实现图像(M,N)与模板之间的平方差和匹配,以找到图像的匹配区域为矩形。我有计算SSD的代码,但当我尝试使用我的输入图像时,它给出了一个错误:值错误:步幅和形状的长度不匹配,

def sumsqdiff3(input_image, template):
    window_size = template.shape
    y = as_strided(input_image,
                    shape=(input_image.shape[0] - window_size[0] + 1,
                           input_image.shape[1] - window_size[1] + 1,) +
                          window_size,
                    strides=input_image.strides * 2)
    y = as_strided(input_image,
               shape=(input_image.shape[0] - window_size[0] + 1,
                      input_image.shape[1] - window_size[1] + 1),
               strides=input_image.strides * 2)
    ssd = np.einsum('ijkl,kl->ij', y, template)
    ssd *= - 2
    ssd += np.einsum('ijkl, ijkl->ij', y, y)
    ssd += np.einsum('ij, ij', template, template)

    return ssd

字符串
以下是原始和模板图像的链接:
https://ibb.co/bsgY71Z
https://ibb.co/C869x9F
我想用SSD方法在原始图像中找到摄影师的耳朵。一个长方形显示的人的耳朵在图像中。
如何解决这个错误并在匹配区域周围画一个矩形?
https://numpy.org/doc/stable/reference/generated/numpy.lib.stride_tricks.as_strided.html

n8ghc7c1

n8ghc7c11#

您有两个y=行。
第二个显然不可能。你给予一个二维的形状。所以y是一个二维数组,就像input_image一样。但是步幅的维数是input_image的2倍。那显然是无稽之谈。
第一个也是不可能的。但不那么明显。因为你的“模板”是一个RGBA彩色图像(所以是一个3D阵列),而图像是一个2D阵列(黑白图像)。所以y的形状是一个5d的形状。也就是说,由于您的图像为(490,487),模板为(27,27,4),因此将为(464,461,27,27,4)。例如,对于float64,假设输入是连续图像,并且具有连续跨距,则跨距为(3896,8,3896,8)
所以5形4大步,遂有了误差。形状有5个轴没有意义,步幅有4个轴。每个轴都需要一个尺寸(形状)和一个步幅。
问题显然是,你期望的模板是一个二维的b&w图像也。
如果是的话,那么第一个y就有意义。对于每个像素,y离边界足够远,以便能够从图像中提取滑动27 × 27窗口(因此是- template.shape[0]+1等),即作为该滑动窗口的2D阵列。这是一个四维数组。它的形状是(W-26,H-26,27,27)。
而步幅y正好是输入图像的步幅,重复。这意味着沿着轴0(沿图像的行)以及沿轴2(沿滑动窗口的行)的行进正好与沿input_image的轴0的行进相同。对于y轴1和3也是如此。
该代码按预期工作(即,它不会崩溃,也不会抱怨不一致,无论是在as_strided行中,还是在einsumy上的其他算术运算中。
当然,它并没有给予你所期望的结果,你也远远不能从中画出一个红色的方块。如果真有那么容易,我们这些计算机视觉Maven早就失业了:D。但是,从SO的Angular 来看,也就是从编码的Angular 来看,它确实实现了您想要实现的算法。只是,那个算法没那么神奇。看(越黑越好,因为它是一个差异)
x1c 0d1x的数据
除非模板真的是直接从图像中提取的(template=input_image[100:127,200:227]),否则它永远不会真正工作,只是逐像素比较绝对值。即便如此...我们确实在耳朵的位置看到了黑斑。但它不是唯一的一个。我只是把它的图像和它的一部分进行比较...



余弦相似性可能更现实。但即便如此,它也并不只是展示耳朵,什么都没有:(这里越亮越好,因为它是余弦)



但那是另一个问题了。对于你的问题,要紧的是:您需要templete是黑白图像,而不是彩色图像。

相关问题