let floyd_steinberg matrix (width, height) style = (*We convert the image in grey level according to style*) let new_matrix = grey matrix (width, height) style and old_color = ref 0 and new_color = ref 0 and error = ref 0 in for i = 1 to width - 2 do for j = 1 to height - 2 do (*We save the color of the current pixel*) old_color := get_r new_matrix.(i).(j); if !old_color > 127 then new_color := 255 else new_color := 0; (*We replace the current pixel by the new color*) new_matrix.(i).(j) <- (!new_color, !new_color, !new_color); (*We calculate the error value that will be distributed to the neighboring pixels*) error := !old_color - !new_color; let color1 = fix_rgb (get_r new_matrix.(i + 1).(j) + iof (0.4375 *. foi !error)) and color2 = fix_rgb (get_r new_matrix.(i - 1).(j + 1) + iof (0.1875 *. foi !error)) and color3 = fix_rgb (get_r new_matrix.(i).(j + 1) + iof (0.3125 *. foi !error)) and color4 = fix_rgb (get_r new_matrix.(i + 1).(j + 1) + iof (0.0625 *. foi !error)) in new_matrix.(i+1).(j) <- (color1, color1, color1); new_matrix.(i-1).(j+1) <- (color2, color2, color2); new_matrix.(i).(j+1) <- (color3, color3, color3); new_matrix.(i+1).(j+1) <- (color4, color4, color4); done; done; new_matrix