【问题标题】:OpenCV replacing specific pixel values with another valueOpenCV用另一个值替换特定像素值
【发布时间】:2015-11-27 16:12:28
【问题描述】:

我想在cv::Mat 图像中检测一个特定的像素值(假设是无符号 8 位 1 通道图像中的 128),并将所有像素的值替换为另一个值(替换每个 128 120)。有没有有效的方法来做到这一点?还是应该逐个像素地进行搜索和断言操作?

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

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

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

【问题讨论】:

标签: c++ opencv replace colors pixel


【解决方案1】:

您可以使用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,这在特殊情况下非常有效。

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 2012-07-11
      • 1970-01-01
      • 2022-01-06
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多