Bagaimana saya bisa memotong gambar, seperti yang saya lakukan sebelumnya di PIL, menggunakan OpenCV.
Contoh kerja pada PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Tetapi bagaimana saya bisa melakukannya di OpenCV?
Inilah yang saya coba:
im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)
Tapi itu tidak berhasil.
Saya pikir saya salah digunakan getRectSubPix
. Jika ini masalahnya, tolong jelaskan bagaimana saya dapat menggunakan fungsi ini dengan benar.
crop_img = img[margin:-margin, margin:-margin]
Saya punya pertanyaan ini dan menemukan jawaban lain di sini: salin wilayah yang diminati
Jika kita menganggap (0,0) sebagai sudut kiri atas gambar disebut
im
dengan kiri-ke-kanan sebagai arah x dan atas-ke-bawah sebagai arah y. dan kami memiliki (x1, y1) sebagai verteks kiri-atas dan (x2, y2) sebagai verteks kanan-bawah dari wilayah persegi panjang dalam gambar itu, maka:di sini adalah sumber daya yang komprehensif pada pengindeksan array dan numpy array yang dapat memberitahu Anda lebih banyak tentang hal-hal seperti memotong bagian dari gambar gambar akan disimpan sebagai array numpy di opencv2.
:)
sumber
im
belum dibaca dengan benar dan kosong. coba gunakan IDE dengan breakpoint untuk mendiagnosis kode Anda langkah demi langkah. Anda dapat menggunakan google colab untuk membuat blok kode dan dapat berbagi buku catatan jupytor Anda di ruang obrolan python stackoverflow untuk mendapatkan bantuan seseorang.Perhatikan bahwa, mengiris gambar tidak membuat salinan
cropped image
tetapi membuatpointer
keroi
. Jika Anda memuat begitu banyak gambar, memotong bagian yang relevan dari gambar dengan mengiris, lalu menambahkannya ke dalam daftar, ini mungkin merupakan pemborosan memori yang sangat besar.Misalkan Anda memuat N gambar masing-masing
>1MP
dan Anda hanya perlu100x100
wilayah dari sudut kiri atas.Slicing
:Atau, Anda dapat menyalin bagian yang relevan dengan
.copy()
, sehingga pengumpul sampah akan menghapusim
.Setelah mengetahui ini, saya menyadari salah satu komentar oleh user1270710 menyebutkan bahwa tetapi butuh beberapa waktu untuk mengetahuinya (yaitu, debugging dll). Jadi, saya pikir itu layak disebutkan.
sumber
copy()
ROI, dibandingkan dengan mengiris, apa hasilnya? Juga, jika saya memiliki variabeltmp
di mana saya menyimpan setiap gambar yang saya muat dari komputer saya, pengirisan seharusnya tidak berdampak buruk pada memori saya, kan? Masalah yang Anda jelaskan hanya terkait dengan apa yang terjadi ketika Anda memuat semua gambar dan kemudian Anda menyimpannya kembali ROI, memiliki yang asli dan ROI . Tolong beri tahu saya jika saya benar mengerti.kode ini memotong gambar dari x = 0, y = 0 posisi ke h = 100, w = 200
sumber
Di bawah ini adalah cara untuk memotong gambar.
image_path: Jalur ke gambar untuk diedit
coords: Sebuah tuple koordinat x / y (x1, y1, x2, y2) [buka gambar dalam mspaint dan periksa "penggaris" di tab tampilan untuk melihat koordinat]
Saved_location : Path untuk menyimpan gambar yang dipangkas
sumber
Pangkas yang kuat dengan fungsi batas salinan opencv:
sumber
x1,y1,x2,y2 = bbox
ketika mengatakan:TypeError: 'int' object is not iterable
di sini adalah beberapa kode untuk imcrop yang lebih kuat (sedikit seperti di matlab)
sumber
Atau, Anda bisa menggunakan tensorflow untuk memotong dan openCV untuk membuat array dari gambar.
Sekarang
img
adalah array bentuk (imageheight, imagewidth, 3). Pangkas array dengan tensorflow:Pasang kembali gambar dengan tf.keras, sehingga kita dapat melihatnya jika berhasil:
Ini mencetak pic di buku catatan (diuji di Google Colab).
Seluruh kode bersama-sama:
sumber