В качестве первого плана вы можете загрузить изображение с помощью PIL / Pillow или OpenCV, изменить его в оттенках серого и изменить его размер до 65536 пикселей в ширину и 100 пикселей в высоту.
Тогда у вас будет массив Numpy с размерами (100,65536). Затем вы можете запустить np.argmin()
, чтобы найти индекс (значение y) самого темного пикселя в каждом столбце.
Или найти индексы всех низкозначных пикселей и взять их медиану вместо второго шага. выше.
Код начинается следующим образом:
#!/usr/bin/env python3
from PIL import Image
import numpy as np
# Load image and convert to greyscale
im = Image.open('signal.png').convert('L')
# Resize to match required output
big = im.resize((65536,100), resample=Image.NEAREST)
# Make Numpy array
na = np.array(big)
# This looks about right, I think
print(np.argmin(na,axis=0))
Если вы обрезаете изображение так, чтобы сигнал полностью касался краев, то появляется первый черный пиксель слева в качестве элемента списка 0 последний пиксель справа выступает в качестве последнего элемента вашего списка, а самый нижний черный пиксель выходит со значением y, равным 0, а пик получается со значением y, равным 100.
Обрезка будет выглядеть так:
from PIL import Image, ImageOps
import numpy as np
# Load image and convert to greyscale
im = Image.open('signal.png').convert('L')
# Get bounding box
bbox = ImageOps.invert(im).getbbox()
# Trim original image so that signal touches edge on all sides
im = im.crop(bbox)
... continue as before ...