代码拉取完成,页面将自动刷新
/**
*
* @param {ImageData} imageData
* @param {Number} size 峰值代表背景色,背景色偏移多少个的值0
* @returns
*/
module.exports = function otsu(imageData, size = 2) {
const grayPixelInfo = []; // 每个灰度值的信息的集合 {size: 像素总数, ratio: 概论}
let threshold;
for (i = 0; i < 256; i++) {
grayPixelInfo[i] = { pixelSize: 0, pixelRatio: 0 };
}
const data = imageData.data;
const pixelTotal = data.length;
for (i = 0; i < pixelTotal; i += 4) {
//获取r的像素值,因为灰度图像,r=g=b,所以取第一个即可
const key = data[i];
grayPixelInfo[key].pixelSize++;
}
let imageSize = imageData.width * imageData.height;
let maxPixel = 0;
let maxGray = 0;
for (let i = 0; i < 256; i++) {
if( grayPixelInfo[i].pixelSize > maxPixel){
maxPixel = grayPixelInfo[i].pixelSize;
maxGray = i;
}
}
for(let i = -size ; i <= size; i++){
if(maxGray + i >= 0 && maxGray + i <= 255){
imageSize-=grayPixelInfo[maxGray + i].pixelSize;
grayPixelInfo[maxGray + i].pixelSize = 0;
}
}
for (i = 0; i < 256; i++) {
grayPixelInfo[i].pixelRatio = grayPixelInfo[i].pixelSize / imageSize;
}
// 去掉波峰的值,
let maxVariance = 0;
for (let i = 0; i < 256; i++) {
let probabilityFront = 0;
let probabilityBack = 0;
let avagerGrayFront = 0;
let avagerGrayBack = 0;
grayPixelInfo.slice(0, i).forEach(el => {
probabilityFront += el.pixelRatio;
avagerGrayFront += el.pixelRatio * el.pixelSize
})
grayPixelInfo.slice(i + 1).forEach(el => {
probabilityBack += el.pixelRatio;
avagerGrayBack += el.pixelRatio * el.pixelSize
})
if (probabilityFront === 0 || probabilityBack === 0) {
continue;
}
avagerGrayFront = avagerGrayFront / probabilityFront;
avagerGrayBack = avagerGrayBack / probabilityBack;
const variance = probabilityFront * probabilityBack * (avagerGrayFront - avagerGrayBack) * (avagerGrayFront - avagerGrayBack)
if (variance > maxVariance) {
maxVariance = variance;
threshold = i;
}
}
return{
threshold: threshold,
variance: maxVariance,
histogram: grayPixelInfo,
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。