Làm cách nào để hiển thị hình ảnh từ một tệp trong Jupyter Notebook?


190

Tôi muốn sử dụng sổ ghi chép IPython như một cách để phân tích tương tác một số biểu đồ bộ gen tôi đang thực hiện với GenomeDiagrammô-đun của Biopython . Trong khi có tài liệu mở rộng về cách sử dụngmatplotlib để lấy đồ thị nội tuyến trong sổ ghi chép IPython, GenomeDiagram sử dụng bộ công cụ ReportLab mà tôi không nghĩ là được hỗ trợ cho đồ thị nội tuyến trong IPython.

Tuy nhiên, tôi đã nghĩ rằng một cách xoay quanh vấn đề này sẽ là viết sơ đồ cốt truyện / bộ gen vào một tệp và sau đó mở dòng hình ảnh sẽ có kết quả tương tự như thế này:

gd_diagram.write("test.png", "PNG")
display(file="test.png")

Tuy nhiên, tôi không thể tìm ra cách để làm điều này - hoặc biết nếu nó có thể. Vậy có ai biết nếu hình ảnh có thể được mở / hiển thị trong IPython không?

Câu trả lời:


332

Lịch sự của bài đăng này , bạn có thể làm như sau:

from IPython.display import Image
Image(filename='test.png') 

( tài liệu chính thức )


Tốt hơn nên sử dụng API công khai mà không cần truy cập nội bộ: from IPython.display import Imagenên hoạt động kể từ 0.13.
tomyun

64
điều này không hiển thị hình ảnh nếu bên trong một vòng lặp
muon

6
Hầu hết mọi người sẽ muốn câu trả lời của DrMcCleod.
AturSams

3
Điều này chỉ hoạt động với tôi nếu tôi vượt qua Image (filename = 'test.png') để hiển thị, như được đề xuất trong một chủ đề bên dưới: from IPython.core.display import Image, display<b /> display(Image(filename='test.png'))
John Strong

1
Trong trường hợp bạn muốn hình ảnh cũng hiển thị trong chế độ trình bày slide (mà bạn chạy cùng jupyter nbconvert mynotebook.ipynb --to slides --post serve) thì đường dẫn hình ảnh phải bắt đầu /để nó là một đường dẫn tuyệt đối từ gốc web, tức là![alt text](/test.jpg "Some Title")
ccpizza

213

Nếu bạn đang cố gắng hiển thị một Hình ảnh theo cách này trong một vòng lặp, thì bạn cần phải bọc hàm tạo Hình ảnh trong một phương thức hiển thị.

from IPython.display import Image, display

listOfImageNames = ['/path/to/images/1.png',
                    '/path/to/images/2.png']

for imageName in listOfImageNames:
    display(Image(filename=imageName))

1
Tại sao? (Đừng nói với tôi rằng nếu không nó không hoạt động. Vui lòng giải thích lý do tại sao cuộc gọi này để 'hiển thị' là cần thiết trong một vòng lặp nhưng không phải nếu bạn chỉ phân tán một hình ảnh).
Kris

10
Vì Sổ ghi chép IPython chỉ hiển thị giá trị trả về cuối cùng trong một ô, do đó, bất cứ khi nào bạn có hai đầu ra từ cùng một ô, bạn sẽ cần sử dụng phương thức 'hiển thị'. Xem câu hỏi này để biết thêm.
DrMcCleod

1
Bạn là anh hùng của tôi - Tôi đã tìm kiếm điều này trong hai ngày.
ZaxR

1
Điều đó thật tuyệt. Làm cách nào để tạo hình ảnh tiếp theo thay thế hình ảnh hiện tại, như hiệu ứng hoạt hình khi hình ảnh thay đổi theo thời gian?
blissweb

2
Tôi đã tự hỏi, làm thế nào chúng ta có thể gạch hình ảnh? Ví dụ để hiển thị một nhóm hình ảnh 4 x 4.
gmagno

31

Lưu ý, cho đến bây giờ các giải pháp được đăng chỉ hoạt động cho png và jpg!

Nếu bạn muốn nó thậm chí dễ dàng hơn mà không cần nhập thêm thư viện hoặc bạn muốn hiển thị Tệp GIF hoạt hình hoặc không hoạt hình trong Notebook Ipython của bạn. Chuyển đổi dòng nơi bạn muốn hiển thị nó để đánh dấu và sử dụng bản hack ngắn đẹp này!

![alt text](test.gif "Title")

2
đặt hình ảnh vào cùng thư mục với sổ ghi chép Jupyter hoặc thay vì "test.gif", sử dụng "tương đối / đường dẫn / test.gif"
Philipp Schwarz

23

Điều này sẽ nhập và hiển thị .jpghình ảnh trong Jupyter (được thử nghiệm với Python 2.7 trong môi trường Anaconda)

from IPython.display import display
from PIL import Image


path="/path/to/image.jpg"
display(Image.open(path))

Bạn có thể cần cài đặt PIL

trong Anaconda, điều này được thực hiện bằng cách gõ

conda install pillow

8

Courtesy of này trang, tôi thấy điều này làm việc khi những đề nghị trên không:

import PIL.Image
from cStringIO import StringIO
import IPython.display
import numpy as np
def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))

4

Bạn có thể sử dụng mã html trong phần đánh dấu: ví dụ:

 <img src="https://www.tensorflow.org/images/colab_logo_32px.png" />

2

Một phiên bản Python3 sạch hơn sử dụng numpy, matplotlib và PIL tiêu chuẩn. Hợp nhất câu trả lời để mở từ URL.

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

pil_im = Image.open('image.png') #Take jpg + png
## Uncomment to open from URL
#import requests
#r = requests.get('https://www.vegvesen.no/public/webkamera/kamera?id=131206')
#pil_im = Image.open(BytesIO(r.content))
im_array = np.asarray(pil_im)
plt.imshow(im_array)
plt.show()

2

Nếu bạn muốn hiển thị hiệu quả số lượng lớn hình ảnh, tôi khuyên bạn nên sử dụng gói IPyPlot

import ipyplot

ipyplot.plot_images(images_array, max_images=20, img_width=150)

nhập mô tả hình ảnh ở đây

Có một số chức năng hữu ích khác trong gói đó, nơi bạn có thể hiển thị hình ảnh trong các tab tương tác (tab riêng cho từng nhãn / lớp) rất hữu ích cho tất cả các tác vụ phân loại ML.

nhập mô tả hình ảnh ở đây


0

Khi sử dụng GenomeDiagramvới Jupyter (iPython), cách dễ nhất để hiển thị hình ảnh là chuyển đổi GenomeDiagram thành hình ảnh PNG. Điều này có thể được gói bằng cách sử dụng một đối tượng IPython.display.Image để làm cho nó hiển thị trong sổ ghi chép.

from Bio.Graphics import GenomeDiagram
from Bio.SeqFeature import SeqFeature, FeatureLocation
from IPython.display import display, Image
gd_diagram = GenomeDiagram.Diagram("Test diagram")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()
gd_feature_set.add_feature(SeqFeature(FeatureLocation(25, 75), strand=+1))
gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=1, start=0, end=100)
Image(gd_diagram.write_to_string("PNG"))

[Xem Notebook]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.