在 Opencv 中映射 2 图像

Posted

技术标签:

【中文标题】在 Opencv 中映射 2 图像【英文标题】:Mapping 2 image in Opencv 【发布时间】:2013-06-04 08:19:49 【问题描述】:

我知道这很简单,但我不能让它在 Opencv 中工作。我有两张相同大小的图像,一张是 RGB 的,另一张是黑白的。黑白图像是在 Opencv 中经过一些变换后得到的。现在我想将黑白图像映射到 RGB 图像,并且只保留与黑白图像中的白色像素对应的像素。黑色被简单地丢弃。

在 C# 中它很容易,但由于我使用的是 c++ opencv,所以我想在 openCV 中进行。我该怎么做?

在c#中是这样的:

for(i = 0; i < image.lenght; i+=4)

if(img_bw != 255)
image[i] = 0;image[i+1] = 0;image[i+2] = 0;

【问题讨论】:

查看 at 运算符以访问 Mat 元素 link 您可以使用提供逻辑“与”功能的库。我不知道 OpenCV 是否会这样做,但我知道 IPP 会。使用“and”将为您节省 for 循环。 RGB && BW == what_you_want。但是,如果您选择这样做,则必须小心图像格式。 【参考方案1】:
cv::Mat blackAndWhiteMask = ...; // You black and white image
cv::Mat image = imread("original_image.jpg"); // Your original image
cv::Mat result;
image.copyTo(result, blackAndWhiteMask);
image = result;

【讨论】:

【参考方案2】:

基于http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html

cv::Mat bw = ...;
cv::Mat clr = ...;  // clr.size() == bw.size()

for(int i = 0; i < bw.rows; ++ i)

    uchar* bw_r = bw.ptr<uchar>(i);
    cv::Vec3b* clr_r = clr.ptr<Vec3b>(i);
    for(int j = 0; j < bw.cols; ++j)
        if(br_r[j] != 255)
            clr_r[j] = cv::Vec3b(0, 0, 0);

【讨论】:

以上是关于在 Opencv 中映射 2 图像的主要内容,如果未能解决你的问题,请参考以下文章

重映射

OpenCV实战——图像运算详解

OpenCV实战——图像运算详解

OpenCV探索之路:重映射与仿射变换

python-opencv-图像颜色映射

OpenCV-Python实战——OpenCV中的色彩空间和色彩映射(❤️含大量实例,建议收藏❤️)