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.