2015-09-02 36 views
3

欲检测特定像素值置换特定像素值(假设128在一无符号的8位1通道图像)在cv::Mat图像和与该特定值与替换的所有像素的值另一个值(用120代替每个128)。有没有这样做的有效方法?或者我应该逐像素地进行搜索和断言操作?的OpenCV与另一个值

我开始编码,但无法完成。这里是我的代码的一部分:

cv::Mat source; 
unsigned oldValue = 128; 
unsigned newValue = 120; 

cv::Mat temp = (source == oldValue); 
+0

我不明白如何在不浏览像素的情况下检查特定值。这只是'O(N)'的复杂性。 – coincoin

+0

看看简历:: LUT,在本教程中给出:http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-core-function您可以创建一个查询向上桌子在哪里[i] ==我在哪里但是桌子[128] == 120 – Micka

回答

7

您可以使用setTo,使用面膜:

Mat src; 
// ... src is somehow initialized 

int oldValue = 128; 
int newValue = 120; 

src.setTo(newValue, src == oldValue); 
2

不能确定它是否比.setTo更有效,但你可以使用查找向上表格(特别是如果你有多个要替换的值,并且你必须替换多个图像中的相同值(例如在视频流的每个图像中))。

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这是在特殊情况下非常有效。