如何与 Eigen 进行逐元素比较?
How to do element-wise comparison with Eigen?
我正在尝试使用 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
。
我正在尝试使用 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
。