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结果.
自从我发现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)
就这样吧。
可能有更有效的解决方案,或者也许我正在做一些不必要的复杂但我发现它很优雅的事情。