1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÁO CÁO BÀI TẬP NHÓM MÔN: XỬ LÝ ẢNH

27 21 3

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 27
Dung lượng 4,08 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

PHẦN 2: LỰA CHỌNChọn đề tài 5: Kỹ thuật Canny CƠ SỞ LÝ THUYẾT Biên ảnh:  Điểm biên: một điểm ảnh được coi là điểm biên nếu có sự thay đổi đột ngột về mức xám.. Ví dụ: đối với ảnh đen tr

Trang 1

HÀ NỘI – 2018

Trang 2

for y in range(0, height):

for x in range(0, width):

image[y, x] = 255 if image[y, x] >= T else0

return imageKết quả thực hiện với ngưỡng = 150:

Trang 4

2 Khuếch tán lỗi 1 chiều (error_diffusion.py):

for y in range(0, height):

for x in range(0, width):

return imageKết quả thực hiện với ngưỡng = 127:

Trang 5

3 Khuếch tán lỗi 2 chiều theo kiểu của Floyd – Steinberg (fs_dithering.py):

for y in range(0, height):

for x in range(0, width):

oldpx = image[y, x]

newpx = threshold(oldpx, T)error = oldpx - newpx

Kết quả thực hiện với ngưỡng = 127:

Trang 6

4 Tăng giảm độ sáng (adjust_brightness.py):

Code:

def adjustBirghtness(image, value):

height = image.shape[0]

width = image.shape[1]

for y in range(0, height):

for x in range(0, width):

temp = int(image[y, x]) + value

if temp >= 255:

image[y, x] = 255elif temp <= 0:

image[y, x] = 0else:

image[y, x] = tempreturn image

Kết quả thực hiện tăng độ sáng thêm 100 đơn vị:

Trang 7

5 Biểu đồ tần suất (histogram.py):

for x in range(0, width):

htg[image[y, x]] += 1return htg

Đoạn mã vẽ biểu đồ tần suất:

Trang 8

Ảnh gốc:

Kết quả thực hiện:

Trang 9

6 Cân bằng tần suất (histogram_equalization.py):

for x in range(0, width):

htg[image[y, x]] += 1return htg

def equalize(image):

hist = histogram(image)for i in range(1, 256):

for y in range(0, height):

for x in range(0, width):

image[y, x] = eql[image[y, x]]

return image

Kết quả so sánh ảnh và biểu đồ tần suất trước và sau khi xử lý:

Trang 11

for y in range(0, height):

for x in range(0, width):

htg[image[y, x]] += 1

for i in range(1, 256):

t.append(htg[i] + t[i-1])ghg.append(i * htg[i] + ghg[i-1])

m = [0.0]

for i in range(1, 256):

try:

m.append((1/t[i]) * ghg[i])except ZeroDivisionError as e:

m.append(0)max = 0

threshold = 0for i in range(0, 256):

try:

tmp = m[255])**2)

(t[i]/(width*height-t[i]))*((m[i]-if tmp > max:

max = tmpthreshold = i;

except ZeroDivisionError as e:

passreturn threshold

Trang 12

Hàm tách ngưỡng:

def threshold(T, image):

height = image.shape[0]

width = image.shape[1]

for y in range(0, height):

for x in range(0, width):

image[y, x] = 255 if image[y, x] >= T else0

return imageKết quả ảnh được tách ngưỡng với ngưỡng tính được = 117:

Trang 13

for y in range(0, height-m+1):

for x in range(0, width-m+1):

res[y, x] = (kernel*image[y:y+m, x:x+m]).sum()

return res[0:height-m+1, 0:width-m+1]

Kết quả ảnh nhân chập với ma trận [−10 −15 −10

0 −1 0 ]:

Trang 14

for y in range(0, height-n+1):

for x in range(0, width-m+1):

tmp.clear()for i in range(0, n):

for j in range(0, m):

tmp.append(image[y+i, x+j])tmp.sort()

image[y+dy, x+dx] = tmp[mid]

return image[dy:height-dy, dx:width-dx]

Kết quả thực hiện với của sổ 3*3:

10.Lọc trung bình (average_filter.py):

Trang 15

for y in range(0, height-n+1):

for x in range(0, width-m+1):

tmp = 0for i in range(0, n):

for j in range(0, m):

tmp += int(image[y+i, x+j])image[y+dy, x+dx] = round(tmp/(m*n))return image[dy:height-dy, dx:width-dx]

Kết quả thực hiện lọc trung binh với cửa sổ 3*3:

Trang 16

for y in range(0, height-m+1):

for x in range(0, width-m+1):

res[y, x] = ((kernel*image[y:y+m, x:x+m]).sum())/div

return res[0:height-m+1, 0:width-m+1]

def gaussianFilter(image):

gaussian = np.array([[2, 4, 5, 4, 2],

[4, 9, 12, 9, 4],[5, 12, 15, 12, 5],[4, 9, 12, 9, 4],[2, 4, 5, 4, 2]])return convolve(image, gaussian, 5, 159)

Kết quả sau khi thực hiện:

Trang 17

PHẦN 2: LỰA CHỌN

Chọn đề tài 5: Kỹ thuật Canny

CƠ SỞ LÝ THUYẾT Biên ảnh:

 Điểm biên: một điểm ảnh được coi là điểm biên nếu có sự thay đổi đột ngột về mức xám Ví dụ: đối với ảnh đen trắng, một điểm được gọi là điểm biên nếu nó là điểm đen có ít nhất một điểm trắng bên cạnh

 Đường biên của đối tượng: được tạo thành bởi một tập các điểm biên liên tiếp

Phương pháp phát hiện biên bằng kỹ thuật Canny:

Giới thiệu:

Mục đích của việc phát hiện biên nói chung là giảm thiểu đáng kể sốlượng dữ liệu trong một hình ảnh, trong khi các đặc tính cấu trúc vẫnđược giữ để sử dụng cho việc xử lý hình ảnh hơn nữa Phương pháp Canny – được phát triển bởi John F Canny (JFC) vào năm 1986, là một trong những công cụ xử lý hình ảnh thông dụng nhất Phương pháp này khá tốt, có khả năng cho ra đường biên mảnh và phát hiệnchính xác điểm biên với điểm nhiễu

Mục tiêu (ràng buộc) của JFC để phát triển thuật toán đó là tối ưu những vấn đề liên quan đến các tiêu chuẩn sau:

 Phát hiện: Xác suất phát hiện những điểm biên thực sự phải là cực đại hóa, trong khi xác suất lỗi phát hiện những điểm

không phải biên cần được giảm thiểu Điều này tương ứng với tối đa hóa tỷ lệ báo hiệu nhiễu

 Cục bộ hóa: Các biên phát hiện nên càng gần biên thực càng tốt Có nghĩa là độ chênh lệch cấp xám giữa các điểm trên cùng một biên càng nhỏ càng tốt

 Số lượng trả lời – hiệu suất: biên không được nhận ra nhiều, trong khi chỉ có một biên tồn tại  giảm số lượng biên được phát hiện không được nhận ra

Chi tiết các bước thực hiện:

1 Làm trơn ảnh:

Nhân chập ảnh với mặt nạ Gauss:

Trang 19

2 Tính Gradient của ảnh bằng cách sử dụng mặt nạ Prewitt hoặc mặt nạ Sobel:

3 Tính độ lớn và hướng của Gradient tại mỗi điểm:

 Tính độ lớn tại mọi điểm: M = √G x2

+G y2

 Tính Gradient hướng tại mọi điểm: θ = tan−1(G y

G x)

4 Tìm cực trị địa phương theo Gradient hướng:

Tại đây tiến hành loại bỏ các biên dư thừa bằng cách: tại mỗi điểm ta xét 2 điểm bên cạnh theo hướng θ đã tính được ở trên Hướng được nguyên hóa để xác định cho 8 điểm xung quanh:

Trang 20

Ví dụ xét điểm M(x, y) có θ(x, y) = 11,6° Vì -22,5 ≤ 11,6 < 22,5 nên hướng sẽ được nguyên hóa về 0° Tại đó xét độ lớn của 3 điểm M(x-1, y), M(x, y) và M(x+1, y) Nếu M(x, y) không nhỏ hơn 2 điểm còn lại thì giữ lại điểm M(x, y) Ngược lại, loại điểm M(x, y) bằng cách chuyển điểm M(x, y) về 0.

 Nếu M(x, y) < T: Loại bỏ điểm biên này (đặt giá trị bằng 0)

 Nếu t ≤ M(x, y) < T: So sánh giá trị M(x,y) với giá trị của các của 8 điểm lân cận Nếu một trong 8 điểm lân cận có giá trị lớn hơn ngưỡng trên T thì đánh dấu và giữ lại điểm biên này Ngược lại thì loại bỏ điểm biên này (đặt giá trị bằng 0)

THỰC HIỆN CÀI ĐẶT THUẬT TOÁN CANNY Ngôn ngữ lập trình: Python 3.6.5

Thư viên hỗ trợ:

Trang 21

matplotlib: hiển thị kết quả.

Trình soạn thảo: Sublime Text 3 ver.3143

Chương trình hoạt động dưới CLI (Windows Powershell/Windows CMD/Terminal):

 Syntax: python canny.py [absolute_image_file_path]

 Example: python canny.py sample1.jpg

for y in range(0, height-m+1):

for x in range(0, width-m+1):

img[y, x] = ((kernel*image[y:y+m, x:x+m]).sum())/div

return img[0:height-m+1, 0:width-m+1]

Hàm thực hiện thuật toán Canny:

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

[0, 0, 0],[1, 2, 1]])print("Smoothing Image ")smImg = convolve(image, gaussian, 5, 159)print("Calculating Gradient x-direction ")

gx = convolve(smImg, sobel_x, 3, 1)

Trang 22

print("Calculating Gradient y-direction ")

for y in range(0, gx.shape[0]):

for x in range(0, gx.shape[1]):

mag[y, x] = np.sqrt(gx[y, x]**2 + gy[y, x]**2)

theta[y, x] = np.arctan2(gy[y, x], gx[y, x]) * 180 / np.pi

res = deepcopy(mag)

print("Calculate Non-maximum Suppression ")

for y in range(1, mag.shape[0]-1):

for x in range(1, mag.shape[1]-1):

if (theta[y, x] >= -22.5 and theta[y, x] <22.5) or (theta[y, x] >= 157.5 or theta[y, x] < -157.5):

if not (mag[y, x] >= mag[y, x+1] and mag[y, x] >= mag[y, x-1]):

res[y, x] = 0elif (theta[y, x] >= 22.5 and theta[y, x]

< 67.5) or (theta[y, x] >= 157.5 and theta[y, x] < 112.5):

-if not (mag[y, x] >= mag[y-1, x+1] and mag[y, x] >= mag[y+1, x-1]):

res[y, x] = 0elif (theta[y, x] >= 67.5 and theta[y, x]

< 112.5) or (theta[y, x] >= 112.5 and theta[y, x] < 22.5):

-if not (mag[y, x] >= mag[y-1, x] and mag[y, x] >= mag[y+1, x]):

res[y, x] = 0else:

if not (mag[y, x] >= mag[y-1, x-1] and mag[y, x] >= mag[y+1, x+1]):

Trang 23

if (res[y+b[i], x+a[i]] > upperT):

return Truereturn False

for y in range(1, mag.shape[0]-1):

for x in range(1, mag.shape[1]-1):

if (res[y, x] >= upperT):

res[y, x] = 255elif (res[y, x] < lowerT):

res[y, x] = 0else:

if (check(x, y) == True):

res[y, x] = 255else:

res[y, x] = 0print("DONE!")

return res

Trang 24

Ảnh gốc:

Kết quả từng bước thực hiện thuật toán:

1 Làm trơn ảnh:

Trang 25

2 Tính Gradient của ảnh bằng cách sử dụng mặt nạ Sobel:

 Kết quả với mặt nạ Sx

 Kết quả với mặt nạ Sy

Trang 26

3 Tính độ lớn và hướng của Gradient tại mỗi điểm:

 Độ lớn Gradient tại các điểm:

 Gradient hướng (minh họa dưới dạng ảnh):

Trang 27

4 Tìm cực trị địa phương theo Gradient hướng:

5 Tách ngưỡng kép:

Ngày đăng: 28/09/2022, 11:21

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w