Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement