PyMuPDF преобразовал изображение в массив numpy?

У меня есть функция, использующая pdf2image для преобразования каждой страницы PDF-файла в изображения. По разным причинам я больше не могу использовать pdf2image и теперь должен вместо этого использовать PyMuPDF, однако у меня возникли проблемы с получением тех же результатов, что и при использовании pdf2image.

Коды для pdf2image и PyMuPDF приведены ниже.

Каждый элемент в pages_list для pdf2image является numpy.ndarray, и я могу убедиться, что PDF-файлы были правильно преобразованы, просмотрев полученное изображение Image.fromarray(pages_list[i]) с помощью библиотеки PIL. Когда я просматриваю это с результатом pdf2image, я вижу исходный PDF-файл в виде изображения. Когда я просматриваю это с результатом PyMuPDF, я вижу один длинный очень тонкий столбец пикселей, которые не образуют полного изображения.

Расчетное время ожидания: я могу использовать Pillow локально для просмотра изображений, но в конечном итоге это перейдет в лямбда-функцию AWS, и мне не разрешено использовать Pillow и сохранять файлы.

pdf2image

pages = convert_from_path(img_path, 500)
pages_list = []
for i in range(len(pages)):
    pages_list.append(np.array(pages[i]))

PyMuPDF

pdf_doc = fitz.open(img_path)
pages_list = []
for i in range(len(pdf_doc)):
    page = pdf_doc[i]
    pixmap = page.get_pixmap(dpi=300)
    img = pixmap.tobytes()
    img_array = np.frombuffer(bytearray(img), dtype=np.uint8)
    img_array_np = np.array(img_array)
    pages_list.append(img_array_np)

Хотя я успешно преобразовал полученный объект байтов в массив numpy, массив сильно отличается от результатов pdf2image. Я надеялся получить точно такой же результат от PyMuPDF, как и от pdf2image, но не уверен, где именно я ошибаюсь. Я предполагаю, что это что-то в том, как я конвертирую байты в массив, но мне еще предстоит найти работающее решение.

# Repeated for pdf2image and PyMuPDF
print(f"{library_name}: \n{type(pages_list[0])}")
print(f".shape: {pages_list[0].shape}")
print(f".ndim: {pages_list[0].ndim}")
print(f".size: {pages_list[0].size}")

# pdf2image: 
# <class 'numpy.ndarray'>
# .shape: (5500, 4250, 3)
# .ndim: 3
# .size: 70125000

# PyMuPDF: 
# <class 'numpy.ndarray'>
# .shape: (378861,)
# .ndim: 1
# .size: 378861

Как я могу получить те же результаты от PyMuPDF, что и от pdf2image?

Используйте класс Pixmap, нейтрализованный объект изображения PyMuPDF. Он содержит область bytessamples, содержащую отдельные байты изображения. Например: img = np.ndarray([pix.h, pix.w, 3], dtype=np.uint8, buffer=pix.samples_mv).

Jorj McKie 23.04.2024 16:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
266
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Блок кода ниже решил мою проблему, благодаря этому вопросу и изменению кода, прокомментированному Джорджем Маккаем.

doc = fitz.open(img_path)
pages_list = []
for page in doc:
    zoom_x, zoom_y = 2.0, 2.0
    mat = fitz.Matrix(zoom_x, zoom_y)
    pix = page.get_pixmap(matrix=mat)
    im = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
    im = np.ascontiguousarray(im[..., [2, 1, 0]])
    pages_list.append(im)

Другие вопросы по теме