5月29日 01:19

OpenCV.js 中常用的图像处理操作有哪些?

OpenCV.js 常用的图像处理操作涵盖颜色转换、滤波、边缘检测、几何变换和阈值处理五大类。核心 API 包括:cv.cvtColor() 做颜色空间转换(如 RGBA2GRAY),cv.GaussianBlur() 和 cv.medianBlur() 做图像平滑,cv.Canny() 做边缘检测,cv.resize() 和 cv.warpAffine() 做几何变换,cv.threshold() 和 cv.adaptiveThreshold() 做二值化。所有操作前需通过 cv.imread() 从 canvas 读取图像,处理后用 cv.imshow() 输出,且每个 cv.Mat 对象必须手动调用 .delete() 释放内存。

追问

cv.cvtColor() 中 RGBA2GRAY 和 RGB2GRAY 有什么区别? 浏览器 canvas 默认输出 RGBA 四通道,所以用 cv.imread() 读到的图像必须用 COLOR_RGBA2GRAY 而非 COLOR_RGB2GRAY,否则通道数不匹配会报错。

高斯模糊的核大小为什么必须是奇数? 奇数核保证高斯函数有明确的中心点,OpenCV 强制要求 ksize 的宽高都为正奇数,否则抛异常。核越大模糊越强,但计算量也越大。

cv.threshold() 和 cv.adaptiveThreshold() 分别适合什么场景? 全局阈值适合光照均匀的图像,自适应阈值适合光照不均的场景(如阴影下的文档),后者对每个像素根据邻域计算局部阈值。

形态学操作中开运算和闭运算的区别是什么? 开运算(先腐蚀后膨胀)去除小噪点,闭运算(先膨胀后腐蚀)填充小孔洞,选择取决于目标是去噪还是补洞。

为什么 OpenCV.js 中 Mat 对象必须手动 delete? OpenCV.js 通过 WebAssembly 在堆上分配内存,JavaScript 的 GC 无法回收 WASM 堆内存,不 delete 就会造成内存泄漏,视频处理循环中尤其致命。

写段代码

javascript
let src = cv.imread('canvasInput'); let gray = new cv.Mat(), dst = new cv.Mat(); cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY); cv.GaussianBlur(gray, gray, new cv.Size(5, 5), 0); cv.Canny(gray, dst, 50, 100); cv.imshow('canvasOutput', dst); src.delete(); gray.delete(); dst.delete();
标签:Opencv.js