我试图在OpenCV中执行以下操作。如果Mat的每个像素都低于某个值,我怎样才能将其设置为某个值?
所以我想做threshold之类的事情,但并不完全,因为我不想触及超出给定阈值的像素。
例如:将每个像素设置为50,小于50.
有什么想法吗?
答案 0 :(得分:8)
关于您的特定要求:
设置为
50
所有像素< 50
使用矩阵表达式和setTo
非常简单:
Mat m = ...
m.setTo(50, m < 50);
在OpenCV中,您可以使用cv::threshold或比较Matrix Expression来计算阈值。
正如您可能已经在做的那样,您可以将所有值255
设置为> th
:
double th = 100.0;
Mat m = ...
Mat thresh;
threshold(m, thresh, th, 255, THRESH_BINARY);
或:
double th = 100.0;
Mat m = ...
Mat thresh = m > th;
换句话说,即设置为255
所有值< th
,您可以这样做:
double th = 100.0;
Mat m = ...
Mat thresh;
threshold(m, thresh, th, 255, THRESH_BINARY_INV); // <-- using INVerted threshold
或:
double th = 100.0;
Mat m = ...
Mat thresh = m <= th; // <-- using less-or-equal comparison
//Mat thresh = m < th; // Will also work, but result will be different from the "threshold" version
请注意,虽然threshold
将生成相同类型输入的结果矩阵,但矩阵表达式将始终产生CV_8U
结果。
答案 1 :(得分:0)
因为我在OpenCV中发现了LUT函数,所以我一直试图在任何地方使用它。这看起来是一个很好的机会。
我假设您正在处理类型CV_8U
的矩阵并在C ++程序中使用OpenCV(否则它应该可以轻松移植到Python)。
首先必须定义lookUpTable
,如下所示:
cv::Mat lookUpTable(256,1,CV_8U);
for(int i = 0; i < 256; i++) {
if(i < 50)
lookUpTable.at<uchar>(i,0) = 50;
else
lookUpTable.at<uchar>(i,0) = i;
}
这意味着五十岁以下矩阵中的每个值都将达到50。
然后,剩下要做的就是:
cv::Mat image; # your original image
cv::Mat thresholdedImage;
cv::LUT(image, lookUpTable, thresholdedImage);
你走了。
可能有更有效的解决方案,或者我做的事情不必要地变得复杂但我发现它很优雅。