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

J.J*_*J.J 5 c++ opencv threshold

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

所以我想做一些类似阈值的事情,但并不完全,因为我不想触摸超过给定阈值的像素.

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

有任何想法吗?

Mik*_*iki 10

关于您的特殊要求:

设置为50所有像素< 50

使用矩阵表达式并且setTo很简单:

Mat m = ...
m.setTo(50, m < 50);
Run Code Online (Sandbox Code Playgroud)

在OpenCV中,您可以使用cv :: threshold或比较Matrix Expression来计算阈.

正如您可能已经在做的那样,您可以使用以下命令设置255所有值> th:

double th = 100.0;
Mat m = ...
Mat thresh;
threshold(m, thresh, th, 255, THRESH_BINARY);
Run Code Online (Sandbox Code Playgroud)

要么:

double th = 100.0;
Mat m = ...
Mat thresh = m > th;
Run Code Online (Sandbox Code Playgroud)

换句话说,即设置为255所有值< th,您可以这样做:

double th = 100.0;
Mat m = ...
Mat thresh;
threshold(m, thresh, th, 255, THRESH_BINARY_INV); // <-- using INVerted threshold
Run Code Online (Sandbox Code Playgroud)

要么:

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
Run Code Online (Sandbox Code Playgroud)

请注意,虽然threshold将生成相同类型输入的结果矩阵,但矩阵表达式将始终产生CV_8U结果.


Sun*_*eef 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;
}
Run Code Online (Sandbox Code Playgroud)

这意味着矩阵中低于 50 的每个值都将变为 50。

那么,剩下要做的就是:

cv::Mat image;  # your original image
cv::Mat thresholdedImage;
cv::LUT(image, lookUpTable, thresholdedImage);
Run Code Online (Sandbox Code Playgroud)

就这样吧。

可能有更有效的解决方案,或者也许我正在做一些不必要的复杂但我发现它很优雅的事情。