Uma forma de obter uma imagem binária é usar a distribuição de erro de Jarvis. Semelhante à abordagem de Floyd-Steinberg, a difusão do erro é produzida através da seguinte máscara:


$$
\begin{array}{| c | c | c | c| c |}
\hline
0 & 0 & 0 & 0 & 0 \\ \hline
0 & 0 & 0 & 0 & 0 \\ \hline
0 & 0 & f(x,y) & 7/48 & 5/48 \\ \hline
3/48 & 5/48 & 7/48 & 5/48 & 3/48 \\ \hline
1/48 & 3/48 & 5/48 & 5/48 & 1/48 \\ \hline
\end{array}
$$

O algoritmo de halftoning que utiliza a difusão de erro de Jarvis, Judice e Ninke é efetuado pela seguinte função:

def jarvis(originalImage):
    ''' Original Jarvis Dithering Algorithm.

    dithered = jarvis(originalImage)

    Parameters
    ----------
    originalImage: numpy ndarray, original image

    Return
    ----------
    dithered: numpy ndarray, dithered image

    References
    ----------
    J.Jarvis, C.Judice, and W.Ninke, ``A survey of techniques for the
    display of continuous tone pictures on bilevel displays,''
    em Comp. Graph and Image  Proc., vol.~5, pp.~13--40, 1976.

    Written by Pedro Garcia Freitas [sawp@sawp.com.br]
    Copyright 2010 by Pedro Garcia Freitas

    see: http://www.sawp.com.br
    '''
    (M, N) = originalImage.shape
    threshold = 127.5
    tmp = originalImage.copy()
    error = 0

    super = 127.5 * ones((M, 2))
    infer = 127.5 * ones((2, N + 4))
    tmp = concatenate((super, tmp, super), axis=1)
    tmp = concatenate((tmp, infer))
    dithered = tmp.copy()

    for row in xrange(M):
        for col in xrange(2, N + 2):
            dithered[row, col] = 255.0 * int(tmp[row, col] >= threshold)
            error = - dithered[row, col] + tmp[row, col]

            tmp[row, col + 2] = 0.10417 * error + tmp[row, col + 2]
            tmp[row, col + 1] = 0.14583 * error + tmp[row, col + 1]

            tmp[row + 1, col + 2] = 0.0625 * error + tmp[row + 1, col + 2]
            tmp[row + 1, col + 1] = 0.10417 * error + tmp[row + 1, col + 1]
            tmp[row + 1, col + 0] = 0.14583 * error + tmp[row + 1, col + 0]
            tmp[row + 1, col - 1] = 0.10417 * error + tmp[row + 1, col - 1]
            tmp[row + 1, col - 2] = 0.0625 * error + tmp[row + 1, col - 2]

            tmp[row + 2, col + 2] = 0.02083 * error + tmp[row + 2, col + 2]
            tmp[row + 2, col + 1] = 0.0625 * error + tmp[row + 2, col + 1]
            tmp[row + 2, col + 0] = 0.10417 * error + tmp[row + 2, col + 0]
            tmp[row + 2, col - 1] = 0.0625 * error + tmp[row + 2, col - 1]
            tmp[row + 2, col - 2] = 0.02083 * error + tmp[row + 2, col - 2]
    return dithered[0:M, 2:N + 2]

A partir desta implementação, obtemos os seguintes resultados:

</p>
Original (entrada)
Halftoned (saída)

</center>