gpt4 book ai didi

python - 如何在python中找到拐点?

转载 作者:行者123 更新时间:2023-12-02 16:05:11 25 4
gpt4 key购买 nike

我有一个RGB图像的直方图,它代表三个分量R,G和B的三个曲线。我想找到每个曲线的拐点。我使用二阶导数来找到它们,但我不能,二阶导数不会取消其返回值null。那么如何找到拐点?还有其他方法可以找到它们吗?
enter image description here

import os, cv2, random
import numpy as np
import matplotlib.pyplot as plt
import math
from sympy import *

image = cv2.imread('C:/Users/Xers/Desktop/img.jpg')

CHANNELS = ['r', 'g', 'b']

for i, channel in enumerate( CHANNELS ):


histogram = cv2.calcHist([image], [i], None, [256], [0,256])

histogram = cv2.GaussianBlur( histogram, (5,5), 0)

plt.plot(histogram, color = channel)


x= plt.xlim([0,256])
y = plt.ylim([0, 24000])


derivative1= np.diff(histogram, axis=0)
derivative2= np.diff(derivative1, axis=0)

inf_point = np.where ( derivative2 == 0)[0]
print(inf_point)
plt.show()

最佳答案

您的代码有两个数字性质的问题:

  • 数据似乎不够连续,无法依靠从两个后续np.diff()应用程序
  • 计算出的二阶导数
    即使是
  • ,也正是0的机会非常渺茫

  • 要解决第一个问题,您应该对直方图进行平滑处理(例如,对直方图本身使用统一或高斯滤波器)。
    要解决第二点,而不是寻找 == 0,而是寻找正负转换点(反之亦然)。

    给您一些可能的方法的最小示例:
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.ndimage import gaussian_filter1d


    np.random.seed(0)

    # generate noisy data
    raw = np.cumsum(np.random.normal(5, 100, 1000))
    raw /= np.max(raw)

    # smooth
    smooth = gaussian_filter1d(raw, 100)

    # compute second derivative
    smooth_d2 = np.gradient(np.gradient(smooth))

    # find switching points
    infls = np.where(np.diff(np.sign(smooth_d2)))[0]

    # plot results
    plt.plot(raw, label='Noisy Data')
    plt.plot(smooth, label='Smoothed Data')
    plt.plot(smooth_d2 / np.max(smooth_d2), label='Second Derivative (scaled)')
    for i, infl in enumerate(infls, 1):
    plt.axvline(x=infl, color='k', label=f'Inflection Point {i}')
    plt.legend(bbox_to_anchor=(1.55, 1.0))
    plot

    关于python - 如何在python中找到拐点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62537703/

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