1

Thư viện hình ảnh Python hoặc PIL cho phép bạn xử lý hình ảnh bằng Python. Tác giả ban đầu, Fredrik Lundh, đã viết một trong những blog Python yêu thích của tôi khi tôi mới bắt đầu học Python. Tuy nhiên, bản phát hành cuối cùng của PIL đã quay trở lại vào năm 2009 và blog cũng đã ngừng cập nhật. May mắn thay, có một số người Python khác đã đến và rẽ nhánh PIL và gọi gối dự án của họ. Dự án gối là một sự thay thế thả xuống cho PIL cũng hỗ trợ Python 3, điều mà PIL không bao giờ có thể làm được.

Xin lưu ý rằng bạn không thể cài đặt cả PIL và gối cùng một lúc. Có một số cảnh báo trong tài liệu của họ liệt kê một số khác biệt giữa PIL và gối được cập nhật theo thời gian, vì vậy tôi sẽ chỉ dẫn bạn đến đó thay vì lặp lại chúng ở đây vì chúng có thể sẽ lỗi thời.

Cài đặt gối

Bạn có thể cài đặt gối bằng pip hoặc easy_install. Đây là một ví dụ sử dụng pip:

pip install Pillow

Lưu ý rằng nếu bạn đang dùng Linux hoặc Mac, bạn có thể cần chạy lệnh với sudo.

Mở hình ảnh

Gối giúp dễ dàng mở một tập tin hình ảnh và hiển thị nó. Hãy xem:

from PIL import Image   image = Image.open('/path/to/photos/jelly.jpg') image.show()

Ở đây chúng tôi chỉ cần nhập mô-đun Hình ảnh và yêu cầu nó mở tệp của chúng tôi. Nếu bạn đi và đọc nguồn, bạn sẽ thấy rằng trên Unix, phương thức mở sẽ lưu hình ảnh vào một tệp PPM tạm thời và mở nó bằng tiện ích xv. Trên máy Linux của tôi, nó đã mở nó bằng ImageMagick chẳng hạn. Trên Windows, nó sẽ lưu hình ảnh dưới dạng BMP tạm thời và mở nó trong một cái gì đó như Paint.

Lấy thông tin hình ảnh

Bạn cũng có thể nhận được rất nhiều thông tin về một hình ảnh bằng cách sử dụng Gối. Hãy xem xét một vài ví dụ nhỏ về những gì chúng ta có thể trích xuất:

>>> from PIL import Image >>> image = Image.open('/path/to/photos/jelly.jpg') >>> r, g, b = image.split() >>> histogram = image.histogram() [384761, 489777, 557209, 405004, 220701, 154786, 55807, 35806, 21901, 16242] >>> exif = image._getexif() exif {256: 1935, 257: 3411, 271: u'Panasonic', 272: u'DMC-LX7', 274: 1, 282: (180, 1), 283: (180, 1), 296: 2, 305: u'PaintShop Pro 14.00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 306: u'2016:08:21 07:54:57', 36867: u'2016:08:21 07:54:57', 36868: u'2016:08:21 07:54:57', 37121: '\x01\x02\x03\x00', 37122: (4, 1), 37381: (124, 128), 37383: 5, 37384: 0, 37385: 16, 37386: (47, 10), 40960: '0100', 40961: 1, 40962: 3968, 40963: 2232, 41495: 2, 41728: '\x03', 41729: '\x01', 41985: 0, 41986: 0, 41987: 0, 41988: (0, 10), 41989: 24, 41990: 0, 41991: 0, 41992: 0, 41993: 0, 41994: 0}

Trong ví dụ này, chúng tôi trình bày cách trích xuất các giá trị RGB (đỏ, xanh lục, xanh lam) từ hình ảnh. Chúng tôi cũng tìm hiểu làm thế nào để có được một biểu đồ từ hình ảnh. Lưu ý rằng tôi đã cắt bớt đầu ra một chút vì đầu ra của biểu đồ lớn hơn nhiều. Bạn có thể vẽ biểu đồ biểu đồ bằng cách sử dụng gói Python khác, chẳng hạn như matplotlib. Cuối cùng, ví dụ trên trình bày cách trích xuất thông tin EXIF ​​từ hình ảnh. Một lần nữa, tôi đã rút ngắn đầu ra từ phương thức này một chút vì nó chứa quá nhiều thông tin cho bài viết này.

Cắt ảnh

Bạn cũng có thể cắt hình ảnh với gối. Nó thực sự khá dễ dàng, mặc dù nó có thể khiến bạn mất một chút thử nghiệm và lỗi để tìm ra nó. Hãy thử cắt ảnh sứa của chúng tôi:

>>> from PIL import Image >>> image = Image.open('/path/to/photos/jelly.jpg') >>> cropped = image.crop((0, 80, 200, 400)) >>> cropped.save('/path/to/photos/cropped_jelly.png')

Bạn sẽ lưu ý rằng tất cả những gì chúng ta cần làm là mở hình ảnh và sau đó gọi phương thức crop của nó . Bạn sẽ cần truyền vào tọa độ x / y mà bạn muốn cắt quá, tức là (x1, y1, x2, y2). Trong gối, 0 pixel là pixel trên cùng bên trái. Khi bạn tăng giá trị x của bạn, nó sẽ ở bên phải. Khi bạn tăng giá trị y, bạn đi xuống hình ảnh. Khi bạn chạy mã ở trên, bạn sẽ kết thúc với hình ảnh sau:

Đó là một vụ mùa khá nhàm chán. Tôi muốn cắt đầu con sứa của con sứa. Để có được tọa độ đúng một cách nhanh chóng, tôi đã sử dụng Gimp để giúp tôi tìm ra tọa độ nào sẽ sử dụng cho vụ mùa tiếp theo của mình.

>>> from PIL import Image >>> image = Image.open('/path/to/photos/jelly.jpg') >>> cropped = image.crop((177, 882, 1179, 1707)) >>> cropped.save('/path/to/photos/cropped_jelly2.png')

Nếu chúng tôi chạy mã này, chúng tôi sẽ kết thúc với phiên bản được cắt sau:

Điều đó tốt hơn nhiều!

Sử dụng bộ lọc

Sứa nguyên bản

Có nhiều bộ lọc mà bạn có thể sử dụng trên gối để áp dụng cho hình ảnh của mình. Chúng được chứa trong mô-đun ImageFilter . Hãy nhìn vào một vài trong số họ ở đây:

>>> from PIL import ImageFilter >>> from PIL import Image >>> image = Image.open('/path/to/photos/jelly.jpg') >>> blurred_jelly = image.filter(ImageFilter.BLUR) >>> blurred_jelly.save('/path/to/photos/blurry_jelly.png')

Điều này sẽ làm mờ hình ảnh con sứa một chút. Đây là kết quả tôi nhận được:

Sứa mờ

Tất nhiên, hầu hết mọi người thích hình ảnh của họ sắc nét hơn là mờ hơn. Gối có lưng của bạn. Đây là một cách để làm sắc nét hình ảnh:

>>> from PIL import ImageFilter >>> from PIL import Image >>> image = Image.open('/path/to/photos/jelly.jpg') >>> blurred_jelly = image.filter(ImageFilter.SHARPEN) >>> blurred_jelly.save('/path/to/photos/sharper_jelly.png')

Khi bạn chạy mã này, bạn sẽ kết thúc với những điều sau đây:

Sứa Sharper

Bạn cũng có thể sử dụng mô-đun ImageEnhance để làm sắc nét các bức ảnh của bạn, trong số những thứ khác.

Có nhiều bộ lọc khác mà bạn cũng có thể áp dụng, chẳng hạn như CHI TIẾT, EDGE_ENHANCE, EMBOSS, SMOOTH, v.v. Bạn cũng có thể viết mã theo cách bạn có thể áp dụng nhiều bộ lọc cho hình ảnh của mình.

Bạn có thể sẽ cần phải tải xuống các hình ảnh trên để thực sự có thể so sánh sự khác biệt trong các bộ lọc.

Kết thúc

Bạn có thể làm nhiều hơn với gói gối hơn những gì được đề cập trong bài viết ngắn này. Gối hỗ trợ biến đổi hình ảnh, xử lý các dải, cải tiến hình ảnh, khả năng in hình ảnh của bạn và nhiều hơn nữa. Tôi đặc biệt khuyên bạn nên đọc tài liệu về gối để nắm bắt tốt mọi thứ bạn có thể làm.

|