How can I optimize my Von Neumann neighborhood algorithm?
Set vs. dict
So far as I can tell, you aren't really using the value in is_counted, so it is better represented as a set than a dictionary. Also, it shouldn't be global - this prevents re-entrance and hampers testing; instead, make it a return value of find_von_neumann, merged in turn into another set in populate_dict that is returned.
Iteration
This is both very dense and re-executes a number of things that can be pre-computed:
    for i in range(curr_i + min((-n), rows), curr_i + min((n + 1), rows)):
        for j in range(curr_j + min((-n), cols), min(curr_j + (n + 1), cols)):
  

instead consider something like
i0 = curr_i + min((-n), rows)
i1 = curr_i + min((n + 1), rows)
j0 = curr_j + min((-n), cols)
j1 = min(curr_j + (n + 1), cols)

for i in range(i0, i1):
    for j in range(j0, j1):

Combined inequalities
You did the right thing here:
n &gt;= dist &gt;= -n

though I would find it more intuitive as
-n &lt;= dist &lt;= n

You should do the same for i and j:
0 &lt;= i &lt; rows and 0 &lt;= j &lt; cols