Получение данных графика из файла JPEG или png

#python #matplotlib #scipy #jupyter-notebook #python-imaging-library

#python #matplotlib #scipy #jupyter-ноутбук #python-imaging-library

Вопрос:

Я пишу программу, которая получает данные графика из графика (JPEG). Вертикальная ось логарифмическая. Я успешно создал программу, которая понимает горизонтальные и вертикальные оси как линейные (не логарифмические), см. Код ниже:

введите описание изображения здесь

 %matplotlib inline

from PIL import Image
from scipy import *
from pylab import *

im = array(Image.open('fig1.jpg'))

hh = im.shape[0]
ww = im.shape[2]

imshow(im)    
print(im[100,0,:])

Col = array([255,0,0])#赤
bnd = 30

yax = linspace(0.5,2e-4,hh)
xax = linspace(1,14,ww)

for i in range(hh):
    for j in range(ww):
        im[i,j,:] = 255*(any(im[i,j,:]>Col bnd) or any(im[i,j,:]<Col-bnd))

mapim = abs(im[:,:,0]/255-1).astype(bool)

yval = array([average(yax[mapim[:,t]]) for t in range(ww)])

rlt = interp(range(100),xax,yval)
  

Я понятия не имею, как его изменить, чтобы он понимал логарифмическую ось.
Пожалуйста, помогите мне.

Комментарии:

1. Если вы не используете более продвинутую систему распознавания изображений, вам нужно будет добавить некоторые is_logarithmic данные в свой алгоритм, который затем может обрабатывать данные в соответствии с вводом.

2. Я хочу знать значение из этого графика. Чтобы использовать эту программу, если все оси описываются как линейные. Однако, если график описывается как логарифмический, я не могу получить данные. Как я могу решить?

3. Сопоставьте свою ось y с линейным диапазоном, вычислив log() нижнюю и верхнюю границы соответственно — логарифмирование по любому основанию будет работать здесь, пока вы остаетесь последовательными на протяжении всей программы, но метки осей подсказывают log10() — а затем создайте свои данные так же, как вы уже это делали. После этого вы идете другим путем и вычисляете base ** y для всех значений y ваших данных, используя ту же базу, что и раньше.

4. На всякий случай, вы сначала проверили это? Это работает как шарм как в Интернете, так и на рабочем столе automeris.io/WebPlotDigitizer

Ответ №1:

Вам просто нужно преобразовать y max и min в логарифмический масштаб:

 ymax_lin = log10(0.5)
ymin_lin = log10(2e-4)

yax = linspace(ymax_lin,ymin_lin,hh)
  

и преобразуйте обратно в линейные yval значения в конце:

 yval = 10**yval
  

Полный рабочий код здесь:

 %matplotlib inline

from PIL import Image
from scipy import *
from pylab import *

im = array(Image.open('fig1.jpg'))

hh = im.shape[0]
ww = im.shape[1]

imshow(im)    
print(im[100,0,:])

Col = array([255,0,0])
bnd = 30


ymax_lin = log10(0.5)
ymin_lin = log10(2e-4)

yax = linspace(ymax_lin,ymin_lin,hh)
xax = linspace(1,14,ww)

for i in range(hh):
    for j in range(ww):
        im[i,j,:] = 255*(any(im[i,j,:]>Col bnd) or any(im[i,j,:]<Col-bnd))

mapim = abs(im[:,:,0]/255-1).astype(bool)


yval = array([average(yax[mapim[:,t]]) for t in range(ww)])

yval = 10**yval

rlt = interp(range(100),xax,yval)