矩阵的掩码操作
根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响。从数学观点看,我们用自己设置的权值,对像素邻域内的值做了个加权平均。
对图像的每个像素应用下面的公式:
即:每个像素 = 该像素*5 - 相邻上下左右的像素的和
原始算法按照这个公式边界值是计算不了的,因为会访问到旁边不存在的元素,需要将边界元素设置成 0
那么,图像矩阵经过这个操作后会发生什么呢?
假设中间像素是很亮的话,显然经过运算会更亮。中间元素亮度低的话,经过运算就会更暗。因此经过这个运算后图像对比度会增强,亮的更亮,暗的更暗
下面的函数就是将原图像和掩码矩阵进行卷积运算
Mat.filter2D(ddepth: number, kernel: Mat, anchor?: Point2, delta?: number, borderType?: number): Mat
const cv = require("opencv4nodejs");
const input = cv.imread("../../data/Lenna.png");
// 掩码矩阵
// 必须是单通道浮点型矩阵
const kernel = new cv.Mat([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], cv.CV_32FC1);
const output = input.filter2D(input.depth, kernel);
cv.imshow("input", input);
cv.imshow("output", output);
cv.waitKey();
函数参数解释
- ddepth 图像深度
- kernel 卷积核(或者是相关核),一个单通道浮点型矩阵。如果想在图像不同的通道使用不同的 kernel,可以先使用
split
函数将图像通道事先分开。 - anchor 内核的基准点(anchor),其默认值为(-1,-1)说明位于 kernel 的中心位置。基准点即 kernel 中与进行处理的像素点重合的点。
- delta 在储存目标图像前可选的添加到像素的值,默认值为 0
- borderType 像素向外逼近的方法,默认值是 BORDER_DEFAULT,即对全部边界进行计算。
tips:
- 卷积运算理解