将Mat的每个像素设置为某个值,如果它低于某个值?

时间:2016-05-20 09:15:44

标签: c++ opencv threshold

我试图在OpenCV中执行以下操作。如果Mat的每个像素都低于某个值,我怎样才能将其设置为某个值?

所以我想做threshold之类的事情,但并不完全,因为我不想触及超出给定阈值的像素。

例如:将每个像素设置为50,小于50.

有什么想法吗?

2 个答案:

答案 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);

你走了。

可能有更有效的解决方案,或者我做的事情不必要地变得复杂但我发现它很优雅。