邏輯原理:async
一、找出圖片種最多的一種顏色,將它的類似顏色和它分類成0;ui
二、找出剩下的顏色種的最多一種顏色,將它的類似顏色和它分類成1;code
三、找出剩下的顏色種的最多一種顏色,將它的類似顏色和它分類成2;blog
若是類別限制爲maxTagNum,將剩下的顏色都分類成maxTagNum圖片
const getPixels = require("get-pixels")function getPixelsSync(filename){ return new Promise(function (resolve,reject) { getPixels(filename, function(err, pixels) { if(err) { console.log("Bad image path") reject(err) return } resolve(pixels) }) })}const {Matrix,Fraction,Point,Line} = require("./utils/math");function getColor(x,y,pixels) { return [ pixels.data[x*4+y*4*pixels.shape[0]], pixels.data[x*4+1+y*4*pixels.shape[0]], pixels.data[x*4+2+y*4*pixels.shape[0]], pixels.data[x*4+3+y*4*pixels.shape[0]] ]}function isNearColor(color1,color2){ if((Math.abs(color1[0]-color2[0])+Math.abs(color1[1]-color2[1])+Math.abs(color1[2]-color2[2])+Math.abs(color1[3]-color2[3]))<75){ return 1; } return 0;}//將顏色分紅多少種 maxTagNum是限制最大多少種function sortMatColor(mat1,maxTagNum){ function sortColor(num) { let map={} let maxKey; mat1.rowEach(function (item,r,c) { if(typeof item==="number"){return;} const key=item.join(',') if(map[key]===undefined){ map[key]=0; } map[key]++; if(!maxKey){ maxKey=key; }else if(map[maxKey]<map[key]){ maxKey=key; } }) let bgColor=maxKey.split(',').map((item)=>parseInt(item)); let running=false; mat1.rowMap(function (item,r,c) { if(typeof item==="number"){return item;} if(maxTagNum-1<=num||isNearColor(item,bgColor)){ return num; }else{ running=true; return item; } }) if(running){ return sortColor(num+1); } return num+1; } return sortColor(0);}async function init() { const pixels=await getPixelsSync('1.jpg'); console.log(pixels) const [w,h]=pixels.shape; //1定義矩陣 const mat1=new Matrix([],h,w); mat1.rowMap(function (item,r,c) { return getColor(c,r,pixels); }) console.log(sortMatColor(mat1,3)) //生產0、一、2種顏色類別 console.log(mat1.toString())}init()// scanRound(0,0,100,100,function (x,y) {// return 1;// },function (x,y) {// console.log(x,y);// })