【问题标题】:Python: Binarize image and fill shapesPython:二值化图像和填充形状
【发布时间】:2018-12-31 11:05:45
【问题描述】:

我正在尝试测量两张图像 [ab] 之间的相似度,其中一张完全曝光不足:

我认为我可以对第二张图像进行二值化,使其在视觉上看起来与第一张更相似,但似乎第二张图像在叶子中根本没有太多强度,因为下面的二值化代码使图像基本保持不变:

from scipy.misc import imread, imsave
from skimage.transform import resize
from glob import glob

size = 255
a = imread('a.jpg', mode='L')
b = imread('b.jpg', mode='L')
a = resize(a, (size, size))
b = resize(b, (size, size))

# specify a threshold 0-1
threshold = 0.8

# make all pixels < threshold black
a_binarized = 255.0 * (a > threshold)
b_binarized = 255.0 * (b > threshold)

imsave('a_binarized.jpg', a)
imsave('b_binarized.jpg', b)

有谁知道我可以如何操作第二张图片使其看起来像第一张?其他人可以在此问题上提供的任何帮助将不胜感激。

【问题讨论】:

  • 右图已经几乎是黑白的了。 (或具有非常尖锐的双峰分布的灰度。)这就是为什么二值化不会使它有任何不同的原因。尝试从左侧图像中提取轮廓?
  • @DYZ,是的,完全正确。是否有一种技术可以将右侧的图像转换为类似于左侧的图像?我有成千上万这样的对...
  • 如果你使用高通滤波器只得到图像的边缘,然后计算它们的相似度?

标签: python image image-processing machine-learning computer-vision


【解决方案1】:

使用高通滤波器获取图像的轮廓并进行比较。例如,您可以使用 sobel 过滤器:

    from scipy import ndimage, misc
    import matplotlib.pyplot as plt
    from sklearn.metrics import mean_squared_error

    image1 = ndimage.sobel(image1) 
    image2 = ndimage.sobel(image2)

    print(mean_squared_error(image1, image2)) # difference between them

之所以有效,是因为较高频率位于图像边缘,因此通过应用高通滤波器,您可以保留这些高频并衰减最低频率。由于图像具有相同的边界,您将能够比较它们并获得高相似度(或低均方误差)

【讨论】:

  • 感谢您的想法。唯一的问题是 A 和随机猫图像之间的 MSE 低于上面两个图像之间的 MSE:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2015-04-05
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多