Phần 29: Làm việc với ảnh – Matplotib Basic

1. Tổng quát
Mô-đun hình ảnh trong package deal Matplotlib cung cấp những chức năng cần thiết để download, thay đổi tỷ lệ và hiển thị hình ảnh.
Thư viện Pillow hỗ trợ tải dữ liệu hình ảnh. Về căn bản, Matplotlib chỉ hỗ trợ hình ảnh PNG. Những lệnh hiển thị phía dưới sẽ trở lại trên Pillow nếu như quá trình đọc gốc thất bại.
Hình ảnh được dùng trong ví dụ này là file PNG, nhưng hãy ghi nhớ yêu cầu về Pillow đó cho dữ liệu của riêng bạn. Hàm imread () được dùng để đọc dữ liệu hình ảnh trong 1 đối tượng ndarray của float32 dtype.
import matplotlib.pyplot as plt
import matplotlib.picture as mpimg
import numpy as np
img = mpimg.imread('mtplogo.png')
Giả sử rằng hình ảnh sau có tên là mtplogo.png có trong folder làm việc hiện giờ
Bất kỳ mảng nào chứa dữ liệu hình ảnh đều có khả năng được lưu vào file đĩa bằng việc thực thi hàm imsave (). Ở đây, 1 phiên bản được lật theo chiều dọc của file png gốc được lưu bằng việc đặt tham số gốc là ‘decrease’.
plt.imsave("brand.png", img, cmap = 'grey', origin = 'decrease')
Để vẽ hình ảnh trên trình xem Matplotlib, sử dụng hàm imshow ().
2. Ví dụ :
Nếu như sử dụng IPython Notebook, bạn phải thêm dòng sau :
In [1]: %matplotlib inline
Điều đó sẽ bật tính năng vẽ nội tuyến, nơi đồ họa plot sẽ xuất hiện trong pocket book. Điều đó có ý nghĩa quan trọng đối với khả năng tương tác. Đối với biểu đồ nội tuyến, những lệnh trong ô phía dưới ô xuất ra 1 biểu đồ sẽ không ảnh hưởng tới biểu đồ. Ví dụ: không thể thay đổi bản đồ màu từ những ô phía dưới ô tạo nên 1 biểu đồ. Tuy nhiên, đối với những phần mềm phụ trợ khác, ví dụ như Qt5, mở 1 cửa sổ riêng biệt, các ô phía dưới các plot sẽ thay đổi – nó là 1 đối tượng trực tiếp trong bộ nhớ.
Hướng dẫn này sẽ sử dụng giao diện vẽ đồ thị kiểu mệnh lệnh của matplotlib, pyplot. Giao diện này duy trì trạng thái chung và rất có ích để dễ dàng và nhanh chóng thử nghiệm với những cài đặt plot khác nhau. Chọn lựa thay thế là giao diện hướng đối tượng, giao diện này cũng rất mạnh và thường phù hợp hơn cho việc phát triển ứng dụng lớn. Nếu như bạn cần tìm hiểu thêm về giao diện hướng đối tượng(IDE). Hiện tại, ta cùng xem qua các ví dụ :
import matplotlib.pyplot as plt
import matplotlib.picture as mpimg
Thư viện Pillow hỗ trợ tải dữ liệu hình ảnh. Về căn bản, Matplotlib chỉ hỗ trợ hình ảnh PNG. Những lệnh hiển thị phía dưới sẽ trở lại trên Pillow nếu như quá trình đọc gốc thất bại.
Đó là hình ảnh PNG RGB 24 bit (8 bit cho mỗi R, G, B). Tùy vào nơi bạn lấy dữ liệu của chính mình, những loại hình ảnh khác mà các bạn rất có thể gặp phải là hình ảnh RGBA, cho phép tạo độ trong suốt hay hình ảnh thang độ xám (độ sáng) đơn kênh. Bạn sẽ có thể click chuột phải vào nó và chọn “Lưu hình ảnh thành” để download xuống máy tính
img = mpimg.imread('../../doc/_static/stinkbug.png')
print(img)
Kết quả như dưới đây :
[[[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]]]
Show ảnh :
imgplot = plt.imshow(img)
Áp dụng lược đồ giả màu cho các biểu đồ hình ảnh
lum_img = img[:, :, 0]
# This is array slicing. You can learn extra within the `Numpy tutorial
# <https://docs.scipy.org/doc/numpy/person/quickstart.html>`_.
plt.imshow(lum_img)
Kết quả :
<matplotlib.picture.AxesImage object at 0x7fb110cd0ba8>
Hiện tại, với hình ảnh có độ sáng (2D, không màu), bản đồ màu mặc định (hay còn được gọi là bảng tra cứu, LUT), được áp dụng. Mặc định được gọi là viridis. Có nhiều loại khác để chọn lựa.
plt.imshow(lum_img, cmap="sizzling")
Kết quả :
<matplotlib.picture.AxesImage object at 0x7fb111323390>
Chú ý rằng bạn cũng sẽ có thể thay đổi bản đồ màu trên những plot hiện có bằng việc dùng phương thức set_cmap ():
imgplot = plt.imshow(lum_img)
imgplot.set_cmap('nipy_spectral')
Tham chiếu thang màu :
Sẽ rất có ích nếu như bạn có ý tưởng về giá trị của màu sắc. Ta có thể làm điều ấy bằng việc thêm những thanh màu.
imgplot = plt.imshow(lum_img)
plt.colorbar()