如何与元素进行元素比较

How to do element-wise comparison with Eigen?

本文关键字:元素 比较      更新时间:2023-10-16

我正在尝试使用eigen在C 中实现以下伪代码:

img_binary = +1*(img>img_mean) + -1*(img<img_mean)

即。我试图将灰度图像转换为二进制图像,以便大于图像均值的值是 1,而图像均值均值为-1。到目前为止,我有以下内容:

cv::Mat cv_image
cv_image = cv::imread(img_path, CV_LOAD_IMAGE_GRAYSCALE)
MatrixXf eig_image;
cv::cv2eigen(cv_image, eig_image):
float image_mean = eig_image.mean();
ArrayXXf bin_image;
bin_image = eig_image.array() > image_mean;

我在最后一行中遇到了一个错误,说我混合了不同的数字类型。关于我如何与eigen进行元素比较的任何建议?

eigen中最简单的解决方案是

ArrayXXf bin_image = (eig_image.array() > image_mean).cast<float>()*2.f-1.f;

另一种选择是:

ArrayXXf bin_image = (eig_image.array() > image_mean)
    .select(ArrayXXf::Constant(1.0f,eig_image.rows(),eig_image.cols()), -1.0f);

不幸的是,必须使用ArrayXXf::Constant进行一个参数,因为没有.select接受两个标量值

但是,除非您打算在eigen中进行进一步处理,否则您应该考虑使用相应的OPENCV方法threshold