Mặt nạ trăn là gì?

Lớp quan trọng nhất trong Thư viện hình ảnh Python là lớp, được định nghĩa trong mô-đun có cùng tên. Bạn có thể tạo các thể hiện của lớp này theo nhiều cách;

Để tải hình ảnh từ một tệp, hãy sử dụng chức năng trong mô-đun

>>> from PIL import Image
>>> im = Image.open["hopper.ppm"]

Nếu thành công, hàm này trả về một đối tượng. Bây giờ bạn có thể sử dụng các thuộc tính thể hiện để kiểm tra nội dung tệp

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB

Thuộc tính xác định nguồn của hình ảnh. Nếu hình ảnh không được đọc từ một tệp, nó được đặt thành Không có. Thuộc tính kích thước là 2-tuple chứa chiều rộng và chiều cao [tính bằng pixel]. Thuộc tính xác định số lượng và tên của các dải trong ảnh, cũng như loại pixel và độ sâu. Các chế độ phổ biến là “L” [độ sáng] cho hình ảnh thang độ xám, “RGB” cho hình ảnh màu trung thực và “CMYK” cho hình ảnh in sẵn

Nếu tệp không thể mở được, một ngoại lệ sẽ được đưa ra

Khi bạn có một thể hiện của lớp, bạn có thể sử dụng các phương thức được định nghĩa bởi lớp này để xử lý và thao tác với hình ảnh. Ví dụ: hãy hiển thị hình ảnh chúng ta vừa tải

>>> im.show[]

Ghi chú

Phiên bản tiêu chuẩn không hiệu quả lắm, vì nó lưu hình ảnh vào một tệp tạm thời và gọi một tiện ích để hiển thị hình ảnh. Nếu bạn không cài đặt một tiện ích phù hợp, nó thậm chí sẽ không hoạt động. Tuy nhiên, khi nó hoạt động, nó rất thuận tiện để gỡ lỗi và kiểm tra

Các phần sau đây cung cấp tổng quan về các chức năng khác nhau được cung cấp trong thư viện này

Đọc và viết hình ảnh

Thư viện hình ảnh Python hỗ trợ nhiều định dạng tệp hình ảnh. Để đọc tệp từ đĩa, hãy sử dụng chức năng trong mô-đun. Bạn không cần phải biết định dạng tệp để mở tệp. Thư viện tự động xác định định dạng dựa trên nội dung của tệp

Để lưu tệp, hãy sử dụng phương thức của lớp. Khi lưu tệp, tên trở nên quan trọng. Trừ khi bạn chỉ định định dạng, thư viện sẽ sử dụng phần mở rộng tên tệp để khám phá định dạng lưu trữ tệp nào sẽ sử dụng

Chuyển đổi tập tin sang JPEG

import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext[infile]
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            with Image.open[infile] as im:
                im.save[outfile]
        except OSError:
            print["cannot convert", infile]

Đối số thứ hai có thể được cung cấp cho phương thức chỉ định rõ ràng định dạng tệp. Nếu bạn sử dụng tiện ích mở rộng không chuẩn, bạn phải luôn chỉ định định dạng theo cách này

Tạo hình thu nhỏ JPEG

import os, sys
from PIL import Image

size = [128, 128]

for infile in sys.argv[1:]:
    outfile = os.path.splitext[infile][0] + ".thumbnail"
    if infile != outfile:
        try:
            with Image.open[infile] as im:
                im.thumbnail[size]
                im.save[outfile, "JPEG"]
        except OSError:
            print["cannot create thumbnail for", infile]

Điều quan trọng cần lưu ý là thư viện không giải mã hoặc tải dữ liệu raster trừ khi nó thực sự cần thiết. Khi bạn mở một tệp, tiêu đề tệp được đọc để xác định định dạng tệp và trích xuất những thứ như chế độ, kích thước và các thuộc tính khác cần thiết để giải mã tệp, nhưng phần còn lại của tệp không được xử lý cho đến sau này

Điều này có nghĩa là mở tệp hình ảnh là một thao tác nhanh, không phụ thuộc vào kích thước tệp và kiểu nén. Đây là một tập lệnh đơn giản để nhanh chóng xác định một tập hợp các tệp hình ảnh

Xác định tệp hình ảnh

import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open[infile] as im:
            print[infile, im.format, f"{im.size}x{im.mode}"]
    except OSError:
        pass

Cắt, dán và hợp nhất hình ảnh

Lớp chứa các phương thức cho phép bạn thao tác các vùng trong một hình ảnh. Để trích xuất một hình chữ nhật con từ một hình ảnh, hãy sử dụng phương pháp

Sao chép một hình chữ nhật con từ một hình ảnh

box = [100, 100, 400, 400]
region = im.crop[box]

Vùng được xác định bởi 4-tuple, trong đó tọa độ là [trái, trên, phải, dưới]. Thư viện hình ảnh Python sử dụng hệ tọa độ với [0, 0] ở góc trên bên trái. Cũng lưu ý rằng tọa độ đề cập đến vị trí giữa các pixel, vì vậy vùng trong ví dụ trên chính xác là 300x300 pixel

Vùng hiện có thể được xử lý theo một cách nhất định và dán lại

Xử lý một hình chữ nhật con và dán lại

region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]

Khi dán lại các vùng, kích thước của vùng phải khớp chính xác với vùng đã cho. Ngoài ra, khu vực không thể mở rộng ra bên ngoài hình ảnh. Tuy nhiên, các chế độ của ảnh gốc và vùng không cần phải khớp. Nếu không, khu vực sẽ tự động được chuyển đổi trước khi được dán [xem phần bên dưới để biết chi tiết]

Đây là một ví dụ bổ sung

Cuộn một hình ảnh

________số 8

Hoặc nếu bạn muốn hợp nhất hai hình ảnh thành một hình ảnh rộng hơn

Hợp nhất hình ảnh

def merge[im1, im2]:
    w = im1.size[0] + im2.size[0]
    h = max[im1.size[1], im2.size[1]]
    im = Image.new["RGBA", [w, h]]

    im.paste[im1]
    im.paste[im2, [im1.size[0], 0]]

    return im

Đối với các thủ thuật nâng cao hơn, phương thức dán cũng có thể lấy mặt nạ trong suốt làm đối số tùy chọn. Trong mặt nạ này, giá trị 255 cho biết rằng hình ảnh đã dán bị mờ ở vị trí đó [nghĩa là hình ảnh đã dán nên được sử dụng nguyên trạng]. Giá trị 0 có nghĩa là hình ảnh đã dán hoàn toàn trong suốt. Các giá trị ở giữa cho biết các mức độ minh bạch khác nhau. Ví dụ: dán một hình ảnh RGBA và cũng sử dụng nó làm mặt nạ sẽ dán phần mờ của hình ảnh chứ không phải nền trong suốt của nó

Thư viện hình ảnh Python cũng cho phép bạn làm việc với các dải riêng lẻ của hình ảnh nhiều dải, chẳng hạn như hình ảnh RGB. Phương pháp phân tách tạo ra một tập hợp các hình ảnh mới, mỗi hình ảnh chứa một dải từ hình ảnh nhiều dải ban đầu. Hàm hợp nhất lấy một chế độ và một bộ ảnh rồi kết hợp chúng thành một ảnh mới. Mẫu sau hoán đổi ba dải của hình ảnh RGB

Tách và hợp nhất các dải

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
0

Lưu ý rằng đối với hình ảnh một dải, trả về chính hình ảnh đó. Để làm việc với các dải màu riêng lẻ, trước tiên bạn có thể muốn chuyển đổi hình ảnh thành “RGB”

phép biến đổi hình học

Lớp chứa các phương thức và một hình ảnh. Cái trước lấy một tuple cho kích thước mới, cái sau lấy góc theo độ ngược chiều kim đồng hồ

Biến đổi hình học đơn giản

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
1

Để xoay hình ảnh theo các bước 90 độ, bạn có thể sử dụng phương pháp hoặc phương pháp. Cái sau cũng có thể được sử dụng để lật hình ảnh quanh trục ngang hoặc dọc của nó

Chuyển đổi một hình ảnh

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
2

Các thao tác

import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open[infile] as im:
            print[infile, im.format, f"{im.size}x{im.mode}"]
    except OSError:
        pass
3 cũng có thể được thực hiện giống hệt với các thao tác, miễn là cờ
import sys
from PIL import Image

for infile in sys.argv[1:]:
    try:
        with Image.open[infile] as im:
            print[infile, im.format, f"{im.size}x{im.mode}"]
    except OSError:
        pass
5 là đúng, để cung cấp các thay đổi tương tự đối với kích thước của hình ảnh

Một hình thức biến đổi hình ảnh tổng quát hơn có thể được thực hiện thông qua phương pháp

biến đổi màu sắc

Thư viện hình ảnh Python cho phép bạn chuyển đổi hình ảnh giữa các biểu diễn pixel khác nhau bằng phương thức

Chuyển đổi giữa các chế độ

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
3

Thư viện hỗ trợ chuyển đổi giữa từng chế độ được hỗ trợ và chế độ “L” và “RGB”. Để chuyển đổi giữa các chế độ khác, bạn có thể phải sử dụng một hình ảnh trung gian [thường là hình ảnh “RGB”]

Nâng cao hình ảnh

Thư viện hình ảnh Python cung cấp một số phương thức và mô-đun có thể được sử dụng để nâng cao hình ảnh

bộ lọc

Mô-đun chứa một số bộ lọc nâng cao được xác định trước có thể được sử dụng với phương thức

Áp dụng bộ lọc

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
4

Hoạt động điểm

Phương pháp này có thể được sử dụng để dịch các giá trị pixel của một hình ảnh [e. g. thao tác tương phản hình ảnh]. Trong hầu hết các trường hợp, một đối tượng hàm mong đợi một đối số có thể được truyền cho phương thức này. Mỗi pixel được xử lý theo chức năng đó

Áp dụng biến đổi điểm

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
5

Sử dụng kỹ thuật trên, bạn có thể nhanh chóng áp dụng bất kỳ biểu thức đơn giản nào cho hình ảnh. Bạn cũng có thể kết hợp các phương thức và để sửa đổi có chọn lọc một hình ảnh

Xử lý các dải riêng lẻ

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
6

Lưu ý cú pháp được sử dụng để tạo mặt nạ

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
7

Python chỉ đánh giá một phần của biểu thức logic khi cần thiết để xác định kết quả và trả về giá trị cuối cùng được kiểm tra là kết quả của biểu thức. Vì vậy, nếu biểu thức trên là sai [0], Python không nhìn vào toán hạng thứ hai và do đó trả về 0. Nếu không, nó trả về 255

Sự nâng cao

Để cải thiện hình ảnh nâng cao hơn, bạn có thể sử dụng các lớp trong mô-đun. Sau khi được tạo từ một hình ảnh, một đối tượng nâng cao có thể được sử dụng để nhanh chóng thử các cài đặt khác nhau

Bạn có thể điều chỉnh độ tương phản, độ sáng, cân bằng màu sắc và độ sắc nét theo cách này

Tăng cường hình ảnh

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
8

Chuỗi hình ảnh

Thư viện hình ảnh Python chứa một số hỗ trợ cơ bản cho chuỗi hình ảnh [còn được gọi là định dạng hoạt ảnh]. Các định dạng trình tự được hỗ trợ bao gồm FLI/FLC, GIF và một vài định dạng thử nghiệm. Các tệp TIFF cũng có thể chứa nhiều hơn một khung hình

Khi bạn mở tệp trình tự, PIL sẽ tự động tải khung hình đầu tiên trong trình tự. Bạn có thể sử dụng các phương thức tìm kiếm và cho biết để di chuyển giữa các khung hình khác nhau

Trình tự đọc

>>> print[im.format, im.size, im.mode]
PPM [512, 512] RGB
9

Như đã thấy trong ví dụ này, bạn sẽ nhận được một ngoại lệ khi chuỗi kết thúc

Lớp sau cho phép bạn sử dụng câu lệnh for để lặp qua chuỗi

Sử dụng lớp ImageSequence Iterator

>>> im.show[]
0

in PostScript

Thư viện hình ảnh Python bao gồm các chức năng in hình ảnh, văn bản và đồ họa trên máy in PostScript. Đây là một ví dụ đơn giản

Vẽ PostScript

>>> im.show[]
1

Thêm về đọc hình ảnh

Như đã mô tả trước đó, chức năng của mô-đun được sử dụng để mở tệp hình ảnh. Trong hầu hết các trường hợp, bạn chỉ cần chuyển tên tệp làm đối số.

box = [100, 100, 400, 400]
region = im.crop[box]
7 có thể được sử dụng làm trình quản lý ngữ cảnh

>>> im.show[]
2

Nếu mọi thứ suôn sẻ, kết quả là một đối tượng. Nếu không, một ngoại lệ được nêu ra

Bạn có thể sử dụng một đối tượng giống như tệp thay vì tên tệp. Đối tượng phải triển khai các phương thức

region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
0,
region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
1 và
region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
2 và được mở ở chế độ nhị phân

Đọc từ một tệp đang mở

>>> im.show[]
3

Để đọc một hình ảnh từ dữ liệu nhị phân, hãy sử dụng lớp

Đọc từ dữ liệu nhị phân

>>> im.show[]
4

Lưu ý rằng thư viện sẽ tua lại tệp [sử dụng

region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
4] trước khi đọc tiêu đề hình ảnh. Ngoài ra, seek cũng sẽ được sử dụng khi dữ liệu hình ảnh được đọc [theo phương thức load]. Nếu tệp hình ảnh được nhúng trong một tệp lớn hơn, chẳng hạn như tệp tar, bạn có thể sử dụng các mô-đun hoặc để truy cập tệp đó

Đọc từ URL

>>> im.show[]
5

Đọc từ kho lưu trữ tar

>>> im.show[]
6

Xử lý hàng loạt

Có thể áp dụng các thao tác cho nhiều tệp hình ảnh. Ví dụ: tất cả hình ảnh PNG trong thư mục hiện tại có thể được lưu dưới dạng JPEG với chất lượng giảm

>>> im.show[]
7

Vì hình ảnh cũng có thể được mở từ

region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
7 từ mô-đun
region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
8, ví dụ này có thể được sửa đổi để sử dụng
region = region.transpose[Image.Transpose.ROTATE_180]
im.paste[region, box]
8 thay vì mô-đun
def roll[im, delta]:
    """Roll an image sideways."""
    xsize, ysize = im.size

    delta = delta % xsize
    if delta == 0:
        return im

    part1 = im.crop[[0, 0, delta, ysize]]
    part2 = im.crop[[delta, 0, xsize, ysize]]
    im.paste[part1, [xsize - delta, 0, xsize, ysize]]
    im.paste[part2, [0, 0, xsize - delta, ysize]]

    return im
0

>>> im.show[]
8

Điều khiển bộ giải mã

Một số bộ giải mã cho phép bạn thao tác với hình ảnh trong khi đọc nó từ một tệp. Điều này thường có thể được sử dụng để tăng tốc độ giải mã khi tạo hình thu nhỏ [khi tốc độ thường quan trọng hơn chất lượng] và in bằng máy in laser đơn sắc [khi chỉ cần một phiên bản thang độ xám của hình ảnh]

Phương pháp thao tác với một hình ảnh đã mở nhưng chưa được tải để nó khớp với chế độ và kích thước đã cho nhất có thể. Điều này được thực hiện bằng cách cấu hình lại bộ giải mã hình ảnh

Đọc ở chế độ nháp

Điều này chỉ khả dụng cho các tệp JPEG và MPO

>>> im.show[]
9

Điều này in một cái gì đó giống như

import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext[infile]
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            with Image.open[infile] as im:
                im.save[outfile]
        except OSError:
            print["cannot convert", infile]
0

Lưu ý rằng hình ảnh kết quả có thể không khớp chính xác với chế độ và kích thước được yêu cầu. Để đảm bảo rằng hình ảnh không lớn hơn kích thước đã cho, thay vào đó hãy sử dụng phương pháp hình thu nhỏ

Chủ Đề