美文网首页
CV图像基本操作【1】——alpha混合(opencv)

CV图像基本操作【1】——alpha混合(opencv)

作者: Mr_Relu | 来源:发表于2019-05-11 22:13 被阅读0次

    编程环境:

    VS + OpenCV + C++
    完整代码已经更新至GitHub,欢迎fork~GitHub链接


    声明:创作不易,未经授权不得复制转载
    statement:No reprinting without authorization


    内容:

    1.利用图像库的功能,实现从文件加载图像,并在窗口中进行显示的功能;利用常见的图像文件格式(.jpg; .png; .bmp; .gif等)进行测试;
    2.现有一张4通道透明图像a.png:从其中提取出alpha通道并显示;用alpha混合,为a.png替换一张新的背景;

    补充环境配置问题:

    下载安装VS2017和opencv3.4时相关配置及环境变量问题,参考网页链接:https://blog.csdn.net/weixin_39393712/article/details/79583274

    code one 读取图像显示
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        cout << CV_VERSION << endl;
        //读取一张图片便显示出来
        Mat src = imread("a.png");//读取图片,要提前将图片放在程序路径下
        cvtColor(src, src, CV_BGR2GRAY);//转为灰度图
        /*
        namedWindow()函数 
        用法:namedWindow(“img”,x); 
        x=WINDOW_AUTOSIZE:用户不能手动改变窗口大小,默认为此 
        x=WINDOW_Normal:用户可以手动改变窗口大小 
        x=WINDOW_OpenGL:支持openGL
        */
        namedWindow("img",WINDOW_NORMAL);
        imshow("img", src);
        imwrite("C:\\Users\\wangbinKF\\Desktop\\01.bmp", src);//保存结果图片
        waitKey(0);//暂停等待按键
        return 0;
    }
    
    code two 提取图像alpha通道并显示

    从其中提取出alpha通道并显示,结果如下:


    image.png
    image.png
    #include<iostream>  
    #include<opencv2/core/core.hpp>
    #include<opencv2/highgui/highgui.hpp>
    
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
        Mat img = imread("a.png", -1);//-1使能读取第4个RGBA中的A通道,即为alpha通道
        Mat mat(img.rows, img.cols, CV_8UC1);//可以创建----8位无符号的单通道---灰度图片------grayImg
        for (int i = 0; i < img.rows; ++i)
        {
            for (int j = 0; j < img.cols; ++j)
            {
                mat.at<uchar>(i, j) = img.at<Vec4b>(i, j)[3];
            }
        }
        namedWindow("alpha通道图像");
        imshow("alpha通道图像", mat);
        waitKey();
        return 0;
    }
    
    code three 获取alpha混合图像

    利用ppt软件工具自行填充另存得到纯色的png背景图片,最后结果如下:


    image.png
    image.png
    #include<iostream>  
    #include<opencv2/core/core.hpp>
    #include<opencv2/highgui/highgui.hpp>
    
    using namespace cv;
    using namespace std;
    
    
    int main()
    {
        Mat img = imread("a.png", -1);
        Mat back_img = imread("back_a.png", -1);
        Mat mat(img.rows, img.cols, CV_8UC4);//#define CV_8UC4 CV_MAKETYPE(CV_8U,4)可以创建-----8位无符号的四通道---带透明色的RGB图像 
        for (int i = 0; i < img.rows; ++i)
        {
            for (int j = 0; j < img.cols; ++j)
            {
                double temp = img.at<Vec4b>(i, j)[3] / 255.00;
                mat.at<Vec4b>(i, j)[0] = (1 - temp)*back_img.at<Vec4b>(i, j)[0] + temp * img.at<Vec4b>(i, j)[0];
                mat.at<Vec4b>(i, j)[1] = (1 - temp)*back_img.at<Vec4b>(i, j)[1] + temp * img.at<Vec4b>(i, j)[1];
                mat.at<Vec4b>(i, j)[2] = (1 - temp)*back_img.at<Vec4b>(i, j)[2] + temp * img.at<Vec4b>(i, j)[2];
                mat.at<Vec4b>(i, j)[3] = (1 - temp)*back_img.at<Vec4b>(i, j)[3] + temp * img.at<Vec4b>(i, j)[3];
            }
        }
        namedWindow("alpha混合图像");
        imshow("alpha混合图像", mat);
        waitKey();
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:CV图像基本操作【1】——alpha混合(opencv)

          本文链接:https://www.haomeiwen.com/subject/rvvfaqtx.html