按像素邻域进行图像比较

时间:2020-02-27 17:13:11

标签: python image opencv correlation image-comparison

鉴于同一场景的两幅图像具有潜在的对准,焦点,照明差异和噪声,我正在寻找一种可以在这些图像上运行的操作,以产生它们之间差异的另一幅图像,从而将这些差异减到最小或更多他们之间的结构差异要比全局差异敏感。我最初的想法是将图像A中的一个像素周围的对应邻域与图像B中的相同像素进行比较。

此功能是否已在OpenCV或其他Python库(scipy,numpy等)中实现?

我的想法:

一个简单的框架差异会告诉我发生绝对差异的位置,但对对齐和照明差异非常脆弱。也许有一种方法可以找到像素附近的标准偏差。 Numpy的std仅按轴起作用...

这似乎是我想要两个信号之间的相关性,但是我不知道如何将其扩展到一个非重复的2D世界。 scipy.signal.correlate2d 似乎可以解决,如果有一种有效的方法可以将相应的邻域传递给它。但是,我对引擎盖下发生的事情没有很好的感觉。

一个图像的卷积(内核来自其他图像中的相应位置)将进行比较,从而可以很好地处理噪声和聚焦问题,但是我不知道如何使用 >动态内核进行卷积。

如果我有一个基本相同的图像库(不是最初的假设,但可行)可以与一个图像进行比较,则可以使用均值差或高斯混合。但是我认为这不会对对齐或照明有所帮助。我可以先对齐图像,然后进行比较。

根据下面的评论,我查找了skimage SSIM(结构相似性索引)方法,该方法用于测量由于有损压缩和解压缩等原因导致的图像退化。实际上,它希望获得同一图像的两份副本-一个真实来源,一个由于有损压缩和解压缩而处于潜在降级状态。此方法对全局偏置(照明)效果很好,但总体上比较偏(照明)敏感(通过设计),尤其对未对准敏感。

该评论使我想到了 MSE ,该功能在全球范围内起作用,但是如果按邻域对图像进行迭代,则会得到很好的结果-对偏差,噪声不敏感,但对结构差异不敏感。但是,它对对齐差异相当敏感,并且在python中非常慢...

# Mean Squared Error
def mse(imageA, imageB):
    return np.mean((imageA - imageB)**2)

from scipy import misc
import numpy as np
face = misc.face()
nface = np.array(face)
nface[295:305,395:415] = face[195:205,495:515] #discontinuous region
nface = cv2.blur(nface, (3,3)) # focus effects
nface = nface + (np.random.randn(*face.shape) * 10 - 5) # noise
nface = (nface * .9 + 20).astype(int) #lighting
n = m = 3
output = np.zeros(face.shape[:2])
for i in range(face.shape[0]):
    for j in range(face.shape[1]):
        if i > n and i < face.shape[0]-n and j > m and j < face.shape[1]-m:
            output[i,j] = mse(nface[i-n:i+n, j-m:j+m], face[i-n:i+n, j-m:j+m])

这是常见的图像处理技术吗?在openCV或Numpy中有此名称或优化的实现吗?

0 个答案:

没有答案