OpenCV 用另一个值替换特定像素值
OpenCV replacing specific pixel values with another value
我想检测 cv::Mat
图像中的特定像素值(比如无符号 8 位 1 通道图像中的 128),并将具有该特定值的所有像素值替换为另一个值(将每个 128 替换为 120)。有什么有效的方法吗?或者我应该逐个像素地进行搜索和断言操作?
我开始编码但无法完成。这是我的代码的一部分:
cv::Mat source;
unsigned oldValue = 128;
unsigned newValue = 120;
cv::Mat temp = (source == oldValue);
可以使用setTo
,使用掩码:
Mat src;
// ... src is somehow initialized
int oldValue = 128;
int newValue = 120;
src.setTo(newValue, src == oldValue);
不确定它是否比 .setTo
更有效,但您可以使用查找-table(特别是如果您有多个要替换的值并且您必须替换多个图像中的相同值(例如,在视频流的每个图像中))。
int main()
{
cv::Mat input = cv::imread("../inputData/Lenna.png");
cv::Mat gray;
cv::cvtColor(input,gray,CV_BGR2GRAY);
// prepare this once:
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
{
p[i] = i;
}
// your modifications
p[128] = 120;
// now you can use LUT efficiently
cv::Mat result;
cv::LUT(gray, lookUpTable, result);
cv::imshow("result", result);
cv::imwrite("../outputData/LUT.png", result);
cv::waitKey(0);
return 0;
}
根据http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-core-function,这在特殊情况下非常有效。
我想检测 cv::Mat
图像中的特定像素值(比如无符号 8 位 1 通道图像中的 128),并将具有该特定值的所有像素值替换为另一个值(将每个 128 替换为 120)。有什么有效的方法吗?或者我应该逐个像素地进行搜索和断言操作?
我开始编码但无法完成。这是我的代码的一部分:
cv::Mat source;
unsigned oldValue = 128;
unsigned newValue = 120;
cv::Mat temp = (source == oldValue);
可以使用setTo
,使用掩码:
Mat src;
// ... src is somehow initialized
int oldValue = 128;
int newValue = 120;
src.setTo(newValue, src == oldValue);
不确定它是否比 .setTo
更有效,但您可以使用查找-table(特别是如果您有多个要替换的值并且您必须替换多个图像中的相同值(例如,在视频流的每个图像中))。
int main()
{
cv::Mat input = cv::imread("../inputData/Lenna.png");
cv::Mat gray;
cv::cvtColor(input,gray,CV_BGR2GRAY);
// prepare this once:
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
{
p[i] = i;
}
// your modifications
p[128] = 120;
// now you can use LUT efficiently
cv::Mat result;
cv::LUT(gray, lookUpTable, result);
cv::imshow("result", result);
cv::imwrite("../outputData/LUT.png", result);
cv::waitKey(0);
return 0;
}
根据http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-core-function,这在特殊情况下非常有效。