Lo que se ve a simple vista es que te convierte de un conjunto de puntos a una paleta de 16 colores.
Con el AND lo que haces conocer si el punto está prendido o apagado, en cada vuelta puedes procesar una región o ventana conformada por una matriz de 4x16 puntos.
Así que, aunque los operadores bitwise sean interesantes, es más interesante el algoritmo que hay detrás del trabajo de procesamiento de imágenes.
A menos que que cada punto físico original esté conformado por 4 puntos más pequeños, si lo vemos como un filtro, aparte de convertir de unos puntos cualquiera a una paleta de colores, al realizar una combinación de los puntos que son adyacentes al punto que quieres convertir a pixel, generas mejores los contornos y suavizas la imagen resultante. Pero los puntos adyacentes pueden ser cualquiera. Por ejemplo, estos podrían ser los cuatro puntos que se encuentran alrededor del punto a convertir, y es lo más común.
1
0 p 2
3
Pero también podrían tomar cualquier otro forma como algunos de los puntos que se encuentran arriba y abajo, del punto a convertir.
0
1
2
3
1
2
3
4
2
3
4
5
...
Hablando de procesamiento digital de imágenes, a lo de arriba se le conoce como kernel y te indica las operaciones que vas a realizar y sobre cuales pixeles los vas realizar. Por ejemplo hay un filtro conocido como Sobel, el cual se usa para detectar bordes en imágenes, y su kernel toma la siguiente forma
X
+1 0 -1
+2 0 -2
+1 0 -1
Y
+1 +2 +1
0 0 0
-1 -2 -1
En tu caso el kernel podría ser
+4
+4 p +4
+4
Y aplicas ese kernel a tu imagen (formada por puntos prendidos y apagados) por medio de un operador conocido como Convolución, con lo cual obtienes lo que deseas, ya sea suavizar bordes, extraer objetos, quitar o aplicar ruido, etc.