Изменение экстента изображения и соответствие графика с этим экстентом, а не пикселями - PullRequest
0 голосов
/ 10 мая 2019

Я создаю фигуру в matplotlib с двумя субплотами, первый субплот показывает изображение с линией, нанесенной поверх него, второй субплот показывает график значений пикселей по этой линии.Я добавил экстент к изображению, чтобы на осях отображался масштаб изображения, а не расстояние в пикселях, и я хотел бы, чтобы ось X второго подпункта показывала такое же масштабированное расстояние, однако я не могу изобразитькак изменить эту ось, так как я вытягиваю данные из массива, представляющего изображение.

Я думаю, что решение проблемы заключается в добавлении масштабного коэффициента моего изображения (1,93 мкм / пиксель), но я не уверен, где включить этот коэффициент, чтобы он также не масштабировалинтенсивность пикселей.

umPerPx = 1.93
linexPx = 225
liney1Px, liney2Px = 50, 100
linexUm = 225 * umPerPx
liney1Um, liney2Um = 50 * umPerPx, 100 * umPerPx

img = cv2.imread(test.tif, -1)
img_h_px, img_w_px = img.shape
img_h_um, img_w_um = img_h_px * umPerPx, img_w_px * umPerPx
fig = plt.figure(figsize=(12, 4))

ax_img = fig.add_subplot(1, 2, 1)
ax_img.set_title(imgDirList[i][:-4])
ax_img.imshow(img, cmap='gray', extent=[0, img_w_um, img_h_um, 0])
ax_img.plot([linexUm, linexUm], [liney1Um, liney2Um], 'r', linewidth=1)
ax_img.set_ylabel('Distance (microns)')

ax_prof = fig.add_subplot(1, 2, 2)
ax_prof.set_title('Intensity Profile')
ax_prof.plot(img[:, linexPx], 'r')
ax_prof.set_ylim(min(img[liney1Px:liney2Px, linexPx]), max(img[liney1Px:liney2Px, linexPx]))
ax_prof.set_xlim([liney1Px, liney2Px])
ax_prof.set_xlabel('Distance (pixels)')
ax_prof.set_ylabel('Intensity')

plt.show()

1 Ответ

1 голос
/ 11 мая 2019

Трудно быть уверенным без реальных данных, чтобы попробовать, но мне кажется, что вам нужно масштабировать значение х вашего второго графика.В существующем состоянии вы не предоставляете массив x, поэтому он автоматически рассчитывается из предоставленного вами массива y.Но что-то вроде этого может работать лучше:

ax_prof.plot(np.arange(len(img[:, linexPx]))*umPerPx, img[:, linexPx], 'r')
...