我尝试过三种算法:
第一种算法:
(score, diff) = compare_ssim(img1, img2, full=True)
diff = (diff * 255).astype("uint8")第二种算法:
from PIL import Image ,ImageChops
img1=Image.open("canny1.jpg")
img2=Image.open("canny2.jpg")
diff=ImageChops.difference(img1,img2)
if diff.getbbox():
diff.show()第三种算法:
image3= cv2.subtract(image1,image2)问题是这些算法是如此敏感。如果图像有不同的噪声,他们认为这两个图像是完全不同的。有什么办法解决这个问题吗?
发布于 2020-01-22 14:15:20
这些图片是不同的在许多方面(变形,照明,颜色,形状)和简单的图像处理只是不能处理所有这一切。
我建议采用一种更高层次的方法,以简单的几何图形的形式提取这些管子的几何和颜色。然后比较图表而不是图像。

我承认,说起来容易做起来难,而且只适用于这种特殊的场景。
发布于 2020-01-22 14:17:50
这是非常困难的帮助,因为我们真的不知道你可以改变哪些参数,比如你能保持你的相机固定吗?会不会总是管的问题?管子的颜色呢?
尽管如此,我认为您正在寻找的是一个框架的图像配准,我建议您使用SimpleElastix。它主要用于医学图像,因此您可能需要熟悉库SimpleITK。有趣的是,您有很多参数来控制注册。我认为,您必须查看文档,以了解如何控制特定的图像频率,即创建波形和变形图像的频率。此后,我没有将其配置为具有足够的局部失真,您将不得不找到最佳的折衷,但我认为它应该足够灵活。
无论如何,您可以通过下面的代码获得这样的结果,我不知道它是否有帮助,我希望如此:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import SimpleITK as sitk
fixedImage = sitk.ReadImage('1.jpg', sitk.sitkFloat32)
movingImage = sitk.ReadImage('2.jpg', sitk.sitkFloat32)
elastixImageFilter = sitk.ElastixImageFilter()
affine_registration_parameters = sitk.GetDefaultParameterMap('affine')
affine_registration_parameters["NumberOfResolutions"] = ['6']
affine_registration_parameters["WriteResultImage"] = ['false']
affine_registration_parameters["MaximumNumberOfSamplingAttempts"] = ['4']
parameterMapVector = sitk.VectorOfParameterMap()
parameterMapVector.append(affine_registration_parameters)
parameterMapVector.append(sitk.GetDefaultParameterMap("bspline"))
elastixImageFilter.SetFixedImage(fixedImage)
elastixImageFilter.SetMovingImage(movingImage)
elastixImageFilter.SetParameterMap(parameterMapVector)
elastixImageFilter.Execute()
registeredImage = elastixImageFilter.GetResultImage()
transformParameterMap = elastixImageFilter.GetTransformParameterMap()
resultImage = sitk.Subtract(registeredImage, fixedImage)
resultImageNp = np.sqrt(sitk.GetArrayFromImage(resultImage) ** 2)
cv2.imwrite('gray_1.png', sitk.GetArrayFromImage(fixedImage))
cv2.imwrite('gray_2.png', sitk.GetArrayFromImage(movingImage))
cv2.imwrite('gray_2r.png', sitk.GetArrayFromImage(registeredImage))
cv2.imwrite('gray_diff.png', resultImageNp)您的第一个图像大小调整为256x256:

你的第二张照片:

您的第二张图像与第一张注册:

下面是第一张和第二张照片的区别,它可以显示出什么是不同的:

发布于 2020-01-22 14:04:36
这是图像处理的经典问题之一,而且没有一个普遍适用的答案。可能的答案在很大程度上取决于您所拥有的图像类型、您希望从中提取的信息类型以及它们之间的差异。
你可以通过两种方法来降低噪音: a)拍摄同一物体的几幅图像,这样物体就不会改变。你可以叠加的图像和噪音是减少了平方根的图像数目.( b)你可以在图像上运行模糊过滤器。你越模糊,平均噪音就越大。这里的噪声是通过你平均像素数的平方根来减少的。但是图像中的细节也是如此。
在这两种情况下,(a)和(b)在应用任何一种方法后都会运行差异分析。
可能不适用于你,因为你很可能无法获得:如果你能抓住平面场,给你的相机的光照和像素敏感性的不均匀性,并允许纠正图像之前,任何处理。类似的暗场也是如此,它估计了摄像机读出噪声的影响,并允许对这些图像进行校正。
还有另一个更高层次的第三个选项:首先在一个足够详细的层次上运行您的对象分析。并比较结果。
https://stackoverflow.com/questions/59859765
复制相似问题