Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Đầu tiên, hãy bắt đầu IPython. Đây là một cải tiến tuyệt vời nhất cho dấu nhắc Python tiêu chuẩn và nó liên kết đặc biệt tốt với Matplotlib. Bắt đầu IPython trực tiếp tại shell hoặc với Jupyter Notebook (trong đó IPython là kernel đang chạy)

Khi IPython đã bắt đầu, bây giờ chúng ta cần kết nối với vòng lặp sự kiện GUI. Điều này cho IPython biết vị trí (và cách thức) hiển thị các ô. Để kết nối với vòng lặp GUI, hãy thực thi phép thuật %matplotlib tại dấu nhắc IPython của bạn. Có nhiều chi tiết hơn về chính xác những gì nó làm tại

Nếu bạn đang sử dụng Jupyter Notebook, các lệnh tương tự cũng có sẵn, nhưng mọi người thường sử dụng một đối số cụ thể cho ma thuật %matplotlib

In [1]: %matplotlib inline

Thao tác này sẽ bật tính năng vẽ sơ đồ nội tuyến, nơi đồ họa sơ đồ sẽ xuất hiện trong sổ ghi chép của bạn. Điều này có ý nghĩa quan trọng đối với tính tương tác. Đối với biểu đồ nội tuyến, các lệnh trong các ô bên dưới ô tạo ra biểu đồ sẽ không ảnh hưởng đến biểu đồ. Ví dụ: không thể thay đổi bản đồ màu từ các ô bên dưới ô tạo biểu đồ. Tuy nhiên, đối với các chương trình phụ trợ khác, chẳng hạn như Qt, mở một cửa sổ riêng, các ô bên dưới các ô tạo biểu đồ sẽ thay đổi biểu đồ - đó là một đối tượng trực tiếp trong bộ nhớ

Hướng dẫn này sẽ sử dụng giao diện đồ thị ẩn của Matplotlib, pyplot. Giao diện này duy trì trạng thái toàn cầu và rất hữu ích để thử nghiệm nhanh chóng và dễ dàng với các cài đặt cốt truyện khác nhau. Phương án thay thế là rõ ràng, phù hợp hơn để phát triển ứng dụng lớn. Để biết giải thích về sự đánh đổi giữa giao diện ẩn và rõ ràng, hãy xem và Hướng dẫn bắt đầu nhanh để bắt đầu sử dụng giao diện rõ ràng. Bây giờ, hãy tiếp tục với cách tiếp cận ngầm.

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

Nhập dữ liệu hình ảnh vào mảng Numpy

Matplotlib dựa vào thư viện Gối để tải dữ liệu hình ảnh

Đây là hình ảnh chúng ta sẽ chơi với

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Đó là hình ảnh PNG RGB 24 bit (8 bit cho mỗi R, G, B). Tùy thuộc vào nơi bạn lấy dữ liệu, các loại hình ảnh khác mà bạn có thể gặp nhất là hình ảnh RGBA, cho phép độ trong suốt hoặc hình ảnh thang độ xám (độ sáng) một kênh. Tải xuống bọ xít. png vào máy tính của bạn cho phần còn lại của hướng dẫn này

Và ở đây chúng tôi đi

img = mpimg.imread('../../doc/_static/stinkbug.png')
print(img)

[[[0.40784314 0.40784314 0.40784314]
  [0.40784314 0.40784314 0.40784314]
  [0.40784314 0.40784314 0.40784314]
  ...
  [0.42745098 0.42745098 0.42745098]
  [0.42745098 0.42745098 0.42745098]
  [0.42745098 0.42745098 0.42745098]]

 [[0.4117647  0.4117647  0.4117647 ]
  [0.4117647  0.4117647  0.4117647 ]
  [0.4117647  0.4117647  0.4117647 ]
  ...
  [0.42745098 0.42745098 0.42745098]
  [0.42745098 0.42745098 0.42745098]
  [0.42745098 0.42745098 0.42745098]]

 [[0.41960785 0.41960785 0.41960785]
  [0.41568628 0.41568628 0.41568628]
  [0.41568628 0.41568628 0.41568628]
  ...
  [0.43137255 0.43137255 0.43137255]
  [0.43137255 0.43137255 0.43137255]
  [0.43137255 0.43137255 0.43137255]]

 ...

 [[0.4392157  0.4392157  0.4392157 ]
  [0.43529412 0.43529412 0.43529412]
  [0.43137255 0.43137255 0.43137255]
  ...
  [0.45490196 0.45490196 0.45490196]
  [0.4509804  0.4509804  0.4509804 ]
  [0.4509804  0.4509804  0.4509804 ]]

 [[0.44313726 0.44313726 0.44313726]
  [0.44313726 0.44313726 0.44313726]
  [0.4392157  0.4392157  0.4392157 ]
  ...
  [0.4509804  0.4509804  0.4509804 ]
  [0.44705883 0.44705883 0.44705883]
  [0.44705883 0.44705883 0.44705883]]

 [[0.44313726 0.44313726 0.44313726]
  [0.4509804  0.4509804  0.4509804 ]
  [0.4509804  0.4509804  0.4509804 ]
  ...
  [0.44705883 0.44705883 0.44705883]
  [0.44705883 0.44705883 0.44705883]
  [0.44313726 0.44313726 0.44313726]]]

Lưu ý dtype ở đó - float32. Matplotlib đã thay đổi tỷ lệ dữ liệu 8 bit từ mỗi kênh thành dữ liệu dấu phẩy động trong khoảng từ 0. 0 và 1. 0. Xin lưu ý thêm, kiểu dữ liệu duy nhất mà Gối có thể hoạt động là uint8. Biểu đồ Matplotlib có thể xử lý float32 và uint8, nhưng việc đọc/ghi hình ảnh cho bất kỳ định dạng nào khác ngoài PNG bị giới hạn ở dữ liệu uint8. Tại sao 8 bit? . Tại sao họ chỉ có thể hiển thị 8 bit/kênh? . Thêm ở đây (từ quan điểm nhiếp ảnh). Hướng dẫn độ sâu bit Phong cảnh sáng

Mỗi danh sách bên trong đại diện cho một pixel. Ở đây, với một ảnh RGB, có 3 giá trị. Vì là ảnh đen trắng nên R, G, B đều giống nhau. Một RGBA (trong đó A là alpha hoặc độ trong suốt) có 4 giá trị cho mỗi danh sách bên trong và hình ảnh độ chói đơn giản chỉ có một giá trị (và do đó chỉ là mảng 2 chiều, không phải mảng 3 chiều). Đối với hình ảnh RGB và RGBA, Matplotlib hỗ trợ các kiểu dữ liệu float32 và uint8. Đối với thang độ xám, Matplotlib chỉ hỗ trợ float32. Nếu dữ liệu mảng của bạn không đáp ứng một trong những mô tả này, bạn cần thay đổi kích thước của nó

Vẽ các mảng có nhiều mảng như hình ảnh

Vì vậy, bạn có dữ liệu của mình trong một mảng có nhiều mảng (bằng cách nhập dữ liệu hoặc bằng cách tạo dữ liệu đó). Hãy kết xuất nó. Trong Matplotlib, điều này được thực hiện bằng hàm. Ở đây chúng ta sẽ lấy đối tượng cốt truyện. Đối tượng này cung cấp cho bạn một cách dễ dàng để thao tác biểu đồ từ dấu nhắc

imgplot = plt.imshow(img)

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Bạn cũng có thể vẽ bất kỳ mảng numpy nào

Áp dụng lược đồ màu giả cho các ô hình ảnh

Pseudocolor có thể là một công cụ hữu ích để tăng cường độ tương phản và trực quan hóa dữ liệu của bạn dễ dàng hơn. Điều này đặc biệt hữu ích khi trình bày dữ liệu của bạn bằng máy chiếu - độ tương phản của chúng thường khá kém

Màu giả chỉ liên quan đến hình ảnh đơn kênh, thang độ xám, độ sáng. Chúng tôi hiện có một hình ảnh RGB. Vì R, G và B đều giống nhau (hãy tự xem ở trên hoặc trong dữ liệu của bạn), chúng tôi chỉ có thể chọn một kênh dữ liệu của mình bằng cách sử dụng kỹ thuật cắt mảng (bạn có thể đọc thêm trong phần )

lum_img = img[:, :, 0]
plt.imshow(lum_img)

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Giờ đây, với hình ảnh có độ sáng (2D, không màu), bản đồ màu mặc định (còn gọi là bảng tra cứu, LUT), được áp dụng. Mặc định được gọi là viridis. Có rất nhiều người khác để lựa chọn

plt.imshow(lum_img, cmap="hot")

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Lưu ý rằng bạn cũng có thể thay đổi bản đồ màu trên các đối tượng cốt truyện hiện có bằng phương pháp

imgplot = plt.imshow(lum_img)
imgplot.set_cmap('nipy_spectral')

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Ghi chú

Tuy nhiên, hãy nhớ rằng trong Jupyter Notebook với chương trình phụ trợ nội tuyến, bạn không thể thay đổi các ô đã được hiển thị. Nếu bạn tạo imgplot ở đây trong một ô, bạn không thể gọi set_cmap() trên nó trong ô sau và mong đợi biểu đồ trước đó thay đổi. Đảm bảo rằng bạn nhập các lệnh này cùng nhau trong một ô. lệnh plt sẽ không thay đổi các ô từ các ô trước đó

Có rất nhiều lược đồ colormap khác có sẵn. Xem danh sách và hình ảnh của các bản đồ màu

Tham chiếu thang màu

Thật hữu ích khi có ý tưởng về giá trị mà một màu đại diện. Chúng tôi có thể làm điều đó bằng cách thêm một thanh màu vào hình của bạn

________số 8_______

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Kiểm tra một phạm vi dữ liệu cụ thể

Đôi khi bạn muốn nâng cao độ tương phản trong hình ảnh của mình hoặc mở rộng độ tương phản ở một vùng cụ thể trong khi hy sinh chi tiết ở những màu không thay đổi nhiều hoặc không quan trọng. Một công cụ tốt để tìm các vùng thú vị là biểu đồ. Để tạo biểu đồ dữ liệu hình ảnh của chúng tôi, chúng tôi sử dụng chức năng

plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k')

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Thông thường, phần "thú vị" của hình ảnh nằm xung quanh đỉnh và bạn có thể có thêm độ tương phản bằng cách cắt bớt các vùng bên trên và/hoặc bên dưới đỉnh. Trong biểu đồ của chúng tôi, có vẻ như không có nhiều thông tin hữu ích ở cấp cao (không có nhiều thứ màu trắng trong ảnh). Hãy điều chỉnh giới hạn trên để chúng ta "phóng to" một phần của biểu đồ một cách hiệu quả. Chúng tôi làm điều này bằng cách chuyển đối số clim tới imshow. Bạn cũng có thể thực hiện việc này bằng cách gọi phương thức của đối tượng sơ đồ hình ảnh, nhưng hãy đảm bảo rằng bạn làm như vậy trong cùng một ô với lệnh vẽ sơ đồ khi làm việc với Jupyter Notebook - nó sẽ không thay đổi sơ đồ từ các ô trước đó

Bạn có thể chỉ định leo núi trong lệnh gọi tới

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
9

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
0

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Bạn cũng có thể chỉ định khí hậu bằng cách sử dụng đối tượng được trả về

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
1

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Lược đồ nội suy mảng

Phép nội suy tính toán màu sắc hoặc giá trị của pixel "nên" theo các lược đồ toán học khác nhau. Một nơi phổ biến mà điều này xảy ra là khi bạn thay đổi kích thước hình ảnh. Số lượng pixel thay đổi, nhưng bạn muốn có cùng thông tin. Vì các pixel rời rạc nên thiếu không gian. Nội suy là cách bạn lấp đầy không gian đó. Đây là lý do tại sao hình ảnh của bạn đôi khi trông giống như pixel khi bạn phóng to chúng. Hiệu ứng rõ rệt hơn khi sự khác biệt giữa ảnh gốc và ảnh mở rộng càng lớn. Hãy lấy hình ảnh của chúng tôi và thu nhỏ nó. Chúng tôi đang loại bỏ pixel một cách hiệu quả, chỉ giữ lại một số pixel được chọn. Bây giờ khi chúng tôi vẽ đồ thị, dữ liệu đó sẽ tăng lên theo kích thước trên màn hình của bạn. Các pixel cũ không còn nữa và máy tính phải vẽ các pixel để lấp đầy khoảng trống đó

Chúng tôi sẽ sử dụng thư viện Gối mà chúng tôi đã sử dụng để tải hình ảnh để thay đổi kích thước hình ảnh

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
2

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Ở đây chúng ta có phép nội suy mặc định, song tuyến tính, vì chúng ta không đưa ra bất kỳ đối số nội suy nào

Hãy thử một số khác. Đây là "gần nhất", không nội suy

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
3

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

và lập phương

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
4

Làm cách nào để thay đổi kích thước hình ảnh trong python bằng matplotlib?

Phép nội suy hai khối thường được sử dụng khi phóng to ảnh - mọi người có xu hướng thích mờ hơn pixel