gpt4 book ai didi

python - 图像 X 轴导数的中位数

转载 作者:行者123 更新时间:2023-12-03 21:10:28 24 4
gpt4 key购买 nike

我使用不同的方法计算导数,例如:

  • 与数组 [[-1, 1]] 卷积。
  • 通过计算图像和上述数组的 DFT 使用傅立叶定理,将它们相乘并执行 IDFT。
  • 直接通过导数公式(计算傅立叶,乘以索引和常数并计算逆)。

  • 所有方法的工作方式似乎几乎相同,但略有不同。
    解释为什么他们最终会得到略有不同的结果将不胜感激。
    在计算完这些之后,我开始玩弄结果以了解它,我发现了一些让我感到困惑的事情:
    让我感到困惑的主要事情是,当我尝试计算这个导数的中位数时,它总是 0.0。
    这是为什么?
    我添加了我用来计算这个的代码(至少是第一种方法),因为也许我做错了什么。
    from scipy.signal import convolve2d

    im = sl.read_image(r'C:\Users\ahhal\Desktop\Essentials\Uni\year3\SemesterA\ImageProcessing\Exercises\Ex2\external\monkey.jpg', 1)


    b = [[-1, 1]]

    print(np.median(convolve2d(im, b)))

    output: 0.0

    read_image函数是我自己的,这是实现:
    from imageio import imread
    from skimage.color import rgb2gray
    import numpy as np
    def read_image(filename, representation):
    """
    Receives an image file and converts it into one of two given representations.
    :param filename: The file name of an image on disk (could be grayscale or RGB).
    :param representation: representation code, either 1 or 2 defining wether the output
    should be a grayscale image (1) or an RGB image (2). If the input image is grayscale,
    we won't call it with representation = 2.
    :return: An image, represented by a matrix of type (np.float64) with intensities
    normalized to the range [0,1].
    """
    assert representation in [1, 2]

    # reads the image
    im = imread(filename)
    if representation == 1: # If the user specified they need grayscale image,
    if len(im.shape) == 3: # AND the image is not grayscale yet
    im = rgb2gray(im) # convert to grayscale (**Assuming its RGB and not a different format**)

    im_float = im.astype(np.float64) # Convert the image type to one we can work with.

    if im_float.max() > 1: # If image values are out of bound, normalize them.
    im_float = im_float / 255

    return im_float
    编辑 2:
    我在几个不同的图像上尝试过,所有图像都得到了 0.0。
    我在示例中使用的图像是:
    enter image description here

    最佳答案

    I computed derivatives using different methods such as :

    1. convolution with an array [[-1, 1]].
    2. Using the fourier theorem by computing DFT of the image and the array mentioned above, multiplying them and performing IDFT.
    3. Directly through the derivative formula (Computing Fourier, multiplying by index and a constant and computing the inverse).

    这些导数方法都是近似的,并做出不同的假设:
  • 卷积 [[-1, 1]] 计算相邻元素之间的差异,
    derivative ~= data[n+1] − data[n]
    您可以将其解释为使用线段对数据进行插值,然后取该插值的导数:
    I(x) = data[n] + (data[n+1] − data[n]) * (x − n)
    所以近似假设基础函数是局部线性的。可以通过泰勒展开分析误差,发现误差来自于忽略的高阶项。换句话说,如果函数没有强非线性项,则近似是准确的。这是finite differences的一个简单案例.
  • 这与 1 相同,除了不同的边界处理来处理图像边缘附近的样本卷积。默认情况下,scipy.signal.convolve2d做零填充(尽管您可以使用 boundary 选项来选择其他一些方法)。然而,当通过 DFT 计算卷积时,隐含的边界处理是周期性的,环绕在图像边缘。因此,由于边界处理不同,1 和 2 的结果对于边缘附近的像素边距是不同的。
  • 通过在 DFT 表示下乘以 iω 来计算导数可以解释为评估 sinc interpolation 的导数数据。 Sinc 插值假设数据为 band limited .误差来自超出奈奎斯特频率的频谱。特别是,如果从对象边界存在硬跳跃不连续性,则图像不受带宽限制,基于 DFT 的导数将在跳跃附近有大量误差,表现为振铃伪影。

  • The main thing that baffles me is that when I try computing the median of this derivative, its ALWAYS 0.0.


    我不知道为什么这里会发生这种情况,但不应该总是这样。例如,如果每个图像行是单位斜坡 data[n] = n ,那么 [[-1, 1]] 的卷积在任何地方都等于 1,除了取决于边界处理可能不在边缘,所以中位数为 1。

    关于python - 图像 X 轴导数的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64154295/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com