如何用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
相关产品推荐
相关产品推荐

