我想使用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 :(得分:1)
请注意,对于0到255之间的数字x
,等值max(x, thresh) == 255 - min(255-x, 255-thresh)
成立且结果保持在[0,255]内。
所以你可以(i)反转图像,(ii)按255-thresh
建立最大阈值,(iii)再次反转。
请注意,对于任何常量a
,它都是数学上的
max(x, thresh) == a - min(a-x, a-thresh)
,例如max(x, thresh) == -min(-x, -thresh)
。最后一个是浮点数据的首选。
答案 1 :(得分:1)
我发现了这个功能:
void cv::max(
const Mat& src1, // Input array
double value, // Scalar input
Mat& dst // Result array
);
它将src1
的每个元素与value
进行比较,并采用最大值,即阈值但具有cv::max
函数。