Zhang-Suen thinning algorithm: Difference between revisions

m
no edit summary
mNo edit summary
Line 2,119:
# ############
### ### </pre>
 
 
=={{header|Julia}}==
<lang julia>
const pixelstring =
"00000000000000000000000000000000" *
"01111111110000000111111110000000" *
"01110001111000001111001111000000" *
"01110000111000001110000111000000" *
"01110001111000001110000000000000" *
"01111111110000001110000000000000" *
"01110111100000001110000111000000" *
"01110011110011101111001111011100" *
"01110001111011100111111110011100" *
"00000000000000000000000000000000"
const pixels = reshape([UInt8(c- 48) for c in pixelstring], (32,10))'
 
 
function surroundtesting(px, i, j, step)
if px[i,j] == 0
return false
end
isize, jsize = size(px)
if i < 1 || j < 1 || i == isize || j == jsize
return false
end
s = Array{Int,1}(9)
s[1] = s[9] = px[i-1,j]; s[2] = px[i-1,j+1]; s[3] = px[i,j+1]; s[4] = px[i+1,j+1]
s[5] = px[i+1,j]; s[6] = px[i+1,j-1]; s[7] = px[i,j-1]; s[8] = px[i-1,j-1]
b = sum(s[1:8])
if b < 2 || b > 6
return false
end
if sum([(s[i] == 0 && s[i+1] == 1) for i in 1:length(s)-1]) != 1
return false
end
if step == 1
rightwhite = s[1] == 0 || s[3] == 0 || s[5] == 0 # 1.3
downwhite = s[3] == 0 || s[5] == 0 || s[7] == 0 # 1.4
return rightwhite && downwhite
end
upwhite = s[1] == 0 || s[3] == 0 || s[7] == 0 # 2.3
leftwhite = s[1] == 0 || s[5] == 0 || s[7] == 0 # 2.4
return upwhite && leftwhite
end
 
 
function zsthinning(mat)
retmat = copy(mat)
testmat = zeros(Int, size(mat))
isize, jsize = size(testmat)
needredo = true
loops = 0
while(needredo)
loops += 1
println("loop number $loops")
needredo = false
for i in 1:isize, j in 1:jsize
testmat[i,j] = surroundtesting(retmat, i, j, 1) ? 1 : 0
end
for i in 1:isize, j in 1:jsize
if testmat[i,j] == 1
retmat[i,j] = 0
needredo = true
end
end
for i in 1:isize, j in 1:jsize
testmat[i,j] = surroundtesting(retmat, i, j, 2) ? 1 : 0
end
for i in 1:isize, j in 1:jsize
if testmat[i,j] == 1
retmat[i,j] = 0
needredo = true
end
end
end
retmat
end
 
 
function asciiprint(mat)
for i in 1:size(mat)[1]
println(join(map(i -> i == 1 ? '#' : ' ', mat[i,:])))
end
end
 
 
asciiprint(zsthinning(pixels))
{{output}}<pre>
loop number 1
loop number 2
loop number 3
 
####### ######
# # ##
# # #
# # #
##### # #
## #
# # ## ## #
# ####
</pre>
 
=={{header|Kotlin}}==
4,102

edits