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 1HÀ NỘI – 2018
Trang 2for 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 42 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 53 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 64 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 75 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 96 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 11for 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 12Hà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 13for 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 14for 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 15for 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 16for 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 17PHẦ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 192 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 20Ví 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 22print("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 23if (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 252 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 263 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 274 Tìm cực trị địa phương theo Gradient hướng:
5 Tách ngưỡng kép: