首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >形状检测

形状检测
EN

Stack Overflow用户
提问于 2020-01-22 12:26:47
回答 3查看 434关注 0票数 1

我尝试过三种算法:

  1. 用Compare_ssim进行比较。
  2. PIL (ImageChops.difference)法检测差异。
  3. 图像减法。

第一种算法:

代码语言:javascript
复制
(score, diff) = compare_ssim(img1, img2, full=True)
diff = (diff * 255).astype("uint8")

第二种算法:

代码语言:javascript
复制
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()

第三种算法:

代码语言:javascript
复制
image3= cv2.subtract(image1,image2)

问题是这些算法是如此敏感。如果图像有不同的噪声,他们认为这两个图像是完全不同的。有什么办法解决这个问题吗?

EN

回答 3

Stack Overflow用户

发布于 2020-01-22 14:15:20

这些图片是不同的在许多方面(变形,照明,颜色,形状)和简单的图像处理只是不能处理所有这一切。

我建议采用一种更高层次的方法,以简单的几何图形的形式提取这些管子的几何和颜色。然后比较图表而不是图像。

我承认,说起来容易做起来难,而且只适用于这种特殊的场景。

票数 3
EN

Stack Overflow用户

发布于 2020-01-22 14:17:50

这是非常困难的帮助,因为我们真的不知道你可以改变哪些参数,比如你能保持你的相机固定吗?会不会总是管的问题?管子的颜色呢?

尽管如此,我认为您正在寻找的是一个框架的图像配准,我建议您使用SimpleElastix。它主要用于医学图像,因此您可能需要熟悉库SimpleITK。有趣的是,您有很多参数来控制注册。我认为,您必须查看文档,以了解如何控制特定的图像频率,即创建波形和变形图像的频率。此后,我没有将其配置为具有足够的局部失真,您将不得不找到最佳的折衷,但我认为它应该足够灵活。

无论如何,您可以通过下面的代码获得这样的结果,我不知道它是否有帮助,我希望如此:

代码语言:javascript
复制
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:

你的第二张照片:

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

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

票数 1
EN

Stack Overflow用户

发布于 2020-01-22 14:04:36

这是图像处理的经典问题之一,而且没有一个普遍适用的答案。可能的答案在很大程度上取决于您所拥有的图像类型、您希望从中提取的信息类型以及它们之间的差异。

你可以通过两种方法来降低噪音: a)拍摄同一物体的几幅图像,这样物体就不会改变。你可以叠加的图像和噪音是减少了平方根的图像数目.( b)你可以在图像上运行模糊过滤器。你越模糊,平均噪音就越大。这里的噪声是通过你平均像素数的平方根来减少的。但是图像中的细节也是如此。

在这两种情况下,(a)和(b)在应用任何一种方法后都会运行差异分析。

可能不适用于你,因为你很可能无法获得:如果你能抓住平面场,给你的相机的光照和像素敏感性的不均匀性,并允许纠正图像之前,任何处理。类似的暗场也是如此,它估计了摄像机读出噪声的影响,并允许对这些图像进行校正。

还有另一个更高层次的第三个选项:首先在一个足够详细的层次上运行您的对象分析。并比较结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59859765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档