当前位置:首页 > JavaScript

js实现ostu

2026-02-02 08:44:53JavaScript

实现Otsu算法的JavaScript代码

Otsu算法是一种用于图像二值化的自动阈值选择方法,通过最大化类间方差来确定最佳分割阈值。以下是JavaScript实现:

function otsuThreshold(imageData) {
    const pixels = imageData.data;
    const histogram = new Array(256).fill(0);

    // 计算灰度直方图
    for (let i = 0; i < pixels.length; i += 4) {
        const r = pixels[i];
        const g = pixels[i + 1];
        const b = pixels[i + 2];
        const gray = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
        histogram[gray]++;
    }

    const totalPixels = pixels.length / 4;
    let sum = 0;
    for (let t = 0; t < 256; t++) {
        sum += t * histogram[t];
    }

    let sumB = 0;
    let wB = 0;
    let wF = 0;
    let maxVariance = 0;
    let threshold = 0;

    for (let t = 0; t < 256; t++) {
        wB += histogram[t];
        if (wB === 0) continue;

        wF = totalPixels - wB;
        if (wF === 0) break;

        sumB += t * histogram[t];

        const mB = sumB / wB;
        const mF = (sum - sumB) / wF;

        const variance = wB * wF * (mB - mF) * (mB - mF);
        if (variance > maxVariance) {
            maxVariance = variance;
            threshold = t;
        }
    }

    return threshold;
}

使用示例

// 从canvas获取图像数据
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);

// 计算Otsu阈值
const threshold = otsuThreshold(imageData);

// 应用阈值进行二值化
const binaryData = new ImageData(imageData.width, imageData.height);
for (let i = 0; i < imageData.data.length; i += 4) {
    const gray = 0.299 * imageData.data[i] + 
                0.587 * imageData.data[i + 1] + 
                0.114 * imageData.data[i + 2];
    const value = gray > threshold ? 255 : 0;
    binaryData.data[i] = value;
    binaryData.data[i + 1] = value;
    binaryData.data[i + 2] = value;
    binaryData.data[i + 3] = 255;
}

// 显示二值化结果
ctx.putImageData(binaryData, 0, 0);

算法说明

Otsu方法通过计算每个可能阈值的类间方差,选择使方差最大的阈值作为最佳分割点。类间方差计算公式为:

σ² = w₀ w₁ (μ₀ - μ₁)²

其中w₀和w₁分别是前景和背景像素的比例,μ₀和μ₁是前景和背景的平均灰度值。

性能优化

对于大图像,可以采样部分像素计算直方图以提高速度:

js实现ostu

// 采样间隔
const step = 4;
for (let i = 0; i < pixels.length; i += 4 * step) {
    // 计算灰度值并更新直方图
}

该方法适用于各种需要自动阈值分割的图像处理应用,如文档扫描、物体识别等场景。

标签: jsostu
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…