Как сохранить изображение в градациях серого в Python? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь сохранить изображение в градациях серого с помощью matplotlib savefig ().Я обнаружил, что png-файл, который сохраняется после использования matplotlib savefig (), немного отличается от выходного изображения, которое отображается при запуске кода.Выходное изображение, которое генерируется при выполнении кода, содержит больше деталей, чем сохраненный рисунок.

Как сохранить выходной график таким образом, чтобы все детали сохранялись в выходном изображении?

Мой код указан ниже:

import cv2
import matplotlib.pyplot as plt

plt.figure(1)
img_DR = cv2.imread(‘image.tif',0)
edges_DR = cv2.Canny(img_DR,20,40)
plt.imshow(edges_DR,cmap = 'gray')
plt.savefig('DR.png')
plt.show()

Входной файл ('image.tif') можно найти по адресу здесь .

Ниже приводится выходное изображение, которое генерируется при выполнении кода:

enter image description here

Ниже сохранено изображение:

enter image description here

Хотя два вышеупомянутых изображенияОбозначим одну и ту же картинку, можно заметить, что они немного отличаются.Внимательный взгляд на круговую периферию двух изображений показывает, что они разные.

Ответы [ 3 ]

5 голосов
/ 28 мая 2019

Сохранить фактическое изображение в файл, а не рисунок.DPI между рисунком и фактическим созданным изображением от вашей обработки будет отличаться.Поскольку вы используете OpenCV, используйте cv2.imwrite.В вашем случае:

cv2.imwrite('DR.png', edges_DR)

Используйте формат PNG, так как JPEG с потерями и, следовательно, даст вам снижение качества для продвижения файлов небольшого размера.Если здесь ключевым является точность, используйте стандарт сжатия без потерь, и в качестве примера можно привести PNG.


Если вы почему-то против использования OpenCV, Matplotlib имеет эквивалентный метод записи изображений, называемый imsave, который имеет тот же синтаксис, что и cv2.imwrite:

plt.imsave('DR.png', edges_DR, cmap='gray')

Обратите внимание, что я устанавливаю цветовую карту в оттенках серого для imsave, поскольку она не выводится автоматически, например, как OpenCV записывает изображения в файл.

3 голосов
/ 28 мая 2019

Поскольку вы используете cv2 для загрузки изображения, почему бы не использовать его и для его сохранения.Я думаю, что вы ищете команду:

cv2.imwrite ('gray.jpg', gray_image)

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

Использование DPI, соответствующего размеру изображения, похоже, имеет значение.

Размер изображения: ширина = 2240 и высота = 1488 (img_DR.shape). Используя fig.get_size_inches(), я вижу, что размер изображения в дюймах array([7.24, 5.34]). Таким образом, соответствующий dpi составляет около 310, так как 2240/7.24=309.4 и 1488/5.34=278.65.

Теперь я делаю plt.savefig('DR.png', dpi=310) и получаю

DPI=310 image

Один эксперимент, который нужно сделать, - это выбрать достаточно высокий DPI, вычислить высоту и ширину фигуры в дюймах, например, width_inch = width_pixel/DPI и установить размер фигуры, используя plt.figure(figsize=(width_inch, height_inch)), и посмотреть, увеличится / уменьшится само отображаемое изображение. в качестве.

Надеюсь, это поможет.

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