最小值的 OpenCV 中的阈值图像
Thresholding image in OpenCV of min value
我想使用 cv::threshold
函数,因为它经过了很好的优化,而不是自己循环遍历整个图像。但是它没有最小值阈值。可用选项:
我想要的是将小于某个值的像素设置为那个值,例如:
image.at<float>(j,i) > 0.1f ? image.at<float>(j,i): 0.1f;
我可以不使用循环来做到这一点吗?
我试过了:
image.setTo(0.1, image < 0.1);
但它是说:
error: no match for ‘operator<’ (operand types are ‘const cv::UMat’ and ‘double’)
PS:我的图片类型是cv::UMat
请注意,对于介于 0 和 255 之间的数字 x
,等效项 max(x, thresh) == 255 - min(255-x, 255-thresh)
成立并且结果保持在 [0, 255] 范围内。
因此您可以 (i) 反转图像,(ii) 通过 255-thresh
构建 max-threshold,以及 (iii) 再次反转。
请注意,在数学上对于任何常数 a
它认为
max(x, thresh) == a - min(a-x, a-thresh)
,例如,max(x, thresh) == -min(-x, -thresh)
。最后一张是floating-point数据的首选。
我找到了这个函数:
void cv::max(
const Mat& src1, // Input array
double value, // Scalar input
Mat& dst // Result array
);
它将src1
的每个元素与value
进行比较并取最大值,它有点阈值但具有cv::max
功能。
我想使用 cv::threshold
函数,因为它经过了很好的优化,而不是自己循环遍历整个图像。但是它没有最小值阈值。可用选项:
我想要的是将小于某个值的像素设置为那个值,例如:
image.at<float>(j,i) > 0.1f ? image.at<float>(j,i): 0.1f;
我可以不使用循环来做到这一点吗?
我试过了:
image.setTo(0.1, image < 0.1);
但它是说:
error: no match for ‘operator<’ (operand types are ‘const cv::UMat’ and ‘double’)
PS:我的图片类型是cv::UMat
请注意,对于介于 0 和 255 之间的数字 x
,等效项 max(x, thresh) == 255 - min(255-x, 255-thresh)
成立并且结果保持在 [0, 255] 范围内。
因此您可以 (i) 反转图像,(ii) 通过 255-thresh
构建 max-threshold,以及 (iii) 再次反转。
请注意,在数学上对于任何常数 a
它认为
max(x, thresh) == a - min(a-x, a-thresh)
,例如,max(x, thresh) == -min(-x, -thresh)
。最后一张是floating-point数据的首选。
我找到了这个函数:
void cv::max(
const Mat& src1, // Input array
double value, // Scalar input
Mat& dst // Result array
);
它将src1
的每个元素与value
进行比较并取最大值,它有点阈值但具有cv::max
功能。