OpenCV用另一个值替换特定像素值

Posted

技术标签:

【中文标题】OpenCV用另一个值替换特定像素值【英文标题】:OpenCV replacing specific pixel values with another value 【发布时间】: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);

【问题讨论】:

我不明白如何在不浏览像素的情况下检查特定值。只有O(N) 复杂度。 看看 cv::LUT,在本教程中给出:docs.opencv.org/doc/tutorials/core/how_to_scan_images/… 您将创建一个查找表,其中 table[i] == i 除了 table[128] == 120 【参考方案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,这在特殊情况下非常有效。

【讨论】:

以上是关于OpenCV用另一个值替换特定像素值的主要内容,如果未能解决你的问题,请参考以下文章

android opencv 如何获得特定像素点的颜色

C++的opencv里怎么读取Mat图像中特定坐标的灰度值?

如何使用python OpenCV在单通道图像中找到与特定值匹配的最大连通分量?

opencv如何计算图像中物体的像素值

Opencv之图像灰度化

python-opencv-图像毛玻璃模糊效果