Skip to content

Instantly share code, notes, and snippets.

@tanmaykm
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tanmaykm/537b3a4e494d0fa0bda1 to your computer and use it in GitHub Desktop.
Save tanmaykm/537b3a4e494d0fa0bda1 to your computer and use it in GitHub Desktop.
simple watershed
using Images, Color, FixedPointNumbers, ImageView
impath = joinpath(Pkg.dir("TestImages"), "images/lena_gray_512.tif")
img = imread(impath);
mask = copy(img);
mask.data[1:end] = 1;
marks = falses(size(img.data));
#view(img)
#view(mask)
tol = 0.15
function reducelevels(img, nlev)
l1 = 0.0
l2 = 0.0
for n in 1:nlev
l1 = l2
l2 = n/nlev
av = (l1+l2)/2
img[l1 .<= img .<= l2] = av
end
nothing
end
function growto(p1, p2, msk, pmsk)
#ret = (abs(p1 - p2) <= tol) || (msk && (avg(pmsk - p2) <= tol))
ret = (p1 >= p2) # || (msk && (pmsk <= p2)) # || (p1 <= (p2-tol)) || (msk && (pmsk <= (p2-tol)))
ret
end
function walk(data, mask, marks, x, y)
visited = falses(size(data))
marked = falses(size(data))
MX,MY = size(data)
cont = true
ref = data[x, y]
while cont
cont = false
ref = data[x, y]
visited[x,y] = marked[x,y] = true
cont2 = true
xS = x
yS = y
for X in (-1, 0, 1)
for Y in (-1, 0, 1)
xX = xS + X
yY = yS + Y
((xX > 0) && (yY > 0) && (xX <= MX) && (yY <= MY)) || continue
visited[xX,yY] && continue
visited[xX,yY] = true
if growto(data[xX,yY], ref, marks[xX,yY], mask[xX,yY])
#println(" -> growing to $xX,$yY. marked: $(marks[xX,yY])")
#if marks[xX, yY]
# ref = mask[xX,yY]
# cont2 = false
# break
#else
x = xX
y = yY
cont = true
ref = data[xX, yY]
#end
end
end
end
end
mask[marked] = ref
marks[marked] = true
nothing
end
#reducelevels(img, 10)
for x in 1:size(img)[1]
for y in 1:size(img)[2]
marks[x,y] || walk(img.data, mask.data, marks, x, y)
end
end
view(mask)
#img = rand(5, 5)
#mask = copy(img)
#mask[1:end] = 1;
#marks = falses(size(img));
#for x in 1:size(img)[1]
# for y in 1:size(img)[2]
# marks[x,y] || walk(img, mask, marks, x, y)
# end
#end
#println(img)
#println(mask)
#function climb(img, x, y)
# data = img.data
# visited = falses(size(data))
#
# maxiter = 512*512
# cont = true
# while cont && (maxiter > 0)
# cont = false
# maxiter -= 1
# ref = data[x, y]
# visited[x,y] = true
#
# for X in (-1, 0, 1)
# for Y in (-1, 0, 1)
# xX = x + X
# yY = y + Y
#
# ((xX > 0) && (yY > 0) && (xX <= 512) && (yY <= 512)) || continue
# visited[xX,yY] && continue
#
# visited[xX,yY] = true
# if data[xX, yY] >= ref
# x = xX
# y = yY
# cont = true
# ref = data[xX, yY]
# end
# end
# end
# end
# (x,y)
#end
#
#function grow(img, mask, x, y)
# data = img.data
# maskdata = mask.data
#
# pipeline = Int[]
# push!(pipeline, x, y)
#
# maxiter = 512*512
#
# while !isempty(pipeline) && (maxiter > 0)
# maxiter -= 1
# x = shift!(pipeline)
# y = shift!(pipeline)
# ref = data[x, y]
# maskdata[x,y] = 0
# println("$x,$y = 0")
#
# for X in (-1, 0, 1)
# for Y in (-1, 0, 1)
# xX = x + X
# yY = y + Y
# ((xX > 0) && (yY > 0) && (xX <= 512) && (yY <= 512)) || continue
# (maskdata[xX, yY] == gray(1)) || continue
# println("checking $xX,$yY... maskdata: $(maskdata[xX, yY])")
# if data[xX, yY] <= ref
# maskdata[xX, yY] = 0
# println("$xX,$yY = 0")
# push!(pipeline, xX, yY)
# #grow(img, mask, xX, yY)
# else
# maskdata[xX, yY] = 0.5
# println("$x,$y = 0.5")
# end
# end
# end
# end
# nothing
#end
#
##grow(img, mask, beginat[1], beginat[2])
#grow(img, mask, 493, 345)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment