Widget HTML Atas


Tanya Jawab Pengolahan Citra Digital 20231

Tanya Jawab Pengolahan Citra Digital

Soal 1: Pembacaan dan Konversi Citra ke Grayscale

```python

from PIL import Image

import matplotlib.pyplot as plt


# Membaca citra

image = Image.open('path/to/your/image.jpg')


# Konversi ke grayscale

gray_image = image.convert('L')


# Menampilkan kedua citra

plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)

plt.imshow(image)

plt.title('Original Image')

plt.axis('off')


plt.subplot(1, 2, 2)

plt.imshow(gray_image, cmap='gray')

plt.title('Grayscale Image')

plt.axis('off')


plt.show()

```

Soal 2: Deteksi Tepi Sederhana


```python

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt


def apply_sobel_filter(image, kernel):

    height, width = image.shape

    edge_image = np.zeros((height, width))


    for i in range(1, height-1):

        for j in range(1, width-1):

            # Apply Sobel filter

            sum = 0

            for k in range(-1, 2):

                for l in range(-1, 2):

                    sum += (image[i+k, j+l] * kernel[k+1, l+1])

            edge_image[i, j] = min(max(int(sum), 0), 255)


    return edge_image


# Membaca citra dan mengkonversinya ke grayscale

image = Image.open('path/to/your/image.jpg').convert('L')

image_np = np.array(image)


# Sobel Kernels

sobel_horizontal = np.array([[-1, -2, -1], 

                             [ 0,  0,  0], 

                             [ 1,  2,  1]])


sobel_vertical = np.array([[-1, 0, 1], 

                           [-2, 0, 2], 

                           [-1, 0, 1]])


# Applying Sobel Filters

horizontal_edges = apply_sobel_filter(image_np, sobel_horizontal)

vertical_edges = apply_sobel_filter(image_np, sobel_vertical)


# Menampilkan citra asli dan hasil deteksi tepi

plt.figure(figsize=(15, 5))


plt.subplot(1, 3, 1)

plt.imshow(image_np, cmap='gray')

plt.title('Original Image')

plt.axis('off')


plt.subplot(1, 3, 2)

plt.imshow(horizontal_edges, cmap='gray')

plt.title('Horizontal Edges')

plt.axis('off')


plt.subplot(1, 3, 3)

plt.imshow(vertical_edges, cmap='gray')

plt.title('Vertical Edges')

plt.axis('off')


plt.show()

```


Catatan:

1. Pastikan Anda memiliki file citra yang ingin dianalisis di lokasi yang tepat ('path/to/your/image.jpg').

2. Library `Pillow` digunakan untuk membaca dan mengkonversi citra, dan `numpy` untuk operasi matriks.


Jawaban ini menunjukkan cara menggunakan filter Sobel sederhana untuk deteksi tepi horizontal dan vertikal pada citra grayscale. Filter Sobel diterapkan pada citra menggunakan konvolusi manual tanpa mengandalkan library khusus pengolahan citra seperti OpenCV.

Soal 3: Mengubah Ukuran Citra dengan Interpolasi Bilinear


```python

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt


def bilinear_resize(image, new_width, new_height):

    src_height, src_width = image.shape

    resized = np.zeros((new_height, new_width))


    for i in range(new_height):

        for j in range(new_width):

            # Hitung koordinat pada citra asli

            x = (i / new_height) * src_height

            y = (j / new_width) * src_width


            x1, y1 = int(x), int(y)

            x2, y2 = min(x1 + 1, src_height - 1), min(y1 + 1, src_width - 1)


            # Hitung bobot interpolasi

            wa = (x2 - x) * (y2 - y)

            wb = (x2 - x) * (y - y1)

            wc = (x - x1) * (y2 - y)

            wd = (x - x1) * (y - y1)


            # Hitung nilai piksel baru

            resized[i, j] = wa * image[x1, y1] + wb * image[x1, y2] + wc * image[x2, y1] + wd * image[x2, y2]


    return resized


# Membaca citra dan mengkonversinya ke grayscale

image = Image.open('path/to/your/image.jpg').convert('L')

image_np = np.array(image)


# Mengubah ukuran citra

new_width, new_height = 300, 200  # Contoh ukuran baru

resized_image = bilinear_resize(image_np, new_width, new_height)


# Menampilkan citra asli dan citra yang telah diubah ukurannya

plt.figure(figsize=(12, 6))


plt.subplot(1, 2, 1)

plt.imshow(image_np, cmap='gray')

plt.title('Original Image')

plt.axis('off')


plt.subplot(1, 2, 2)

plt.imshow(resized_image, cmap='gray')

plt.title('Resized Image')

plt.axis('off')


plt.show()

```


Catatan:

1. Pastikan Anda memiliki file citra yang ingin dianalisis di lokasi yang tepat ('path/to/your/image.jpg').

2. Library `Pillow` digunakan untuk membaca dan mengkonversi citra, dan `numpy` untuk operasi array.


Jawaban ini memberikan contoh cara mengubah ukuran citra menggunakan metode interpolasi bilinear. Prosesnya melibatkan menghitung bobot interpolasi dan menerapkannya pada piksel terdekat untuk menghasilkan citra yang diubah ukurannya.


----

Berikut adalah contoh jawaban untuk Soal No. 4, yang berkaitan dengan penggunaan histogram untuk peningkatan kontras citra:

Soal 4: Peningkatan Kontras Citra Menggunakan Histogram


```python

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt


def equalize_histogram(image):

    histogram, _ = np.histogram(image.flatten(), 256, [0, 256])

    cdf = histogram.cumsum()  # cumulative distribution function

    cdf_normalized = cdf * histogram.max() / cdf.max()


    cdf_masked = np.ma.masked_equal(cdf, 0)

    cdf_masked = (cdf_masked - cdf_masked.min()) * 255 / (cdf_masked.max() - cdf_masked.min())

    cdf = np.ma.filled(cdf_masked, 0).astype('uint8')


    return cdf[image]


# Membaca citra dan mengkonversinya ke grayscale

image = Image.open('path/to/your/image.jpg').convert('L')

image_np = np.array(image)


# Equalize the histogram

equalized_image = equalize_histogram(image_np)


# Menampilkan citra asli dan hasil peningkatan kontras

plt.figure(figsize=(15, 5))


plt.subplot(1, 3, 1)

plt.imshow(image_np, cmap='gray')

plt.title('Original Image')

plt.axis('off')


plt.subplot(1, 3, 2)

plt.hist(image_np.flatten(), 256, [0, 256], color = 'r')

plt.title('Histogram for Original Image')

plt.xlim([0, 256])


plt.subplot(1, 3, 3)

plt.imshow(equalized_image, cmap='gray')

plt.title('Histogram Equalized Image')

plt.axis('off')


plt.show()

```


Catatan:

1. Pastikan Anda memiliki file citra yang ingin dianalisis di lokasi yang tepat ('path/to/your/image.jpg').

2. Library `Pillow` digunakan untuk membaca dan mengkonversi citra, dan `numpy` untuk operasi array dan histogram.


Jawaban ini menunjukkan bagaimana histogram citra dapat digunakan untuk meningkatkan kontras citra. Ini dilakukan dengan menormalisasi distribusi intensitas piksel di seluruh citra menggunakan equalisasi histogram, yang meratakan distribusi intensitas piksel dan meningkatkan kontras secara keseluruhan pada citra.

Soal 5: Histogram Citra


```python

from PIL import Image

import matplotlib.pyplot as plt


# Membaca citra dan mengkonversinya ke grayscale

image = Image.open('path/to/your/image.jpg').convert('L')


# Menghitung histogram

histogram = [0] * 256

for pixel in image.getdata():

    histogram[pixel] += 1


# Menampilkan histogram

plt.figure(figsize=(8, 4))

plt.bar(range(256), histogram, width=1)

plt.title('Histogram of Grayscale Image')

plt.xlabel('Pixel Value')

plt.ylabel('Frequency')

plt.show()

```


Catatan: 

1. Pastikan Anda memiliki file citra yang ingin dianalisis di lokasi yang tepat ('path/to/your/image.jpg').

2. Anda mungkin perlu menginstal library `Pillow` dengan menjalankan `pip install Pillow` jika belum terinstall.


Jawaban ini memberikan contoh dasar tentang cara membaca dan memproses citra menggunakan Python tanpa mengandalkan library khusus pengolahan citra seperti OpenCV.

Soal 6: Deteksi Tepi Menggunakan Filter Sobel


```python

import numpy as np

from PIL import Image

import matplotlib.pyplot as plt


def sobel_filter(image):

    Gx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])

    Gy = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])


    rows, cols = image.shape

    sobel_image = np.zeros_like(image)


    # Apply Sobel Filter

    for i in range(1, rows-1):

        for j in range(1, cols-1):

            sx = np.sum(np.multiply(Gx, image[i-1:i+2, j-1:j+2]))  # Horizontal edges

            sy = np.sum(np.multiply(Gy, image[i-1:i+2, j-1:j+2]))  # Vertical edges


            sobel_image[i, j] = np.sqrt(sx**2 + sy**2)


    return sobel_image


# Load and convert image to grayscale

image = Image.open('path/to/your/image.jpg').convert('L')

image_np = np.array(image)


# Apply Sobel Filter

sobel_edges = sobel_filter(image_np)


# Display Results

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)

plt.imshow(image_np, cmap='gray')

plt.title('Original Image')

plt.axis('off')


plt.subplot(1, 2, 2)

plt.imshow(sobel_edges, cmap='gray')

plt.title('Sobel Edge Detection')

plt.axis('off')


plt.show()

```


Catatan:

1. Pastikan Anda memiliki file citra yang ingin dianalisis di lokasi yang tepat ('path/to/your/image.jpg').

2. Library `Pillow` digunakan untuk membaca dan mengkonversi citra, dan `numpy` untuk operasi array dan filter Sobel.


Jawaban ini menunjukkan bagaimana filter Sobel digunakan untuk mendeteksi tepi dalam citra. Filter Sobel mendeteksi perubahan intensitas secara horizontal dan vertikal, dan kombinasi dari kedua filter tersebut digunakan untuk menonjolkan tepi dalam citra.