Преобразовать изображение сигнала в список python, указав ни одного из точек в 1D - PullRequest
0 голосов
/ 12 января 2020

Я изо всех сил пытаюсь преобразовать изображение сигнала обратно в список python (он долгое время составлялся go, и я потерял данные, у меня есть только изображения). Я искал по inte rnet, но я нашел ответы о том, как преобразовать 2d изображение в 1d, и я хочу получить сигнал обратно.

Короче говоря: у меня есть это изображение сигнала :

enter image description here

, и я хочу преобразовать его в список python размером 65535, поэтому мой список должен выглядеть следующим образом: list = [0,14, 0,144, 0,12 ......]

Спасибо!

Ответы [ 2 ]

4 голосов
/ 12 января 2020

В качестве первого плана вы можете загрузить изображение с помощью 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 ...
1 голос
/ 12 января 2020

По сути, вам придется «сканировать» изображения слева направо и определять правильное значение сигнала на каждом «временном шаге». Поскольку изображение, которое вы представили, не имеет масштаба / единиц измерения, вы, вероятно, захотите нормализовать все значения сигнала от 0 до 1, как вы подразумевали в своем ответе. Позже вы можете настроить масштаб сигнала, если это неправильный диапазон.

Похоже, что ваши изображения имеют сглаживание на каждом шаге сигнала, что означает, что у вас не будет столбцов всех нули, кроме одного значения «сигнала». Вы будете иметь кластер значений сигнала на каждом временном шаге, некоторые из которых слабее, потому что сжатие изображения слегка размыло сигнал. Это не должно быть проблемой, так как вы просто найдете максимум на каждом временном шаге.

Предполагая, что эти изображения в оттенках серого (если нет, преобразуйте в оттенки серого), вам нужно найти максимум (или минимум, если сигнал отображается черным цветом) значение цвета в каждом столбце пикселей на изображениях (представляющее временные шаги сигнала).

Предложение Марка Сетчелла PIL / Pillow кажется хорошим первым шагом.

numpy s amax берет матрицу и выравнивает ее до максимума по всей оси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...