I agree with @maRtin, it's a bit tricky. Not only don't you have a dedicated NoData value, but also the image is a bit smudgy.
Nevertheless, I think I found a way which is a bit better than clump
, which uses the spatial domain to separate the areas:
First, I'm getting the focal values of the pixel neighbourhoods:
#make copy
r2 <- r
# focal values
fv <- getValuesFocal(r2,ngb = c(3,3))
Then I I first I exclude all pixels, which have a neighbourhood value of greater than 242.8. This was purely trial and error, but it gives a good result.
ix <- rowMeans(fv,na.rm = T) > 242.8
r2[ix] <- NA
You could actually already deem this acceptable. The only problem is, that there is a small border around the value area which should be NA.

So somehow I need to get rid of the remaining NA pixels. This I try to do with an iterative exclusion. For every iteration, I see if there's pixels which have still NA values around and a max value lower than a certain threshold. Again, there's a lot of playing around involved and I guess you could achieve a better result than this, but I guess this would be a way to go.
while (TRUE){
fv <- getValuesFocal(r2,ngb = c(3,3))
ix <- apply(fv,1,function(x) max(x,na.rm=T)) > 243 & rowSums(is.na(fv)) > 0
if (any(ix)){
r2[ix] <- NA
} else {
break
}
}
After a couple of iterations, I get this:

There are clearly already some pixels gone which shouldn't be, maybe it could be done with a bit more fiddling around.
Another interesting thought would be looking at all three channels. If you load the image with brick
, you can get the RGB channels. I've tried a few things like max, mean, mode, sd, etc. but to no avail.