Seringkali, Anda akan memiliki gambar yang ingin Anda ekstrak datanya. Ini kemungkinan besar akan menjadi sesuatu yang sangat kecil, tetapi entah bagaimana akan berubah menjadi bagian terpenting dari teka-teki yang Anda BUTUHKAN SEKARANG. Oke… mungkin itu hanya saya. Terkadang menyenangkan bisa mengekstrak data dari gambar yang Anda temukan di artikel jurnal untuk mereplikasi hasilnya
Di sini, saya akan melalui langkah-langkah yang saya ambil untuk mengonversi gambar menjadi format RGB [menggunakan Python - tentu saja] dan mengubahnya menjadi array data. Dari sana menjadi menarik. Banyak gambar yang saya temukan telah diinterpolasi dari data yang relatif jarang. Anda tidak membutuhkan semua data itu. Ini membuang-buang ruang dan Anda lebih baik memangkas bit yang sebenarnya tidak Anda perlukan - terutama jika Anda ingin melakukan beberapa pemrosesan pasca spasial
Inilah langkah-langkah utamanya
- Impor gambar menggunakan modul
scipy.ndimage
- Siapkan peta warna menggunakan
matplotlib.colors
- Kueri peta warna dengan banyak angka di sepanjang interval yang telah Anda tentukan dan simpan di KDTree
- Permintaan KDTree menggunakan larik $m \times n \times 3$
ndimage
RGB. Hasilnya adalah larik data $m \times n$ - Kurangi data dengan mengambil turunan spasial pertama menggunakan
numpy.diff
dan menghapus titik di mana $. \nabla. > 0$ - Gunakan
sklearn.DBScan
_ dari modul scikit-learn untuk mengelompokkan data dan menghapus lebih banyak data yang tidak perlu - Minumlah bir
Pada akhirnya saya memiliki kelas Python yang berisi semua langkah ini digulung menjadi satu potongan kode yang bagus untuk Anda gunakan pada proyek Anda sendiri, jika menurut Anda ini berguna
Siap?
Muat gambar
from scipy import ndimage
import numpy as np
import matplotlib.pyplot as plt
im = ndimage.read["filename.jpg"] # flatten=True for b&w
plt.imshow[im]
plt.show[]
Itu terlihat bagus, im
adalah array $m \times n \times 3$ - i. e. 3 set baris $m$, kolom $n$, yang sesuai dengan jumlah piksel, untuk setiap saluran RGB. Sekarang mari buat peta warna dan masukkan semuanya ke dalam KDTree untuk pencarian tetangga terdekat. Serius, KDTrees luar biasa. srsly
from scipy.spatial import cKDTree
from matplotlib import colors as mcolors
def scalarmap[cmap, vmin, vmax]:
""" Create a matplotlib scalarmap object from colour stretch """
cNorm = mcolors.Normalize[vmin=vmin, vmax=vmax]
return plt.cm.ScalarMappable[norm=cNorm, cmap=cmap]
scalarMap = scalarmap[plt.get_cmap["jet_r"], 0.0, 0.7]
value_array = np.linspace[0,0.7,10000]
color_array = np.asarray[scalarMap.to_rgba[value_array]]
color_array *= 255 # rescale
tree = cKDTree[color_array[:,:-1]] # Last column is alpha
d, index = tree.query[im]
data = value_array[index]
_Kami menskalakan peta warna antara 0. 0 dan 0. 7, yang sesuai dengan luasnya gambar. Opsional, kita bisa menutupi piksel yang agak jauh, $d$, dari peta warna. e. g.
from scipy.spatial import cKDTree
from matplotlib import colors as mcolors
def scalarmap[cmap, vmin, vmax]:
""" Create a matplotlib scalarmap object from colour stretch """
cNorm = mcolors.Normalize[vmin=vmin, vmax=vmax]
return plt.cm.ScalarMappable[norm=cNorm, cmap=cmap]
scalarMap = scalarmap[plt.get_cmap["jet_r"], 0.0, 0.7]
value_array = np.linspace[0,0.7,10000]
color_array = np.asarray[scalarMap.to_rgba[value_array]]
color_array *= 255 # rescale
tree = cKDTree[color_array[:,:-1]] # Last column is alpha
d, index = tree.query[im]
data = value_array[index]
_0. Ini akan menutupi teks hitam dan latar belakang putih pada gambarSaya tidak tahu cara yang lebih baik untuk memetakan larik warna RGB ke data daripada ke entri kueri di KDTree. Jika ya, sebutkan di komentar di bawah
Pengurangan data
Sekarang setelah kami mengubah gambar menjadi array, kami dapat mengurangi data sehingga hanya bit penting yang tersisa. Pertama, kita ambil turunan spasial pertama dan temukan di mana $\nabla = 0$
dx = np.abs[np.diff[data[:,:-1], axis=0]]
dy = np.abs[np.diff[data[:-1,:], axis=1]]
dxdy = [dx + dy]/2.0
mask = dxy