1 为原始图片添加透明通道,并将图片中的红色区域置为透明

先正常读取一张彩色图片,然后为彩色图片添加一个透明通道,然后将彩色图片中是红色的区域置为透明,然后保存为带有透明通道的彩色图片。

示例的C++代码如下

#include <iostream>

#include "opencv2/opencv.hpp"


int main()
{
    // 读取图像
    cv::Mat image = cv::imread("树莓派.jpg");

    // 检查图像是否成功加载
    if (image.empty())
    {
        std::cout << "无法加载图像文件" << std::endl;
        return -1;
    }

    // 创建一个与输入图像大小相同的空白图像,颜色通道为4(包括Alpha通道)
    cv::Mat result(image.size(), CV_8UC4);

    for (int i = 0; i < image.rows; ++i)
    {
        for (int j = 0; j < image.cols; ++j)
        {
            cv::Vec3b pixel = image.at<cv::Vec3b>(i, j);
            if (pixel[2] > pixel[0] && pixel[2] > pixel[1]) // 检查红色通道是否最大
            {
                result.at<cv::Vec4b>(i, j) = cv::Vec4b(0, 0, 0, 0); // 设置透明像素
            }
            else
            {
                result.at<cv::Vec4b>(i, j) = cv::Vec4b(pixel[0], pixel[1], pixel[2], 255); // 保留原始像素
            }
        }
    }

    // 保存图像为PNG格式,以保留透明度
    cv::imwrite("transparent_image.png", result);

    return 0;
}

本文以树莓派的图片为示例,因为它的红色区域最多,最后的结果如下图

OpenCV | C++ – 为原始图片添加透明通道,并将图片中的红色区域置为透明并保存-StubbornHuang Blog