Paket Pillow adalah fork dari library
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
5 yang lebih lama, yang merupakan singkatan dari Python Imaging Library. Paket ini memungkinkan Anda memuat dan bekerja dengan gambar yang ada, dan juga memungkinkan Anda membuat gambar baru dan mengisi piksel secara terprogram. Ini memungkinkan untuk membuat filter foto Anda sendiri, membuat alat penyesuaian gambar Anda sendiri, dan menjelajahi karya seni yang dihasilkan secara digitalMemasang Bantal
Anda dapat menginstal Bantal di OS apa pun menggunakan pip. [Pip tercakup dalam bab-bab proyek, jika Anda belum sampai sejauh itu. ]
Jalankan perintah ini di jendela terminal
$ python -m pip install --user pillow
_Anda mungkin perlu menggunakan perintah python3 alih-alih python, atau perintah apa pun yang Anda gunakan untuk memulai sesi terminal Python di sistem Anda
Memuat Gambar
Anda dapat membuka gambar yang ada hanya dalam beberapa baris kode. Di sini kita akan membuka sebuah gambar, dan mendapatkan beberapa informasi bermanfaat tentang gambar tersebut
Untuk menjalankan kode ini, buat folder di suatu tempat di sistem Anda bernama photo_work, atau semacamnya. Di folder itu, buat dua folder lagi bernama original_images dan modified_images. Sebaiknya gunakan salinan gambar, jadi Anda tidak mengubah atau menghancurkan gambar yang mungkin Anda pedulikan secara tidak sengaja. Sebaiknya pisahkan gambar asli Anda dari gambar yang dimodifikasi, jadi Anda selalu memulai dengan gambar yang sama saat menjalankan kode
Masukkan kode ini, dengan nama file yang sesuai dengan gambar Anda. Jika Anda ingin menggunakan gambar yang sama dengan yang saya gunakan di sini, Anda dapat menemukannya di folder beyond_pcc saat mengunduh sumber daya untuk buku tersebut
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
Kami mengimpor kelas
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_6 dari perpustakaan PIL, yang dipasang sebagai bagian dari Bantal. Kami menentukan nama file dan jalur file dari gambar asli, sehingga kami dapat menggunakan jalur yang berbeda untuk gambar yang dimodifikasi nanti. Kami kemudian memanggil fungsi from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_7. Setelah gambar dibuka, kita bisa mendapatkan beberapa informasi tentang gambar tersebut; . Kemudian kami menampilkan gambar iniIni output teksnya
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
Baris terakhir menggunakan penampil gambar sistem Anda untuk menampilkan gambar. Anda dapat melihat dari nama file di penampil [tmpt8sb9_sb. PNG dalam kasus saya], bahwa Bantal membuat file sementara untuk menampilkan gambar saat ini
Sejauh ini, kami belum melakukan apa pun untuk mengubah gambar
Menjelajahi Data Piksel
Meneliti Piksel Pertama
Sebelum bekerja dengan banyak piksel, mari kita lihat satu piksel tunggal. Kode berikut memuat semua piksel dalam gambar, lalu mencetak data piksel untuk piksel pertama dalam gambar
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Look at the pixel in the top left corner.
first_pixel = orig_pixel_map[0, 0]
print[f"\nFirst pixel: {first_pixel}"]
_Metode
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
8 memuat semua piksel ke dalam struktur data Bantal kustom yang memungkinkan kita bekerja dengan semua piksel menggunakan koordinat x, y. Piksel pada [0, 0] berada di sudut kiri atas gambar. Untuk menentukan satu piksel, Anda menggunakan tanda kurung siku berisi nilai x dan y dari piksel yang ingin Anda periksa. Inilah hasilnyaOriginal image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
First pixel: [31, 52, 21]
_Setiap piksel direpresentasikan sebagai tupel dengan tiga elemen, sesuai dengan komponen RGB dari warna piksel. Kita dapat melihat bahwa piksel ini memiliki komponen merah 31, komponen hijau 52, dan komponen biru 21. Anda dapat memasukkan nilai-nilai ini ke alat warna online dan melihat warna piksel ini jika Anda penasaran
Memeriksa Banyak Piksel
Anda biasanya ingin bekerja dengan lebih dari satu piksel. Seringkali, ini dilakukan dengan satu set loop bersarang, yang berulang pada kolom dan baris gambar. Kode berikut mengulang semua piksel di bagian kiri atas 10px kali 10px dari gambar
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Examine the 100 pixels in the top left corner of the image.
print["\nPixel data:"]
for x in range[10]:
for y in range[10]:
pixel = orig_pixel_map[x, y]
print[pixel]
_Untuk melihat beberapa piksel, kita mengulang nilai 10 x pertama dan nilai 10 y pertama. Artinya, pertama-tama kita akan memeriksa piksel di [0, 0], lalu piksel di [0, 1], lalu piksel di [0, 2]. Ini adalah awal dari baris atau piksel pertama. Ketika kita mencapai [0, 9], nilai x akan bertambah 1 dan nilai y akan mulai kembali dari 0. Kami kemudian akan mulai di baris kedua. [1, 0], lalu [1, 1], diikuti oleh [1, 2]. Inilah beberapa baris pertama dari output
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
Pixel data:
[31, 52, 21]
[33, 53, 18]
[46, 64, 26]
[60, 77, 35]
--snip--
Piksel semakin cerah saat kita berpindah dari wilayah bayangan ke wilayah berumput
Melihat Semua Piksel
Untuk melihat semua piksel, kita perlu mengulang seluruh gambar. Untuk melakukan ini, kita hanya perlu mengubah batasan loop di akhir program sebelumnya. Inilah loop yang dimodifikasi
--snip--
# Examine all pixels in the image.
print["\nPixel data:"]
for x in range[width]:
for y in range[height]:
pixel = orig_pixel_map[x, y]
print[pixel]
Kita mengulang semua nilai x pada lebar gambar, dan kemudian mengulang semua nilai y pada tinggi gambar. Outputnya terlihat persis sama dengan contoh sebelumnya, kecuali terus dan terus
Ada 1560 * 811 = 1.265.160 piksel pada gambar ini. Pencetakan adalah salah satu operasi paling lambat yang dapat Anda lakukan, jadi Anda mungkin ingin menekan Ctrl-C untuk menghentikan keluaran daripada menunggu semua piksel bergulir
Membuat Salinan yang Tepat
Sebelum memodifikasi gambar, pastikan kita cukup menyalin gambar. Kemudian kita dapat yakin bahwa kode kita untuk memodifikasi gambar asli akan didasarkan pada reproduksi gambar asli yang akurat
Menghasilkan Gambar Baru
Kode berikut menghasilkan gambar baru, dengan mode warna dan ukuran yang sama dengan gambar aslinya
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Create a new image matching the original image's color mode, and size.
# Load all the pixels from this new image as well.
new_image = Image.new[mode, [width, height]]
new_image.show[]
Fungsi
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
9 membuat gambar baru. Ini membutuhkan mode warna, yang kami atur agar sesuai dengan mode gambar asli. Itu juga membutuhkan ukuran, ditentukan sebagai tuple dengan lebar dan tinggi. Kami melewati dimensi gambar asli kami. Jika Anda tidak menentukan warna dasar, gambar baru dimulai dengan semua piksel hitamMenyalin semua Piksel ke Gambar Baru
Sekarang mari salin semua data piksel dari gambar asli ke gambar baru
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Create a new image matching the original image's color mode, and size.
# Load all the pixels from this new image as well.
new_image = Image.new[mode, [width, height]]
new_pixel_map = new_image.load[]
# Modify each pixel in the new image.
for x in range[width]:
for y in range[height]:
# Copy the original pixel to the new pixel map.
new_pixel_map[x, y] = orig_pixel_map[x, y]
new_image.show[]
Saat saya menjalankan kode ini, gambar dengan nama file tmpdmq72fv3. PNG muncul, tetapi terlihat persis seperti gambar aslinya
Menyimpan Gambar Baru
Jika Anda ingin menyimpan gambar baru setelah melihatnya, Anda dapat memanggil metode
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
0 dengan nama file atau jalur file. Ini kode untuk melakukan itufrom PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
0Kode ini menambahkan awalan modified_ ke nama file asli, dan menyimpannya di folder modified_images sehingga berada di tempat yang berbeda dari gambar aslinya. Pendekatan ini menghindari penulisan gambar asli Anda secara tidak sengaja
Operasi ini bisa lambat, karena Pillow harus menulis setiap piksel ke disk. Di sistem saya, untuk gambar sebesar ini, butuh waktu sekitar 20 detik. Anda mungkin ingin menghindari panggilan
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
_0 sampai Anda tahu kode Anda melakukan apa yang Anda inginkanMenyalin Nilai RGB Individu
Jika Anda mencoba membuat filter foto atau melakukan pekerjaan manipulasi gambar lainnya, Anda mungkin ingin bekerja dengan masing-masing komponen RGB dari setiap piksel. Kode berikut menarik nilai komponen RGB dari setiap piksel, dan menyalin nilai individual ini ke setiap piksel dalam gambar baru
Sebagian besar program tidak berubah, jadi inilah loop yang digunakan untuk membuat gambar baru
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_1Kami pertama-tama menarik piksel asli, dan menetapkannya ke
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
2. Kami kemudian menetapkan elemen pertama tupel piksel ke Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
3, yang kedua ke Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
4, dan yang ketiga ke Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
5. Sekarang kami memiliki akses mudah ke setiap komponen warna dari setiap piksel pada gambar asliKami membuat tiga variabel baru.
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
6, Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
7, dan Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
8. Kami menggunakan ini untuk membuat piksel baru, yang merupakan tuple yang berisi tiga nilai komponen RGB yang kami inginkan untuk piksel ini. Kemudian kami menetapkan piksel baru ini ke titik yang sesuai di Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
9Hasilnya adalah salinan persis dari gambar asli, seperti yang kita buat sebelumnya. Namun, pendekatan ini memberi kami banyak fleksibilitas dalam cara kami ingin memodifikasi gambar. Anda dapat menggunakan aturan apa pun yang Anda inginkan untuk menyetel nilai
Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
6, Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
7, dan Original image: starr_bears.jpg
Size: 1560 x 811 pixels
Mode: RGB
8. Anda dapat menaikkan nilai aslinya, Anda dapat menurunkannya, Anda hanya dapat mengubah beberapa di antaranya. Jika Anda menyetel semuanya ke nilai yang sama menurut beberapa aturan, Anda akan mendapatkan gambar hitam putihMencerahkan Gambar
Mari buat satu modifikasi pada gambar. Kami akan mencerahkan gambar, yang sesuai dengan peningkatan semua nilai komponen untuk setiap piksel
Sekali lagi, sebagian besar kode tidak berubah. Inilah lingkaran yang mencerahkan gambar
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_2Kami menetapkan faktor kecerahan, yang akan kami gandakan setiap nilai komponen RGB. Jika ini sama dengan 1, kami akan mendapatkan salinan persis dari gambar tersebut. Jika lebih besar dari 1 kita akan mendapatkan gambar yang lebih terang, dan jika kurang dari 1 kita akan mendapatkan gambar yang lebih gelap. Nilai 1. 4 mungkin lebih tinggi dari yang Anda inginkan untuk tujuan artistik, tetapi saya ingin benar-benar jelas bahwa gambar baru lebih cerah daripada aslinya
Nilai komponen dalam model warna ini harus berupa bilangan bulat, jadi kami membungkus fungsi
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Look at the pixel in the top left corner.
first_pixel = orig_pixel_map[0, 0]
print[f"\nFirst pixel: {first_pixel}"]
3 di sekitar operasi perkalian untuk setiap piksel. Hasilnya adalah gambar yang lebih cerah, yang dapat Anda lihat dengan melihat aslinya di sebelah gambar yang dicerahkanJika Anda ingin sedikit bersenang-senang dengan ini, coba tukar nilai merah dan hijau, atau ganti ketiga nilai tersebut. Anda masih harus melihat beruang, tetapi mereka harus terlihat sangat berbeda
Mulai Dari Gambar Kosong
Jika mau, Anda dapat memulai dengan gambar kosong dan menentukan piksel sesuai dengan algoritme apa pun yang Anda pilih
Berikut kode untuk membuat gambar kosong baru
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_3Kami menetapkan ukuran untuk gambar baru kami, dan mengatur mode ke
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Look at the pixel in the top left corner.
first_pixel = orig_pixel_map[0, 0]
print[f"\nFirst pixel: {first_pixel}"]
4. Kemudian kami memanggil from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_9, seperti yang Anda lihat sebelumnyaKami mendapatkan gambar yang semuanya hitam, dengan dimensi yang kami tentukan
Untuk mendemonstrasikan cara sederhana bekerja dengan kanvas kosong, kami akan menetapkan nilai komponen setiap piksel secara acak
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Show the image.
orig_image.show[]
_4Kami mengimpor dari modul
from PIL import Image
filename = 'starr_bears.jpg'
filepath = f"original_images/{filename}"
# Load the original image, and get its size and color mode.
orig_image = Image.open[filepath]
width, height = orig_image.size
mode = orig_image.mode
# Show information about the original image.
print[f"Original image: {filename}"]
print[f"Size: {width} x {height} pixels"]
print[f"Mode: {mode}"]
# Load all pixels from the image.
orig_pixel_map = orig_image.load[]
# Look at the pixel in the top left corner.
first_pixel = orig_pixel_map[0, 0]
print[f"\nFirst pixel: {first_pixel}"]
_7, yang mengembalikan bilangan bulat acak di antara batas yang Anda berikan. Kami kemudian memuat piksel seperti yang Anda lihat sebelumnya, sehingga kami dapat bekerja dengan setiap piksel satu per satu. Kali ini kami tidak membaca piksel apa pun dalam loop, karena kami tidak mendasarkan piksel baru kami dari gambar yang ada. Dalam loop kami memilih nilai acak antara 0 dan 255 untuk masing-masing komponen RGB, dan kami membuat piksel dari nilai-nilai ini. Kemudian kami mengatur piksel saat iniHasilnya adalah sebuah gambar dimana setiap warna benar-benar acak
Jika Anda melihat gambar ini di browser file, Anda akan melihat bahwa ini memakan lebih banyak memori daripada gambar lain dengan dimensi yang sebanding. Misalnya gambar hitam kosong membutuhkan memori sekitar 19 KB, sedangkan gambar berwarna acak membutuhkan memori hampir 3 MB. Itu karena gambar yang benar-benar acak tidak dapat dikompresi sama sekali. Tidak ada wilayah serupa untuk dikompresi, jadi detail setiap piksel harus disimpan satu per satu
Kata Akhir
Ini hanya menyentuh apa yang Anda bisa dengan perpustakaan pemrosesan gambar. Saya belum menunjukkan beberapa hal yang mungkin, karena jauh lebih menyenangkan untuk mencobanya sendiri daripada membacanya di sini. Misalnya, Anda dapat membuat filter foto sendiri dan menjalankannya pada gambar Anda sendiri. Anda dapat menghasilkan gambar yang berisi semua kemungkinan warna. Anda dapat melakukan analisis yang lebih kompleks, seperti menemukan tepian dan mempertajam gambar. Anda bahkan dapat menulis kode yang mengidentifikasi, katakanlah, semua cacing es dalam sebuah gambar
Pekerjaan ini adalah dasar bagaimana aplikasi seperti Instagram dan alat seperti Photoshop dibuat. Nikmati penjelajahan Anda, dan jika Anda membuat sesuatu yang menarik, silakan bagikan. Saya @ehmatthes di Twitter, dan Anda juga dapat mengirimi saya email di ehmatthes@gmail