You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:52:13