2015-09-02 31 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這是在特殊情況下非常有效。