我有以下图像:
我正在使用希尔伯特变换获取包络,并且试图找到峰值。
使用以下代码,我得到以下错误的峰值检测。
基本上,我正在尝试根据信封和峰值对字母进行细分...但是我在机器上出现了错误的峰值。
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
'''
reduces the photo to a vector representing its pixel freuqeuncy at each column
'''
def image_reduce(img):
col_counts = cv2.reduce(img, 0, cv2.REDUCE_SUM, dtype=cv2.CV_32SC1)
column = col_counts.flatten().tolist()
# print("Column counts:\n\n", column)
return column
def slice_digits(image_name):
img = cv2.imread(image_name, 0)
column_frequency = image_reduce(cv2.bitwise_not(img))
column_frequency = normalize(column_frequency)
env = np.abs(sigtool.hilbert(column_frequency))
peaks, _ = find_peaks(env > 0.1, height= 0.51)
plt.plot(env)
plt.scatter(peaks, env[peaks], s=50, c='r')
all_slices = []
for i in range(len(peaks) - 1):
x0, x1 = peaks[i:i + 2]
image_slice = img[:, x0:x1]
print("coords:", x0, x1)
# Now do something with the slice, e.g.
all_slices.append(image_slice)
plt.figure("Slice %d)" % i)
plt.imshow(image_slice)
plt.show()
if __name__ == '__main__':
image = r"c:\ahmed\doc.png"
res_image = slice_digits(image)
答案 0 :(得分:1)
只需替换行:
peaks, _ = find_peaks(env > 0.1, height= 0.51)
作者
peaks, _ = find_peaks(env, height = 0.1, width = 4)
给予
我建议您花些时间阅读所用功能的文档。敌人的例子,在这里设置height = 0.51
毫无意义,因为高度是:
所需的峰高。一个数字,无,匹配x的数组 或前者的2元素序列。第一个元素永远是 解释为最小值,如果提供,则解释为最大值 所需的高度。
但是,请记住,如果信号差异太大,则很难对找到峰的函数进行可靠的“校准”。例如,此处的参数width设置为4,但是我建议您使用所有参数来查看它们的作用。
最后,这总是一个品味问题。左侧的第一个图片是双图片。您怎么知道最大值实际上是您想要的?在信号中找到可靠的峰值非常困难。