Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

Thuật toán làm mỏng Zhang-Suen

Giới thiệu thuật toán :


Thuật toán lần đầu tiên được mô tả vào năm 1984 bởi T. Zhang và C. Suen trong
Hiệp hội truyền thông Máy tính có tiêu đề “Một thuật toán song song nhanh để làm
mỏng các mẫu kỹ thuật số”). Thuật toán này đựợc sử dụng nhờ một nền tảng
cơ sở cho việc so sánh các thuật toán làm mảnh trong nhiều năm, bởi tính ưu việt
của thuật toán Zhang-Suen là một thuật toán nhanh, đơn giản khi thực hiện.
Thuật toán Zhang-Suen là một phương pháp song song thuộc lớp các thuật toán làm
mảnh song song, có nghĩa là giá trị mới cho bất kỳ điểm ảnh nào có thể được tính
toán chỉ dùng các giá trị đã biết từ trong vòng lặp ngay trước đó mà không cần
quan tâm đến các giá trị ở các vòng lặp trước nữa .
Mô tả thuật toán:
Thuật toán này được sử dụng để làm mỏng hình ảnh nhị phân. Hai bước sẽ được áp
dụng liên tiếp cho hình ảnh.
Ở đây, hãy sắp xếp tám láng giềng của P1 theo thứ tự chiều kim đồng hồ:
P9 P2 P3
P8 P1 P4
P7 P6 P5
Xác định N (P1) = số lân cận pixel không phải zore của P1 (= sum (P2 .. P9))
Xác định S (P1) = số lần chuyển đổi từ 0 sang 1, (0 -> 1) trong chuỗi P2, P3, ...,
P8, P9, P2.

Giả sử S (P1) là chữ số của mẫu mà nó chuyển từ một sang 0 hay 0 tới 1 trong tập
hợp của ( P2, P3, P8, P9, P2) của lân cận P1 thì điểm P1 sẽ bị xóa trong ảnh. Để
giữ những tiêu chuẩn, một số quy tắc cần phải đƣợc phát biểu. Trong sự lặp đi lặp
lại, tập hợp của những điểm khác không P thỏa mãn những điều kiện sau đây:
i. S (Pi) =1; ii. 2 ≤ N (Pi) ≤ 6;
iii. P2 * P4 * P6 = 0, iv. P4 * P6 * P8 = 0,
Xóa đường song song từ bất kỳ ảnh nhị phân nào.
Chứng minh
Điều kiện thực hiện vòng lặp ii) phải tồn tại từ 2  6 những được chọn trong vùng lân cận
của điểm P thì sẽ xóa được.
Điều kiện i. thực hiện khi nó chuyển từ 0 -> 1. trong những lân cận của điểm ảnh
đó. Điều này tương ứng có một số khác không trong những đi ể m x1,.., x8 trong
khi còn lại bảy điểm có thể là tất cả chữ số không (0) hay bốn trong số họ là khác
không
Cơ bản của vấn đề này: tập hợp N(P) nằm giữa khoản từ 2 ->6 mà những điểm
khác không trong 4 kết nối đó, thí dụ: tất cả những cặp có thể xảy ra của những
điểm này được kết nối bởi 4 láng giềng, tất cả những điểm có thể sảy ra ở 4 kết nối
đó .Nhờ vậy P không có điểm gãy nào. Từ toàn bộ những điểm khác không của tập
hợp P thỏa mãn những điều kiện i và ii.
Với những điều này thì hai chiều rộng của điểm ảnh hoàn toàn biến mất. Khó
khăn này không thể được giải quyết khi sử dụng những điều kiện i và ii
. Để khắc phục điều này thì điều kiện iii. và iv. được kiểm tra và nếu được tìm
thấy thì điểm trung tâm được cất giữ, hay tất cả các điểm khác không P thỏa
mãn những điều kiện iii. và iv. thì bị xóa trong thuật toán song song này. Minh
họa sự lặp đi lặp lại cho y:
Trong sự lặp đi lặp lại ii, tập hợp những điểm khác không P thỏa mãn
những điều kiện sau đây:
v. S (Pi) = 1,
vi. 3 ≤ N (Pi) ≤ 6,
vii. P2 *P4 *P6 = 0, viii. P4 * P6 * P8 = 0,
Xóa bất kỳ ảnh nhị phân nào trong thuật toán song
song Theo sự lặp đi lặp lại:
Vi. qui định ở đó tồn tại từ ba tới sáu điểm khác không trong khu lân cận
của P xóa bỏ đi.
V. có nghĩa rằng có một chữ số 0 tới 1 (0-1 hay tương đương 1-0) trong
vùng lân cận của P. Ta đi xét tập hợp N(P) nằm giữa khoản từ 2 ->6 mà những
điểm khác không trong 4 kết nối đó, thí dụ, tất cả những cặp có thể xảy ra của
những điểm này được nối gần 4- những đường dẫn, tất cả những điểm có thể
sảy ra ở 4 kết nối đó. Nhờ vậy P ko có điểm gãy nào. Điều kiện để xóa điểm
ảnh là toàn bộ những điểm đen của tập hợp P thỏa mãn V. vấn đề là P tạo ra 1
vùng nhớ để lưu trữ những điểm mà không thỏa mãn điều kiện V này
X 1 X X X X
X Pi 1 1 Pi 1
X 1 X X 1 X

Bước 1:

Đối với bước này, sẽ tìm kiếm các pixel P1 đáp ứng năm điều kiện. Nếu pixel P1
đáp ứng năm điều kiện, nó sẽ được đặt thành màu trắng. Các pixel sẽ được đặt
thành màu trắng sau khi tất cả các pixel đủ điều kiện trong hình ảnh đã được định
vị, nếu không sẽ không có sự hội tụ trên một mảng mỏng.
1. Pixel có màu đen (P1 = 1) và có tám vùng lân cận (không có pixel ở đường
viền hoặc ở góc).
2. Số điểm ảnh đen lân cận của P1 là ít nhất 2 và không lớn hơn 6. Nghĩa là, 2
<= B (P1) <= 6.
3. Số chuyển đổi từ trắng sang đen xung quanh P1 bằng 1. Tức là, A (P1) = 1.
4. Ít nhất một trong số P2, P4 hoặc P6 có màu trắng (bằng 0).
5. Ít nhất một trong các P4, P6 hoặc P8 có màu trắng (bằng 0).
Tất cả các pixel P1 đáp ứng năm tiêu chí trên được đặt thành màu trắng (0)
changing1 = []
rows, columns = Image_Thinned.shape
for x in range(1, rows - 1):
for y in range(1, columns - 1):
P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)
if (Image_Thinned[x][y] == 1 and
2 <= sum(n) <= 6 and
transitions(n) == 1 and
P2 * P4 * P6 == 0 and
P4 * P6 * P8 == 0):
changing1.append((x,y))
for x, y in changing1:
Image_Thinned[x][y] = 0

Bước 2:

Ba phần đầu tiên của bước hai giống hệt với bước một. Phần bốn và năm thay đổi
một chút - P6 được đổi thành P8 trong phần bốn, và P4 được đổi thành P2 trong
phần năm.
1. (giống như bước một)
2. (giống như bước một)
3. (giống như bước một)
4. Ít nhất một trong số P2, P4 hoặc P8 có màu trắng (bằng 0).
5. Ít nhất một trong số P2 , P6 hoặc P8 có màu trắng (bằng 0).
Một lần nữa, tất cả các pixel P1 đáp ứng năm tiêu chí này được đặt thành màu
trắng (0), nhưng chỉ sau khi các pixel đáp ứng tiêu chí đã được ghi chú.
changing2 = []
for x in range(1, rows - 1):
for y in range(1, columns - 1):
P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)
if (Image_Thinned[x][y] == 1 and
2 <= sum(n) <= 6 and
transitions(n) == 1 and
P2 * P4 * P8 == 0 and
P2 * P6 * P8 == 0):
changing2.append((x,y))
for x, y in changing2:
Image_Thinned[x][y] = 0
return Image_Thinned

Lặp lại:

Nếu bất kỳ pixel nào được đặt trong vòng này của bước 1 hoặc bước 2 thì tất cả
các bước được lặp lại cho đến khi không có pixel hình ảnh nào bị thay đổi. Điều
cuối cùng cần lưu ý đối với thuật toán này là trong mỗi bước, việc xóa các điểm đã
lưu ý phải được trì hoãn cho đến khi tất cả các pixel của hình ảnh đã được truy cập
để tránh thay đổi pixel của hình ảnh trong mỗi bước.

Code :
import matplotlib
import matplotlib.pyplot as plt
import skimage.io as io

Img_Original = io.imread( './data/test3.bmp')


from skimage.filters import threshold_otsu
Otsu_Threshold = threshold_otsu(Img_Original)
BW_Original = Img_Original < Otsu_Threshold
def neighbours(x,y,image):
"Trả về 8 lân cận của điểm hình ảnh P1 (x, y), theo thứ tự chiều kim đồng
hồ"
img = image
x_1, y_1, x1, y1 = x-1, y-1, x+1, y+1
return [ img[x_1][y], img[x_1][y1], img[x][y1], img[x1][y1], #
P2,P3,P4,P5
img[x1][y], img[x1][y_1], img[x][y_1], img[x_1][y_1] ] #
P6,P7,P8,P9

def transitions(neighbours):
"Số 0,1 mẫu (chuyển đổi từ 0 sang 1) trong trình tự có thứ tự"
n = neighbours + neighbours[0:1] # P2, P3, ... , P8, P9, P2
return sum( (n1, n2) == (0, 1) for n1, n2 in zip(n, n[1:]) ) # (P2,P3),
(P3,P4), ... , (P8,P9), (P9,P2)

def zhangSuen(image):
"thuật toán làm mỏng Zhang-Suen"
Image_Thinned = image.copy()
changing1 = changing2 = 1
while changing1 or changing2:
# Step 1
changing1 = []
rows, columns = Image_Thinned.shape
for x in range(1, rows - 1):
for y in range(1, columns - 1):
P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)
if (Image_Thinned[x][y] == 1 and
2 <= sum(n) <= 6 and
transitions(n) == 1 and
P2 * P4 * P6 == 0 and
P4 * P6 * P8 == 0):
changing1.append((x,y))
for x, y in changing1:
Image_Thinned[x][y] = 0
# Step 2
changing2 = []
for x in range(1, rows - 1):
for y in range(1, columns - 1):
P2,P3,P4,P5,P6,P7,P8,P9 = n = neighbours(x, y, Image_Thinned)
if (Image_Thinned[x][y] == 1 and
2 <= sum(n) <= 6 and
transitions(n) == 1 and
P2 * P4 * P8 == 0 and
P2 * P6 * P8 == 0):
changing2.append((x,y))
for x, y in changing2:
Image_Thinned[x][y] = 0
return Image_Thinned

BW_Skeleton = zhangSuen(BW_Original)
# BW_Skeleton = BW_Original
fig, ax = plt.subplots(1, 2)
ax1, ax2 = ax.ravel()
ax1.imshow(BW_Original, cmap=plt.cm.gray)
ax1.set_title('Hình ảnh nhị phân gốc')
ax1.axis('off')
ax2.imshow(BW_Skeleton, cmap=plt.cm.gray)
ax2.set_title('Bộ xương của hình ảnh')
ax2.axis('off')
plt.show()
Kết quả :

You might also like