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

2019-05-11  本文已影响0人  Mr_Relu

编程环境:

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;
}
上一篇下一篇

猜你喜欢

热点阅读