OpenCV Android:如何实现iOS代码中的1-morph操作?
回答:Java OpenCV中实现
1 - morph的方法及与inv()的区别 首先咱们先明确你iOS代码里1 - morph的本质:它是对矩阵morph的**每个像素值执行「1减去该值」**的逐元素操作,这通常是在morph的像素值归一化到[0, 1]区间(比如CV_32F浮点型矩阵)时才会这么写。接下来分情况讲Java里的实现方式,以及和inv()的关系:
一、直接等价的场景:当morph是浮点型(CV_32F)且值在[0,1]
如果你的morph是浮点型矩阵,并且每个像素值都在0到1之间,那么morph.inv()确实和1 - morph效果完全一致。因为OpenCV中,浮点型矩阵的inv()方法就是对每个元素计算1.0f - pixelValue。
这时候你可以直接写:
Mat oneMinusMorph = new Mat(); morph.inv(oneMinusMorph); // 然后执行相乘操作 Mat mask = new Mat(); Core.multiply(myMask, oneMinusMorph, mask);
二、通用实现方式(适配所有矩阵类型)
如果morph不是浮点型(比如常见的CV_8U,像素值0-255),或者你想确保逻辑和iOS代码完全对齐,更稳妥的方式是用Core.subtract()来手动计算「1减去morph」:
// 1. 创建一个和morph尺寸、类型完全一致的全1矩阵 Mat onesMat = Mat.ones(morph.size(), morph.type()); // 2. 计算 onesMat - morph,得到1 - morph的结果 Mat oneMinusMorph = new Mat(); Core.subtract(onesMat, morph, oneMinusMorph); // 3. 和myMask相乘 Mat mask = new Mat(); Core.multiply(myMask, oneMinusMorph, mask);
这种方式不管morph是浮点型还是整数型都能正确工作——比如CV_8U类型时,onesMat的元素是255,subtract后就是255 - pixelValue,这其实是整数版的「1减去归一化值」(因为255对应归一化的1)。
关键注意点
- 矩阵类型匹配:
Core.multiply()要求两个输入矩阵(myMask和oneMinusMorph)的类型和尺寸必须完全一致,否则会报错。所以在创建onesMat时一定要用morph.type()来保证类型匹配。 inv()的局限性:只有当矩阵是浮点型且值在[0,1]时,inv()才等价于1 - morph;如果是整数型矩阵,inv()是对每个像素取反(比如CV_8U时是255 - pixel),这时候只有当你把整数像素值归一化到[0,1]后,才和1 - morph等价。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

