Bab ini merupakan pengantar untuk menangani dan memproses gambar. Dengan contoh ekstensif, ini menjelaskan paket Python pusat yang Anda perlukan untuk bekerja dengan gambar. Bab ini memperkenalkan alat dasar untuk membaca gambar, mengonversi dan menskalakan gambar, menghitung turunan, memplot atau menyimpan hasil, dan sebagainya. Kami akan menggunakan ini sepanjang sisa buku ini
Perpustakaan Pencitraan Python [PIL] menyediakan penanganan gambar umum dan banyak operasi gambar dasar yang berguna seperti mengubah ukuran, memotong, memutar, mengubah warna, dan banyak lagi. PIL gratis dan tersedia dari http. // www. pythonware. com/produk/pil/
Dengan PIL, Anda dapat membaca gambar dari sebagian besar format dan menulis ke format yang paling umum. Modul yang paling penting adalah modul
box = [100,100,400,400] region = pil_im.crop[box]2. Untuk membaca gambar, gunakan
from PIL import Image pil_im = Image.open['empire.jpg']_
Nilai yang dikembalikan, pil_im, adalah objek gambar PIL
Konversi warna dilakukan dengan menggunakan metode
box = [100,100,400,400] region = pil_im.crop[box]3. Untuk membaca gambar dan mengubahnya menjadi skala abu-abu, cukup tambahkan
box = [100,100,400,400] region = pil_im.crop[box]4 seperti ini
pil_im = Image.open['empire.jpg'].convert['L']_
Berikut adalah beberapa contoh yang diambil dari dokumentasi PIL, tersedia di http. // www. pythonware. com/library/pil/handbook/index. htm. Output dari contoh ditampilkan di
Konversi Gambar ke Format Lain
Menggunakan metode
box = [100,100,400,400] region = pil_im.crop[box]5, PIL dapat menyimpan gambar dalam sebagian besar format file gambar. Berikut adalah contoh yang mengambil semua file gambar dalam daftar nama file [daftar file] dan mengubah gambar menjadi file JPEG
Gambar 1-1. Contoh pengolahan gambar dengan PIL
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_
Fungsi PIL
box = [100,100,400,400] region = pil_im.crop[box]6 membuat objek gambar PIL dan metode
box = [100,100,400,400] region = pil_im.crop[box]5 menyimpan gambar ke file dengan nama file yang diberikan. Nama file baru akan sama dengan aslinya dengan akhiran file “. jpg” sebagai gantinya. PIL cukup pintar untuk menentukan format gambar dari ekstensi file. Ada pemeriksaan sederhana bahwa file tersebut belum menjadi file JPEG dan pesan dicetak ke konsol jika konversi gagal
Sepanjang buku ini kita akan membutuhkan daftar gambar untuk diproses. Inilah cara Anda membuat daftar nama file dari semua gambar dalam folder. Buat file bernama imtools. py untuk menyimpan beberapa rutinitas yang umumnya berguna ini dan menambahkan fungsi berikut
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_
Sekarang, kembali ke PIL
Menggunakan PIL untuk membuat thumbnail sangat sederhana. Metode
box = [100,100,400,400] region = pil_im.crop[box]8 mengambil tupel yang menentukan ukuran baru dan mengonversi gambar menjadi gambar mini dengan ukuran yang pas di dalam tupel. Untuk membuat thumbnail dengan sisi terpanjang 128 piksel, gunakan cara seperti ini
pil_im.thumbnail[[128,128]]
Memotong suatu wilayah dari gambar dilakukan dengan menggunakan metode
box = [100,100,400,400] region = pil_im.crop[box]9
box = [100,100,400,400] region = pil_im.crop[box]
Wilayah didefinisikan oleh 4-tuple, di mana koordinatnya [kiri, atas, kanan, bawah]. PIL menggunakan sistem koordinat dengan [0, 0] di pojok kiri atas. Wilayah yang diekstraksi dapat, misalnya, diputar dan kemudian dikembalikan menggunakan metode
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]0 seperti ini
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]
Untuk mengubah ukuran gambar, panggil
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]1 dengan tuple yang memberikan ukuran baru
out = pil_im.resize[[128,128]]
Untuk memutar gambar, gunakan sudut berlawanan arah jarum jam dan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]2 seperti ini
out = pil_im.rotate[45]
Beberapa contoh ditampilkan di. Gambar paling kiri adalah yang asli, diikuti dengan versi skala abu-abu, potongan yang dirotasi ditempelkan, dan gambar mini
Saat bekerja dengan matematika dan memplot grafik atau menggambar titik, garis, dan kurva pada gambar,
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]3 adalah perpustakaan grafik yang bagus dengan fitur yang jauh lebih canggih daripada plotting yang tersedia di PIL.
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_3 menghasilkan figur berkualitas tinggi seperti banyak ilustrasi yang digunakan dalam buku ini. Antarmuka
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_3
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]6 adalah sekumpulan fungsi yang memungkinkan pengguna untuk membuat plot.
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_3 adalah open source dan tersedia secara bebas dari http. //matplotlib. sourceforge. net/, di mana dokumentasi dan tutorial mendetail tersedia. Berikut adalah beberapa contoh yang menunjukkan sebagian besar fungsi yang akan kita perlukan dalam buku ini
Merencanakan Gambar, Titik, dan Garis
Meskipun dimungkinkan untuk membuat plot batang yang bagus, diagram lingkaran, plot pencar, dll. , hanya beberapa perintah yang diperlukan untuk sebagian besar tujuan visi komputer. Yang terpenting, kami ingin dapat menunjukkan hal-hal seperti titik minat, korespondensi, dan objek yang terdeteksi menggunakan titik dan garis. Berikut adalah contoh memplot gambar dengan beberapa titik dan garis
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]
Ini memplot gambar, lalu empat titik dengan penanda bintang merah pada koordinat x dan y yang diberikan oleh daftar x dan y, dan terakhir menggambar garis [biru secara default] antara dua titik pertama dalam daftar ini. menunjukkan hasilnya. Perintah
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_8 memulai GUI gambar dan memunculkan jendela gambar. Lingkaran GUI ini memblokir skrip Anda dan dijeda hingga jendela gambar terakhir ditutup. Anda harus memanggil
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_8 hanya sekali per skrip, biasanya di bagian akhir. Perhatikan bahwa
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_6 menggunakan asal koordinat di sudut kiri atas seperti yang umum untuk gambar. Sumbu berguna untuk debugging, tetapi jika Anda menginginkan plot yang lebih cantik, tambahkan
pil_im = Image.open['empire.jpg'].convert['L']_0
Ini akan memberikan plot seperti yang ada di sebelah kanan sebagai gantinya
Ada banyak opsi untuk memformat warna dan gaya saat merencanakan. Yang paling berguna adalah perintah pendek yang ditampilkan di , dan. Gunakan mereka seperti ini
pil_im = Image.open['empire.jpg'].convert['L']_1
Kontur Gambar dan Histogram
Mari kita lihat dua contoh plot khusus. kontur citra dan histogram citra. Memvisualisasikan kontur-iso gambar [atau kontur-iso dari fungsi 2D lainnya] bisa sangat berguna. Ini membutuhkan gambar skala abu-abu, karena kontur perlu diambil pada satu nilai untuk setiap koordinat [x, y]. Inilah cara melakukannya
Gambar 1-2. Contoh merencanakan dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_3. Gambar dengan titik dan garis dengan dan tanpa menunjukkan sumbu
Tabel 1-1. Perintah pemformatan warna dasar untuk memplot dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]6
Warna
out = pil_im.resize[[128,128]]3
biru
out = pil_im.resize[[128,128]]_4
hijau
out = pil_im.resize[[128,128]]5
merah
out = pil_im.resize[[128,128]]6
cyan
out = pil_im.resize[[128,128]]7
magenta
out = pil_im.resize[[128,128]]8
kuning
out = pil_im.resize[[128,128]]_9
hitam
out = pil_im.rotate[45]_0
putih
Tabel 1-2. Perintah pemformatan gaya garis dasar untuk merencanakan dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]6
Gaya garis
out = pil_im.rotate[45]_2
padat
out = pil_im.rotate[45]_3
putus-putus
out = pil_im.rotate[45]_4
burik
Tabel 1-3. Perintah pemformatan penanda plot dasar untuk merencanakan dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]6
Penanda
out = pil_im.rotate[45]_6
titik
out = pil_im.rotate[45]_7
lingkaran
out = pil_im.rotate[45]_8
persegi
out = pil_im.rotate[45]_9
bintang
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_0
plus
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_1
x
pil_im = Image.open['empire.jpg'].convert['L']_2
Seperti sebelumnya, metode PIL
box = [100,100,400,400] region = pil_im.crop[box]3 melakukan konversi ke skala abu-abu
Histogram gambar adalah plot yang menunjukkan distribusi nilai piksel. Sejumlah tempat sampah ditentukan untuk rentang nilai dan setiap tempat sampah menghitung berapa banyak piksel yang memiliki nilai dalam rentang tempat sampah. Visualisasi histogram gambar [tingkat keabuan] dilakukan dengan menggunakan fungsi
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]3
pil_im = Image.open['empire.jpg'].convert['L']_3
Argumen kedua menentukan jumlah tempat sampah yang akan digunakan. Perhatikan bahwa gambar harus diratakan terlebih dahulu, karena
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]3 menggunakan larik satu dimensi sebagai masukan. Metode
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_5 mengonversi larik apa pun menjadi larik satu dimensi dengan nilai yang diambil berdasarkan baris. menunjukkan plot kontur dan histogram
Gambar 1-3. Contoh memvisualisasikan kontur gambar dan memplot histogram gambar dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]3
Terkadang pengguna perlu berinteraksi dengan aplikasi, misalnya dengan menandai titik pada gambar, atau Anda perlu memberi anotasi pada beberapa data pelatihan.
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_6 hadir dengan fungsi sederhana,
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]8, yang memungkinkan Anda melakukan hal itu. Ini contoh singkatnya
pil_im = Image.open['empire.jpg'].convert['L']_4
Ini memplot gambar dan menunggu pengguna mengklik tiga kali di wilayah gambar jendela gambar. Koordinat [x, y] klik disimpan dalam daftar x
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 [http. // www. scipy. org/NumPy/] adalah paket yang populer digunakan untuk komputasi ilmiah dengan Python.
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 berisi sejumlah konsep yang berguna seperti objek array [untuk merepresentasikan vektor, matriks, gambar, dan banyak lagi] dan fungsi aljabar linier. Objek array
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 akan digunakan di hampir semua contoh di seluruh buku ini. [] Objek array memungkinkan Anda melakukan operasi penting seperti perkalian matriks, transposisi, menyelesaikan sistem persamaan, perkalian vektor, dan normalisasi, yang diperlukan untuk melakukan hal-hal seperti menyelaraskan gambar, membengkokkan gambar, variasi pemodelan, mengklasifikasikan gambar, mengelompokkan gambar, dan
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 tersedia secara bebas dari http. // www. scipy. org/Download dan dokumentasi online [http. //dokumen. scipy. org/doc/numpy/] berisi jawaban untuk sebagian besar pertanyaan. Untuk detail lebih lanjut tentang
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9, buku yang tersedia secara bebas adalah referensi yang bagus
Representasi Gambar Array
Saat kami memuat gambar pada contoh sebelumnya, kami mengonversinya menjadi
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9 objek array dengan panggilan
pil_im = Image.open['empire.jpg'].convert['L']05 tetapi tidak menyebutkan artinya. Array di
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9 multi-dimensi dan dapat mewakili vektor, matriks, dan gambar. Array sangat mirip dengan daftar [atau daftar daftar] tetapi dibatasi untuk memiliki semua elemen dari tipe yang sama. Kecuali ditentukan pada pembuatan, tipe akan secara otomatis diatur tergantung pada data
Contoh berikut mengilustrasikan ini untuk gambar
pil_im = Image.open['empire.jpg'].convert['L']_5
Hasil cetak di konsol Anda akan terlihat seperti ini
pil_im = Image.open['empire.jpg'].convert['L']_6
Tuple pertama pada setiap baris adalah bentuk array gambar [baris, kolom, saluran warna], dan string berikutnya adalah tipe data dari elemen array. Gambar biasanya dikodekan dengan bilangan bulat 8-bit yang tidak ditandatangani [uint8], jadi memuat gambar ini dan mengonversi ke array memberikan tipe "uint8" dalam kasus pertama. Kasus kedua melakukan konversi skala abu-abu dan membuat larik dengan argumen tambahan "f". Ini adalah perintah singkat untuk menyetel tipe ke floating point. Untuk opsi tipe data lainnya, lihat. Perhatikan bahwa gambar skala abu-abu hanya memiliki dua nilai dalam shape tuple;
Elemen dalam array diakses dengan indeks. Nilai pada koordinat i, j dan color channel k diakses seperti ini
pil_im = Image.open['empire.jpg'].convert['L']_7
Beberapa elemen dapat diakses menggunakan pengirisan array. Mengiris mengembalikan tampilan ke dalam larik yang ditentukan oleh interval. Berikut adalah beberapa contoh untuk gambar skala abu-abu
pil_im = Image.open['empire.jpg'].convert['L']_8
Perhatikan contoh dengan hanya satu indeks. Jika Anda hanya menggunakan satu indeks, itu ditafsirkan sebagai indeks baris. Perhatikan juga contoh terakhir. Indeks negatif dihitung dari elemen terakhir mundur. Kami akan sering menggunakan pemotongan untuk mengakses nilai piksel, dan ini merupakan konsep penting untuk dipahami
Ada banyak operasi dan cara untuk menggunakan array. Kami akan memperkenalkan mereka sesuai kebutuhan di seluruh buku ini. Lihat dokumentasi online atau buku untuk penjelasan lebih lanjut
Setelah membaca gambar ke
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 array, kita dapat melakukan operasi matematika apa pun yang kita suka pada mereka. Contoh sederhananya adalah mengubah tingkat abu-abu suatu gambar. Ambil sembarang fungsi f yang memetakan interval 0. . . 255 [atau, jika Anda suka, 0. . . 1] ke dirinya sendiri [artinya output memiliki rentang yang sama dengan input]. Berikut beberapa contohnya
pil_im = Image.open['empire.jpg'].convert['L']_9
Contoh pertama membalikkan tingkat keabuan gambar, yang kedua menjepit intensitas ke interval 100. . . 200, dan yang ketiga menerapkan fungsi kuadrat, yang menurunkan nilai piksel yang lebih gelap. menunjukkan fungsi dan gambar yang dihasilkan. Anda dapat memeriksa nilai minimum dan maksimum dari setiap gambar menggunakan
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_0
Gambar 1-4. Contoh transformasi tingkat abu-abu. Tiga contoh fungsi bersama dengan transformasi identitas ditampilkan sebagai garis putus-putus
Gambar 1-5. Transformasi tingkat abu-abu. Menerapkan fungsi di. Membalikkan bayangan dengan f[x] = 255 – x [kiri], menjepit bayangan dengan f[x] = [100/255]x + 100 [tengah], transformasi kuadrat dengan f[x] = 255[x/255
Jika Anda mencobanya untuk masing-masing contoh di atas, Anda akan mendapatkan keluaran berikut
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_1
Kebalikan dari transformasi
pil_im = Image.open['empire.jpg'].convert['L']05 dapat dilakukan dengan menggunakan fungsi PIL
pil_im = Image.open['empire.jpg'].convert['L']09 sebagai
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_2
Jika Anda melakukan beberapa operasi untuk mengubah tipe dari "uint8" ke tipe data lain, seperti im3 atau im4 pada contoh di atas, Anda perlu mengonversi kembali sebelum membuat gambar PIL
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_3
Jika Anda tidak benar-benar yakin dengan jenis inputnya, Anda harus melakukannya karena ini adalah pilihan yang aman. Perhatikan bahwa
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 akan selalu mengubah tipe array menjadi tipe “terendah” yang dapat mewakili data. Perkalian atau pembagian dengan bilangan floating point akan mengubah larik bertipe integer menjadi float
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 array akan menjadi alat utama kami untuk bekerja dengan gambar dan data. Tidak ada cara sederhana untuk mengubah ukuran array, yang ingin Anda lakukan untuk gambar. Kita dapat menggunakan konversi objek gambar PIL yang ditunjukkan sebelumnya untuk membuat fungsi pengubahan ukuran gambar sederhana. Tambahkan yang berikut ini ke imtools. py
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_4
Fungsi ini akan berguna nanti
Contoh yang sangat berguna dari transformasi tingkat keabuan adalah pemerataan histogram. Transformasi ini meratakan histogram tingkat keabuan dari suatu gambar sehingga semua intensitas seumum mungkin. Ini seringkali merupakan cara yang baik untuk menormalkan intensitas gambar sebelum diproses lebih lanjut dan juga cara untuk meningkatkan kontras gambar
Fungsi transformasi dalam hal ini adalah fungsi distribusi kumulatif [cdf] dari nilai piksel pada gambar [dinormalkan untuk memetakan rentang nilai piksel ke rentang yang diinginkan]
Inilah cara melakukannya. Tambahkan fungsi ini ke file imtools. py
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_5
Fungsi ini mengambil gambar skala abu-abu dan jumlah kotak untuk digunakan dalam histogram sebagai masukan, dan mengembalikan gambar dengan histogram yang disamakan bersama dengan fungsi distribusi kumulatif yang digunakan untuk melakukan pemetaan nilai piksel. Perhatikan penggunaan elemen terakhir [indeks -1] dari cdf untuk menormalkannya antara 0. 1. Coba ini pada gambar seperti ini
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_6
dan tunjukkan contoh pemerataan histogram. Baris atas menunjukkan histogram tingkat keabuan sebelum dan sesudah pemerataan bersama dengan pemetaan cdf. Seperti yang Anda lihat, kontras meningkat dan detail area gelap kini tampak jelas
Rata-rata gambar adalah cara sederhana untuk mengurangi noise gambar dan juga sering digunakan untuk efek artistik. Menghitung gambar rata-rata dari daftar gambar tidaklah sulit. Dengan asumsi semua gambar memiliki ukuran yang sama, kita dapat menghitung rata-rata semua gambar tersebut dengan hanya menjumlahkannya dan membaginya dengan jumlah gambar. Tambahkan fungsi berikut ke imtools. py
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_7
Ini mencakup beberapa penanganan pengecualian dasar untuk melewati gambar yang tidak dapat dibuka. Ada cara lain untuk menghitung gambar rata-rata menggunakan fungsi ________4______12. Ini mengharuskan semua gambar ditumpuk ke dalam array dan akan menggunakan banyak memori jika ada banyak gambar. Kami akan menggunakan fungsi ini di bagian selanjutnya
Gambar 1-6. Contoh pemerataan histogram. Di sebelah kiri adalah gambar asli dan histogram. Plot tengah adalah fungsi transformasi tingkat abu-abu. Di sebelah kanan adalah gambar dan histogram setelah pemerataan histogram
Gambar 1-7. Contoh pemerataan histogram. Di sebelah kiri adalah gambar asli dan histogram. Plot tengah adalah fungsi transformasi tingkat abu-abu. Di sebelah kanan adalah gambar dan histogram setelah pemerataan histogram
Analisis Komponen Utama [PCA] adalah teknik yang berguna untuk pengurangan dimensi dan optimal dalam arti mewakili variabilitas data pelatihan dengan dimensi sesedikit mungkin. Bahkan gambar skala abu-abu kecil 100 × 100 piksel memiliki 10.000 dimensi, dan dapat dianggap sebagai titik dalam ruang 10.000 dimensi. Gambar megapiksel memiliki dimensi dalam jutaan. Dengan dimensi setinggi itu, tidak mengherankan jika pengurangan dimensi sangat berguna di banyak aplikasi computer vision. Matriks proyeksi yang dihasilkan dari PCA dapat dilihat sebagai perubahan koordinat menjadi sistem koordinat di mana koordinat berada dalam urutan kepentingan yang menurun
Untuk menerapkan PCA pada data gambar, gambar perlu diubah menjadi representasi vektor satu dimensi menggunakan, misalnya, metode
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]5
Gambar yang diratakan dikumpulkan dalam satu matriks dengan menumpuknya, satu baris untuk setiap gambar. Baris kemudian dipusatkan relatif terhadap gambar rata-rata sebelum perhitungan arah dominan. Untuk menemukan komponen utama, dekomposisi nilai singular [SVD] biasanya digunakan, tetapi jika dimensinya tinggi, ada trik berguna yang dapat digunakan karena perhitungan SVD akan sangat lambat dalam kasus tersebut. Inilah tampilannya dalam kode
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_8
Fungsi ini pertama-tama memusatkan data dengan mengurangkan rata-rata di setiap dimensi. Kemudian vektor eigen yang sesuai dengan nilai eigen terbesar dari matriks kovarian dihitung, baik menggunakan trik kompak atau menggunakan SVD. Di sini kami menggunakan fungsi
pil_im = Image.open['empire.jpg'].convert['L']15, yang mengambil bilangan bulat n dan mengembalikan daftar bilangan bulat 0. . . [n – 1]. Jangan ragu untuk menggunakan alternatif
pil_im = Image.open['empire.jpg'].convert['L']_16, yang memberikan array, atau
pil_im = Image.open['empire.jpg'].convert['L']17, yang memberikan generator [dan mungkin memberikan peningkatan kecepatan]. Kami akan tetap dengan
pil_im = Image.open['empire.jpg'].convert['L']15 sepanjang buku ini
Kami beralih dari SVD untuk menggunakan trik dengan menghitung vektor eigen dari matriks kovarians XXT [lebih kecil] jika jumlah titik data kurang dari dimensi vektor. Ada juga cara untuk hanya menghitung vektor eigen yang sesuai dengan k nilai eigen terbesar [k menjadi jumlah dimensi yang diinginkan], membuatnya lebih cepat. Kami serahkan kepada pembaca yang tertarik untuk mengeksplorasi, karena ini benar-benar di luar cakupan buku ini. Baris-baris matriks V adalah ortogonal dan berisi arah koordinat dalam urutan varians menurun dari data pelatihan
Mari kita coba ini pada contoh gambar font. File fontimages. zip berisi gambar mini kecil dari karakter "a" yang dicetak dalam font berbeda dan kemudian dipindai. 2.359 font berasal dari koleksi font yang tersedia secara bebas. [] Dengan asumsi bahwa nama file dari gambar-gambar ini disimpan dalam daftar, imlist, bersama dengan kode sebelumnya, dalam file pca. py, komponen utama dapat dihitung dan ditampilkan seperti ini
from PIL import Image import os for infile in filelist: outfile = os.path.splitext[infile][0] + ".jpg" if infile != outfile: try: Image.open[infile].save[outfile] except IOError: print "cannot convert", infile_9
Gambar 1-8. Gambar rata-rata [kiri atas] dan tujuh mode pertama;
Perhatikan bahwa gambar perlu diubah kembali dari representasi satu dimensi menggunakan
pil_im = Image.open['empire.jpg'].convert['L']19. Menjalankan contoh harus memberikan delapan gambar dalam satu jendela gambar seperti yang ada di dalamnya. Di sini kami menggunakan fungsi
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]_6
pil_im = Image.open['empire.jpg'].convert['L']21 untuk menempatkan banyak plot dalam satu jendela
Jika Anda ingin menyimpan beberapa hasil atau data untuk digunakan nanti, modul
pil_im = Image.open['empire.jpg'].convert['L']22, yang disertakan dengan Python, sangat berguna. Pickle dapat mengambil hampir semua objek Python dan mengubahnya menjadi representasi string. Proses ini disebut pengawetan. Merekonstruksi objek dari representasi string sebaliknya disebut unpickling. Representasi string ini kemudian dapat dengan mudah disimpan atau ditransmisikan
Mari kita ilustrasikan ini dengan sebuah contoh. Misalkan kita ingin menyimpan rata-rata gambar dan komponen utama dari gambar font di bagian sebelumnya. Ini dilakukan seperti ini
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_0
Seperti yang Anda lihat, beberapa objek dapat diasinkan ke file yang sama. Ada beberapa protokol berbeda yang tersedia untuk. pkl, dan jika tidak yakin, yang terbaik adalah membaca dan menulis file biner. Untuk memuat data di beberapa sesi Python lainnya, cukup gunakan metode
pil_im = Image.open['empire.jpg'].convert['L']23 seperti ini
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_1
Perhatikan bahwa urutan objek harus sama. Ada juga versi yang dioptimalkan yang ditulis dalam C disebut
pil_im = Image.open['empire.jpg'].convert['L']24 yang sepenuhnya kompatibel dengan modul pickle standar. Rincian lebih lanjut dapat ditemukan di halaman dokumentasi modul pickle http. //dokumen. python. org/perpustakaan/acar. html
Untuk sisa buku ini, kami akan menggunakan pernyataan
pil_im = Image.open['empire.jpg'].convert['L']25 untuk menangani pembacaan dan penulisan file. Ini adalah konstruksi yang diperkenalkan di Python 2. 5 yang secara otomatis menangani pembukaan dan penutupan file [bahkan jika terjadi kesalahan saat file dibuka]. Inilah tampilan penyimpanan dan pemuatan di atas menggunakan
pil_im = Image.open['empire.jpg'].convert['L']26
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_2
dan
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_3
Ini mungkin terlihat aneh saat pertama kali Anda melihatnya, tetapi ini adalah konstruksi yang sangat berguna. Jika Anda tidak menyukainya, gunakan saja fungsi
pil_im = Image.open['empire.jpg'].convert['L']_27 dan
pil_im = Image.open['empire.jpg'].convert['L']28 seperti di atas
Sebagai alternatif untuk menggunakan pickle,
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 juga memiliki fungsi sederhana untuk membaca dan menulis file teks yang dapat berguna jika data Anda tidak mengandung struktur yang rumit, misalnya daftar titik yang diklik pada gambar. Untuk menyimpan array x ke file, gunakan
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_4
Parameter terakhir menunjukkan bahwa format integer harus digunakan. Demikian pula, membaca dilakukan seperti ini
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_5
Anda dapat mengetahui lebih lanjut dari dokumentasi online http. //dokumen. scipy. org/doc/numpy/reference/generated/numpy. loadtxt. html
Terakhir,
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9 memiliki fungsi khusus untuk menyimpan dan memuat array. Cari
box = [100,100,400,400] region = pil_im.crop[box]5 dan
pil_im = Image.open['empire.jpg'].convert['L']23 dalam dokumentasi online untuk detailnya
pil_im = Image.open['empire.jpg'].convert['L']_33 [http. // pedas. org/] adalah paket sumber terbuka untuk matematika yang dibangun di atas
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9 dan menyediakan rutin yang efisien untuk sejumlah operasi, termasuk integrasi numerik, pengoptimalan, statistik, pemrosesan sinyal, dan yang terpenting bagi kami, pemrosesan gambar. Seperti yang akan ditunjukkan berikut ini, ada banyak modul berguna di
pil_im = Image.open['empire.jpg'].convert['L']33.
pil_im = Image.open['empire.jpg'].convert['L']_33 gratis dan tersedia di http. // pedas. org/Unduh
Contoh klasik dan sangat berguna dari konvolusi gambar adalah pengaburan gambar Gaussian. Intinya, gambar [skala abu-abu] saya digabungkan dengan kernel Gaussian untuk membuat versi buram
Iσ = I * Gσ,
di mana * menunjukkan konvolusi dan Gσ adalah kernel 2D Gaussian dengan standar deviasi σ didefinisikan sebagai
Pemburaman Gaussian digunakan untuk menentukan skala gambar yang akan digunakan, untuk interpolasi, untuk menghitung poin minat, dan di banyak aplikasi lainnya
pil_im = Image.open['empire.jpg'].convert['L']_33 dilengkapi dengan modul untuk memfilter yang disebut
pil_im = Image.open['empire.jpg'].convert['L']38 yang dapat digunakan untuk menghitung konvolusi ini menggunakan pemisahan 1D yang cepat. Yang perlu Anda lakukan hanyalah ini
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_6
Di sini parameter terakhir dari
pil_im = Image.open['empire.jpg'].convert['L']39 adalah standar deviasi
menunjukkan contoh gambar kabur dengan meningkatnya σ. Nilai yang lebih besar memberikan detail yang lebih sedikit. Untuk mengaburkan gambar berwarna, cukup terapkan Gaussian blur ke setiap saluran warna
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_7
Di sini konversi terakhir ke "uint8" tidak selalu diperlukan tetapi memaksa nilai piksel berada dalam representasi 8-bit. Kami juga bisa menggunakan
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_8
untuk konversi
Gambar 1-9. Contoh pengaburan Gaussian menggunakan modul ________4______38. [a] gambar asli dalam skala abu-abu;
Untuk informasi lebih lanjut tentang penggunaan modul ini dan pilihan parameter yang berbeda, lihat dokumentasi
pil_im = Image.open['empire.jpg'].convert['L']33 dari
pil_im = Image.open['empire.jpg'].convert['L']42 di http. //dokumen. scipy. org/doc/scipy/reference/ndimage. html
Bagaimana intensitas citra berubah terhadap citra merupakan informasi penting dan digunakan untuk banyak aplikasi, seperti yang akan kita lihat di sepanjang buku ini. Perubahan intensitas dideskripsikan dengan turunan x dan y Ix dan Iy dari citra tingkat keabuan I [untuk citra berwarna biasanya diambil turunan untuk setiap kanal warna]
Gradien gambar adalah vektor ∇I = [Ix, Iy]T. Gradien memiliki dua sifat penting, besarnya gradien
yang menggambarkan seberapa kuat perubahan intensitas gambar, dan sudut gradien
α = arctan2[Iy, Ix],
yang menunjukkan arah perubahan intensitas terbesar pada setiap titik [piksel] pada citra. Fungsi
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]_9
pil_im = Image.open['empire.jpg'].convert['L']44 mengembalikan sudut bertanda dalam radian, dalam interval –π. π
Menghitung turunan gambar dapat dilakukan dengan menggunakan pendekatan diskrit. Ini paling mudah diimplementasikan sebagai konvolusi
Ix = I * Dx dan Iy = I * Dy
Dua pilihan umum untuk Dx dan Dy adalah filter Prewitt
dan filter Sobel
Filter turunan ini mudah diimplementasikan menggunakan konvolusi standar yang tersedia di modul
pil_im = Image.open['empire.jpg'].convert['L']38. Sebagai contoh
import os def get_imlist[path]: """ Returns a list of filenames for all jpg images in a directory. """ return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]_9
Ini menghitung turunan x dan y dan besarnya gradien menggunakan filter Sobel. Argumen kedua memilih turunan x atau y, dan argumen ketiga menyimpan hasilnya. menunjukkan gambar dengan turunan yang dihitung menggunakan filter Sobel. Pada dua citra turunan, turunan positif ditunjukkan dengan piksel terang dan turunan negatif ditampilkan dengan piksel gelap. Area abu-abu memiliki nilai mendekati nol
Menggunakan pendekatan ini memiliki kelemahan yaitu turunan diambil pada skala yang ditentukan oleh resolusi gambar. Agar lebih kuat terhadap derau gambar dan untuk menghitung turunan pada skala apa pun, filter turunan Gaussian dapat digunakan
Ix = I * Gσx dan Iy = I * Gσy,
di mana Gσx dan Gσy adalah turunan x dan y dari Gσ, sebuah fungsi Gaussian dengan standar deviasi σ
Fungsi
pil_im = Image.open['empire.jpg'].convert['L']46 yang kita gunakan untuk mengaburkan sebelumnya juga dapat menggunakan argumen tambahan untuk menghitung turunan Gaussian sebagai gantinya. Untuk mencoba ini pada gambar, lakukan saja
pil_im.thumbnail[[128,128]]_0
Argumen ketiga menentukan urutan turunan mana yang akan digunakan di setiap arah menggunakan standar deviasi yang ditentukan oleh argumen kedua. Lihat dokumentasi untuk detailnya. menunjukkan turunan dan besarnya gradien untuk skala yang berbeda. Bandingkan ini dengan pengaburan pada skala yang sama
Gambar 1-10. Contoh menghitung turunan gambar menggunakan filter turunan Sobel. [a] gambar asli dalam skala abu-abu;
Gambar 1-11. Contoh menghitung turunan gambar menggunakan turunan Gaussian. turunan-x [atas], turunan-y [tengah], dan besarnya gradien [bawah];
Morfologi—Menghitung Objek
Morfologi [atau morfologi matematika] adalah kerangka kerja dan kumpulan metode pemrosesan gambar untuk mengukur dan menganalisis bentuk dasar. Morfologi biasanya diterapkan pada citra biner tetapi juga dapat digunakan dengan skala abu-abu. Citra biner adalah citra yang setiap pikselnya hanya mengambil dua nilai, biasanya 0 dan 1. Citra biner seringkali merupakan hasil dari thresholding suatu citra, misalnya dengan maksud untuk menghitung objek atau mengukur ukurannya. Ringkasan morfologi yang bagus dan cara kerjanya ada di http. //en. wikipedia. org/wiki/Mathematical_morphology
Operasi morfologi termasuk dalam modul
pil_im = Image.open['empire.jpg'].convert['L']_42
pil_im = Image.open['empire.jpg'].convert['L']48. Fungsi penghitungan dan pengukuran untuk citra biner terdapat pada modul
pil_im = Image.open['empire.jpg'].convert['L']42
pil_im = Image.open['empire.jpg'].convert['L']50. Mari kita lihat contoh sederhana tentang cara menggunakannya
Pertimbangkan gambar biner di. [] Menghitung objek pada gambar tersebut dapat dilakukan dengan menggunakan
pil_im.thumbnail[[128,128]]_1
Ini memuat gambar dan memastikannya biner dengan ambang batas. Mengalikan dengan 1 mengubah array boolean menjadi biner. Kemudian fungsi
pil_im = Image.open['empire.jpg'].convert['L']51 menemukan objek individu dan memberikan label bilangan bulat ke piksel sesuai dengan objek yang dimiliki. menunjukkan larik label. Nilai tingkat keabuan menunjukkan indeks objek. Seperti yang Anda lihat, ada koneksi kecil antara beberapa objek. Menggunakan operasi yang disebut pembukaan biner, kita dapat menghapusnya
pil_im.thumbnail[[128,128]]_2
Argumen kedua dari
pil_im = Image.open['empire.jpg'].convert['L']52 menentukan elemen penataan, sebuah larik yang menunjukkan tetangga apa yang akan digunakan saat berpusat di sekitar piksel. Dalam hal ini, kami menggunakan 9 piksel [4 di atas, piksel itu sendiri, dan 4 di bawah] pada arah y dan 5 pada arah x. Anda dapat menentukan array apa pun sebagai elemen penataan; . Iterasi parameter menentukan berapa kali untuk menerapkan operasi. Coba ini dan lihat bagaimana jumlah objek berubah. Gambar setelah dibuka dan gambar label yang sesuai ditampilkan di. Seperti yang Anda duga, ada fungsi bernama
pil_im = Image.open['empire.jpg'].convert['L']53 yang melakukan kebalikannya. Kami meninggalkan itu dan fungsi lainnya di
pil_im = Image.open['empire.jpg'].convert['L']_48 dan
pil_im = Image.open['empire.jpg'].convert['L']50 ke latihan. Anda dapat mempelajari lebih lanjut tentang mereka dari
pil_im = Image.open['empire.jpg'].convert['L']_42 dokumentasi http. //dokumen. scipy. org/doc/scipy/reference/ndimage. html
Gambar 1-12. Contoh morfologi. Pembukaan biner untuk memisahkan objek diikuti dengan menghitungnya. [a] gambar biner asli;
pil_im = Image.open['empire.jpg'].convert['L']_33 hadir dengan beberapa modul yang berguna untuk input dan output. Dua di antaranya adalah
pil_im = Image.open['empire.jpg'].convert['L']58 dan
pil_im = Image.open['empire.jpg'].convert['L']59
Membaca dan menulis. file tikar
Jika Anda memiliki beberapa data, atau menemukan beberapa kumpulan data menarik secara online, disimpan di Matlab. mat, dimungkinkan untuk membaca ini menggunakan modul
pil_im = Image.open['empire.jpg'].convert['L']60. Ini adalah cara untuk melakukannya
pil_im.thumbnail[[128,128]]_3
Data objek sekarang berisi kamus dengan kunci yang sesuai dengan nama variabel yang disimpan dalam aslinya. berkas tikar. Variabel dalam format array. Menyimpan ke. file mat sama sederhananya. Cukup buat kamus dengan semua variabel yang ingin Anda simpan dan gunakan
pil_im = Image.open['empire.jpg'].convert['L']61
pil_im.thumbnail[[128,128]]_4
Ini menyimpan array x sehingga memiliki nama "x" saat dibaca ke dalam Matlab. Informasi lebih lanjut tentang
pil_im = Image.open['empire.jpg'].convert['L']_60 dapat ditemukan di dokumentasi online, http. //dokumen. scipy. org/doc/scipy/reference/io. html
Karena kita memanipulasi gambar dan melakukan perhitungan menggunakan objek array, akan berguna untuk menyimpannya secara langsung sebagai file gambar. [] Banyak gambar dalam buku ini dibuat begitu saja
Fungsi
pil_im = Image.open['empire.jpg'].convert['L']63 tersedia melalui modul
pil_im = Image.open['empire.jpg'].convert['L']64. Untuk menyimpan array im ke file, lakukan saja hal berikut
pil_im.thumbnail[[128,128]]_5
Modul
pil_im = Image.open['empire.jpg'].convert['L']64 juga berisi gambar uji "Lena" yang terkenal
pil_im.thumbnail[[128,128]]_6
Ini akan memberi Anda versi array skala abu-abu 512 × 512 dari gambar
Kami mengakhiri bab ini dengan contoh yang sangat berguna, menghilangkan kebisingan gambar. Image de-noising adalah proses menghilangkan noise gambar sementara pada saat yang sama mencoba mempertahankan detail dan struktur. Kami akan menggunakan model de-noising Rudin-Osher-Fatemi [ROF] yang awalnya diperkenalkan di. Menghilangkan noise dari gambar penting untuk banyak aplikasi, mulai dari membuat foto liburan Anda terlihat lebih baik hingga meningkatkan kualitas gambar satelit. Model ROF memiliki sifat yang menarik yaitu menemukan versi gambar yang lebih mulus sambil mempertahankan tepi dan struktur
Matematika yang mendasari model ROF dan teknik penyelesaiannya cukup maju dan berada di luar cakupan buku ini. Kami akan memberikan pengantar singkat dan disederhanakan sebelum menunjukkan cara mengimplementasikan pemecah ROF berdasarkan algoritme oleh Chambolle
Variasi total [TV] dari gambar [skala abu-abu] I didefinisikan sebagai jumlah dari norma gradien. Dalam representasi berkelanjutan, ini adalah
Persamaan 1-1.
Dalam pengaturan diskrit, variasi total menjadi
dimana penjumlahannya diambil dari semua koordinat citra x = [x, y]
Dalam ROF versi Chambolle, tujuannya adalah untuk menemukan gambar U yang dihilangkan noise yang meminimalkan min
dimana norma. saya – U. mengukur perbedaan antara U dan gambar asli I. Artinya, pada dasarnya, model mencari gambar yang "datar" tetapi memungkinkan "melompat" di tepi antar wilayah
Mengikuti resep di koran, ini kodenya
pil_im.thumbnail[[128,128]]_7
Dalam contoh ini, kami menggunakan fungsi
pil_im = Image.open['empire.jpg'].convert['L']_66, yang, seperti namanya, "menggulung" nilai array secara siklis di sekitar sumbu. Ini sangat nyaman untuk menghitung selisih tetangga, dalam hal ini untuk turunan. Kami juga menggunakan
pil_im = Image.open['empire.jpg'].convert['L']67, yang mengukur perbedaan antara dua array [dalam hal ini, matriks gambar U dan Uold]. Simpan fungsi
pil_im = Image.open['empire.jpg'].convert['L']_68 dalam file rof. py
Mari kita mulai dengan contoh sintetik dari gambar yang berisik
pil_im.thumbnail[[128,128]]_8
Gambar yang dihasilkan ditampilkan bersama dengan aslinya. Seperti yang Anda lihat, versi ROF mempertahankan tepian dengan baik
Gambar 1-13. Contoh de-noising ROF dari contoh sintetik. [a] gambar bising asli;
Gambar 1-14. Contoh de-noising ROF dari gambar skala abu-abu. [a] gambar asli;
Sekarang, mari kita lihat apa yang terjadi dengan gambar nyata
pil_im.thumbnail[[128,128]]_9
Hasilnya akan terlihat seperti , yang juga menampilkan versi buram dari gambar yang sama untuk perbandingan. Seperti yang Anda lihat, de-noise ROF mempertahankan tepi dan struktur gambar sekaligus mengaburkan "noise. ”
Dari Bab 2 dan selanjutnya, kami menganggap PIL,
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9, dan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]3 disertakan di bagian atas setiap file yang Anda buat dan di setiap contoh kode sebagai
box = [100,100,400,400] region = pil_im.crop[box]0
Ini membuat kode contoh lebih bersih dan presentasi lebih mudah diikuti. Dalam kasus ketika kami menggunakan modul
pil_im = Image.open['empire.jpg'].convert['L']_33, kami akan secara eksplisit menyatakannya dalam contoh
Kaum puritan akan menolak jenis impor selimut ini dan bersikeras pada sesuatu seperti itu
box = [100,100,400,400] region = pil_im.crop[box]_1
sehingga ruang nama dapat disimpan [untuk mengetahui dari mana setiap fungsi berasal] dan hanya mengimpor
pil_im = Image.open['empire.jpg'].convert['L']72 bagian dari
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]3, karena
from PIL import Image from pylab import * # read image to array im = array[Image.open['empire.jpg']] # plot the image imshow[im] # some points x = [100,100,400,400] y = [200,500,200,500] # plot the points with red star-markers plot[x,y,'r*'] # line plot connecting the first two points plot[x[:2],y[:2]] # add title and show the plot title['Plotting: "empire.jpg"'] show[]9 bagian yang diimpor dengan
region = region.transpose[Image.ROTATE_180] pil_im.paste[region,box]6 tidak diperlukan. Puritan dan pemrogram berpengalaman mengetahui perbedaannya dan dapat memilih opsi mana pun yang mereka sukai. Demi membuat konten dan contoh dalam buku ini mudah diakses oleh pembaca, saya memilih untuk tidak melakukannya