Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

BÁO CÁO GIỮA KÌ

MÔN HỌC: XỬ LÝ ẢNH

Họ và tên: Lê Đức Minh

Mssv: 20020693

Bài 1: Histogram specification

Yêu cầu: Mã nguồn, ảnh đầu vào(grayscale) histogram của anh đầu vào, 3 ảnh kết
quả và histogram của 3 ảnh này.

Mã Nguồn:

Sử dụng OpenCV, Maplotlib và numpy


import cv2
import numpy as np
import matplotlib.pyplot as plt

# Đọc ảnh grayscale đầu vào


input_image = cv2.imread('image1_gray.jpg', cv2.IMREAD_GRAYSCALE)

# Tính histogram của ảnh đầu vào


hist_input = cv2.calcHist([input_image], [0], None, [256], [0, 256])

# Thực hiện Histogram Specification bằng cách sử dụng 3 phương pháp


khác nhau
# Ví dụ 1: Chuyển đổi ảnh đầu vào theo cách 1
input_equalized_1 = cv2.equalizeHist(input_image)

# Ví dụ 2: Chuyển đổi ảnh đầu vào theo cách 2


input_clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
input_equalized_2 = input_clahe.apply(input_image)

# Ví dụ 3: Chuyển đổi ảnh đầu vào theo cách 3


input_equalized_3 = cv2.LUT(input_image, np.arange(256, dtype =
input_image.dtype))

# Tính histogram của ảnh sau khi chuyển đổi bằng từng phương pháp
hist_equalized_1 = cv2.calcHist([input_equalized_1], [0], None, [256],
[0, 256])
hist_equalized_2 = cv2.calcHist([input_equalized_2], [0], None, [256],
[0, 256])
hist_equalized_3 = cv2.calcHist([input_equalized_3], [0], None, [256],
[0, 256])

# Hiển thị histogram của ảnh đầu vào


plt.subplot(4, 3, 1)
plt.title('Histogram ảnh đầu vào')
plt.plot(hist_input)

# Hiển thị ảnh đầu vào


plt.subplot(4, 3, 3)
plt.title('Ảnh đầu vào')
plt.imshow(input_image, cmap='gray')

# Hiển thị histogram của ảnh sau khi chuyển đổi bằng phương pháp 1
plt.subplot(4, 3, 6)
plt.title('Histogram (1)')
plt.plot(hist_equalized_1)

# Hiển thị ảnh sau khi chuyển đổi bằng phương pháp 1
plt.subplot(4, 3, 4)
plt.title('Ảnh chuyển đổi (Phương pháp 1)')
plt.imshow(input_equalized_1, cmap='gray')

# Hiển thị histogram của ảnh sau khi chuyển đổi bằng phương pháp 2
plt.subplot(4, 3, 9)
plt.title('Histogram (2)')
plt.plot(hist_equalized_2)

# Hiển thị ảnh sau khi chuyển đổi bằng phương pháp 2
plt.subplot(4, 3, 7)
plt.title('Ảnh chuyển đổi (Phương pháp 2)')
plt.imshow(input_equalized_2, cmap='gray')

# Hiển thị histogram của ảnh sau khi chuyển đổi bằng phương pháp 3
plt.subplot(4, 3, 12)
plt.title('Histogram (3)')
plt.plot(hist_equalized_3)

# Hiển thị ảnh sau khi chuyển đổi bằng phương pháp 3
plt.subplot(4, 3, 10)
plt.title('Ảnh chuyển đổi (Phương pháp 3)')
plt.imshow(input_equalized_3, cmap='gray')

# Lưu các ảnh kết quả vào các tệp ảnh


cv2.imwrite('output_equalized_1.jpg', input_equalized_1)
cv2.imwrite('output_equalized_2.jpg', input_equalized_2)
cv2.imwrite('output_equalized_3.jpg', input_equalized_3)

plt.tight_layout()
plt.show()

ảnh đầu vào:


3 ảnh kết quả biến đổi:
Kết quả Histogram:
Bài 2: Xác định biên trên ảnh sử dụng các toán tử gradient và lấy ngưỡng
(thresholding) hoặc dùng một phương pháp tương tự như Canny edge
detector.

Đầu vào là ảnh grayscale, đầu ra là ảnh kết quả (ảnh nhị phân: 0 - non-edge
pixels, 1 - edge pixels).

Mã nguồn: Sử dụng OpenCV, Numpy


import cv2
import numpy as np

# Đọc ảnh grayscale đầu vào


input_image = cv2.imread('image1_gray.jpg', cv2.IMREAD_GRAYSCALE)

# Sử dụng Sobel để tính gradient theo x và y


gradient_x = cv2.Sobel(input_image, cv2.CV_64F, 1, 0, ksize=3)
gradient_y = cv2.Sobel(input_image, cv2.CV_64F, 0, 1, ksize=3)

# Tính tổng giá trị gradient


gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)

# Áp dụng ngưỡng để tạo ảnh nhị phân


threshold_value = 40 # Điều chỉnh ngưỡng tại đây
edge_image = cv2.threshold(gradient_magnitude, threshold_value, 1,
cv2.THRESH_BINARY)[1]

# Hiển thị ảnh kết quả


cv2.imshow('Edge Image', edge_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

# Lưu ảnh kết quả thành tệp ảnh


cv2.imwrite('edge_image.jpg', edge_image * 255)
Ảnh đầu vào:

Ảnh đầu ra:

You might also like