如何在Eigen矩阵中实现黑白像素值互换(类OpenCV bitwise_not)
Eigen实现黑白像素值互换的方法
针对你的需求,Eigen可以通过多种方式实现和OpenCV bitwise_not等效的黑白像素互换操作,以下是几种实用方案:
- 直接算术运算(最简便)
因为你的图像仅包含0(黑)和255(白)两种像素值,直接用255减去每个像素即可完成转换:
imageMask = 255 - imageMask;
Eigen原生支持矩阵与标量的逐元素运算,该操作会高效遍历所有像素,完全满足需求。
- 逐元素位取反(对应OpenCV逻辑)
如果想实现和bitwise_not完全一致的按位取反逻辑,可使用Eigen的逐元素操作或直接利用C++位运算符:
// 方法1:使用unaryExpr自定义逐元素操作 imageMask = imageMask.unaryExpr([](unsigned char x) { return ~x; }); // 方法2:直接使用Eigen支持的逐元素位运算 imageMask = ~imageMask;
对于unsigned char类型,~0结果为255,~255结果为0,刚好对应黑白像素互换,和算术运算效果完全相同。
- 封装为类成员方法(便于复用)
如果需要频繁使用该操作,可以在你的Image类中添加封装方法:
template <typename T> class Image : public Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> { public: using Tpixel = T; using Base = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>; inline Image() { Base::resize(0, 0); } // 新增:黑白像素互换方法 void invertBinary() { static_assert(std::is_same_v<T, unsigned char>, "该方法仅支持unsigned char类型"); *this = 255 - *this; // 也可替换为位取反逻辑:*this = ~*this; } };
调用时只需一行代码:
imageMask.invertBinary();
内容的提问来源于stack exchange,提问作者anti
相关产品推荐
相关产品推荐

