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

如何用Eigen实现逐元素比较?灰度图像均值二值化需求

用Eigen实现灰度图的二值化(大于均值为+1,小于为-1)

嘿,这问题我熟!刚好可以用Eigen的Array逐元素运算完美实现你的需求,我来帮你补全代码并解释清楚:

首先,你已经完成了从OpenCV Mat到Eigen Matrix的转换,并且算出了图像均值,接下来只需要利用Eigen的逐元素条件判断生成目标二值数组:

完整代码片段

#include <Eigen/Dense>
#include <opencv2/opencv.hpp>

int main() {
    std::string img_path = "your_image_path.jpg";
    
    cv::Mat cv_image; 
    // 新版OpenCV推荐用IMREAD_GRAYSCALE,旧版本CV_LOAD_IMAGE_GRAYSCALE也兼容
    cv_image = cv::imread(img_path, cv::IMREAD_GRAYSCALE); 
    
    Eigen::MatrixXf eig_image; 
    cv::cv2eigen(cv_image, eig_image); 
    
    float image_mean = eig_image.mean(); 
    Eigen::ArrayXXf bin_image; 

    // 核心实现:完全贴合你的伪代码逻辑
    bin_image = (eig_image.array() > image_mean).cast<float>() * 1.0f 
              + (eig_image.array() < image_mean).cast<float>() * (-1.0f);

    // (可选)如果需要把结果转回OpenCV Mat格式
    cv::Mat cv_bin_image;
    cv::eigen2cv(bin_image, cv_bin_image);

    return 0;
}

代码细节解释

  • eig_image.array():把Eigen Matrix转换成Array类型——Matrix更适合线性代数运算,而Array专门用于逐元素的操作,刚好匹配我们的需求
  • (eig_image.array() > image_mean):返回一个布尔型Array,每个元素对应原图像素是否大于均值(true/false)
  • .cast<float>():把布尔值转成浮点型,true对应1.0f,false对应0.0f
  • 最后通过乘法+加法组合:大于均值的元素得到1*1 + 0*(-1) = 1,小于均值的得到0*1 + 1*(-1) = -1,等于均值的元素两个条件都不满足,结果为0

额外调整建议

如果想处理等于均值的像素,比如把它们归到某一类,只需要修改条件:

  • 把等于均值的像素设为+1:(eig_image.array() >= image_mean).cast<float>() * 1.0f + (eig_image.array() < image_mean).cast<float>() * (-1.0f)
  • 把等于均值的像素设为-1:(eig_image.array() > image_mean).cast<float>() * 1.0f + (eig_image.array() <= image_mean).cast<float>() * (-1.0f)

内容的提问来源于stack exchange,提问作者Vadim Smolyakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:34:11