Home » , , , » Sampling dan kuantisasi gambar digital

Sampling dan kuantisasi gambar digital

Written By SBlog on Saturday, June 5, 2021 | June 05, 2021

 sumber: https://medium.com/swlh/image-processing-with-python-digital-image-sampling-and-quantization-4d2c514e0f00

Kali ini kita akan mencoba untuk melakukan sampling dan kuantisasi gambar digital bersumber dari alamat tersebut diatas. Sebelum memulai kita persiapkan beberapa library yang akan digunakan pada proses sampling dan kuantisasi gambar digital antara lain library numpy, matplotlib, dan skimage.

Untuk tahap awal kita melakukan update pip dan menginstall semua library yang diperlukan.

# Update pip
python -m pip install -U pip
# Install scikit-image
python -m pip install -U scikit-image

beberapa kasus mungkin membutuhkan library tambahan yaitu pillow.

pip install -U Pillow

Sebelum melanjutkan, akan lebih mudah jika anda mengerjakan setiap code tersebut menggunakan Jupyter Notebook.

Bailkan kita coba untuk mendefinisikan apa itu pengambilan sampel gambar. Pengambilan sampel gambar melibatkan pengambilan nilai gambar pada interval spasial yang teratur. Panjang interval menentukan resolusi spasial gambar. Untuk lebih menjelaskan hal ini, mari kita coba contoh gambar analog lingkaran di mana N adalah jumlah piksel di sisi gambar.

Berikut ini program untuk memahami tentang resolusi spasial pada gambar.

def circle_image(x, y):
    X, Y = np.meshgrid(x, y)
    return X**2 + Y**2

factors = 2**np.arange(1, 5)
fig, ax = plt.subplots(1, len(factors), figsize=(15, 4))
for i, N in enumerate(factors):
    image = circle_image(np.linspace(-1, 1, num=N), np.linspace(-1, 1, num=N))
    ax[i].imshow(image, cmap='gray')
    ax[i].set_title('$N = {}$'.format(N))

dari pengujian yang dilakukan tersebut terlihat resolusi gambar lebih baik, dan titik-titiknya jauh lebih padat seiring bertambahnya N. Ini menandakan bahwa saat kita meningkatkan jumlah piksel pada gambar, kita dapat merepresentasikan objek analog menjadi gambar digital dengan lebih baik.
Selanjutnya coba pada gambar donat.

donat = imread('donat.jpg')
from skimage.transform import downscale_local_mean
factors = 3**np.arange(1, 5)
figure, axis = plt.subplots(1, len(factors), figsize=(20, 6))
for factor, ax in zip(factors, axis):
    image = downscale_local_mean(donat, 
                 factors=(factor, factor, 1)).astype(int)
    ax.imshow(image)
    ax.set_title('$N={}$'.format(image.shape[0]))

Pada dua gambar yang pertama gambar donat masih dapat terlihat jelas, namun pada dua gambar berikutnya terdapat pengurangan resulusi dikarenakan saat kita semakin mengurangi pengambilan sampel pada resolusi spasial gambar, maka gambar tidak lagi jelas. Banyak informasi yang hilang, dan gambar digital tidak dapat sepenuhnya mewakili objek analog.

Selanjutnya kita mencoba memahami tentang kuantisasi citra. Kuantisasi citra melibatkan diskritisasi nilai intensitas citra analog. Untuk mendemonstrasikan hal ini, mari kita coba untuk mendiskritisasi citra analog lingkaran di mana k adalah jumlah bit yang mewakili nilai intensitas.

def circle_image(x, y):
    X, Y = np.meshgrid(x, y)
    return X**2 + Y**2
factors = 2**np.arange(1, 5)
circ_image = circle_image(np.linspace(0, 1, num=4), 
                          np.linspace(0, 1, num=4))
fig, ax = plt.subplots(1, len(factors), figsize=(15, 4))
for i, k in enumerate(factors):
    bins = np.linspace(0, circ_image.max(), k)
    image = np.digitize(circ_image, bins)
    image = np.vectorize(bins.tolist().__getitem__)(image-1)
    ax[i].imshow(image)
    ax[i].set_title('$k = {}$'.format(k))

Seperti yang dapat kita amati, representasi warna gambar jauh lebih baik dengan bertambahnya k. Ini menandakan bahwa ketika kita meningkatkan jumlah nilai diskrit yang mewakili nilai intensitas gambar dalam sebuah gambar, maka semakin baik kita dapat merepresentasikan objek analog menjadi gambar digital. Berikut ini kita coba pada gambar donat.

factors = 2**np.arange(1, 5)
figure, axis = plt.subplots(1, len(factors), figsize=(20, 6))
for k, ax in zip(factors, axis):
    bins = np.linspace(0, donat.max(), k)
    image = np.digitize(donat, bins)
    image = (np.vectorize(bins.tolist().__getitem__)
                         (image-1).astype(int))
    ax.imshow(image)
    ax.set_title('$k = {}$'.format(k))

Pada spektrum yang lebih rendah, kita dapat melihat bahwa semakin kita mengurangi diskritisasi gambar, penurunan kualitas gambar menjadi lebih jelas. Ini sampai pada titik pada gambar digital tidak dapat lagi mewakili berbagai warna objek analog karena rentang nilai intensitas yang terbatas.

Pada spektrum yang lebih tinggi, kita dapat mengamati bahwa tidak ada banyak perbedaan. Ini menandakan bahwa ada batasan pada seberapa banyak nilai intensitas diskrit yang dapat dilihat mata manusia. Jika kita semakin meningkatkan jumlah nilai intensitas diskrit, akan ada sedikit atau tidak ada perbedaan dalam kualitas gambar.

0 comments:

Post a Comment

(^_^) [o_o] (^.^) (".") ($.$)