Creo que ya lo tengo :)
Siguiendo con la idea del canvas (es lo que conozco y sé que funciona bien) y buscando una librería que me haga el trabajo sucio de convertir entre RGB y CMYK he conseguido esto:
http://jsfiddle.net/vfportero/RTtda/
En el ejemplo puedes ver que al pulsar el botón se buscan todos los píxeles azules y los pinta en negro (similar a lo que me preguntabas).
Este es el código:
function paintItBlack(){
var imgData= context.getImageData(0,0,canvas.width,canvas.height);
for (var i=0;i<imgData.data.length;i+=4) {
var cmyk = ColorConverter.toCMYK(new RGB(imgData.data,imgData.data[i+1],imgData.data[i+2]));
if(cmyk.c == 100 && cmyk.m == 100 && cmyk.y == 0 && cmyk.k == 0){
cmyk.y = 100;
cmyk.k = 100;
}
var rgb = ColorConverter.toRGB(cmyk);
imgData.data = rgb.r;
imgData.data[i+1] = rgb.g;
imgData.data[i+2] = rgb.b;
}
context.putImageData(imgData,0,0);
}
Obtengo los datos de la imagen con el método "getImageData" y me recorro cada pixel (el for va de 4 en 4 ya que el array nos devuelve los valores RGB y alpha en una posición por lo que los datos del píxel 2 empiezan en la posición 4 del array).
Convierto (con el script que te he comentado antes: http://www.webtoolkit.info/javascript-color-conversion.html) de RGB a cmyk y compruebo si los valores de cyan y magenta son 100 mientras que los de amarillo y negro son 0. Con esto obtenemos los píxeles azules.
En tal caso los ponemos a 100 también (todo 100 es negro como bien sabes) y, una vez recorridos todos, ponemos la imagen alterada de nuevo en el canvas con el método "putImageData".
Así que listo, ya tenemos nuestra casita pintada de negro.
Espero que te sea útil.
Saludos!