数字图像实验一:图像合成

题目要求:
现有一张4通道透明图像a.png。
a.png

  1. 从其中提取出alpha通道并显示;
  2. 用alpha混合,为a.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 mat(img.rows, img.cols, CV_8UC1);
    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();
}

结果如下图:
alpha通道

问题二代码:

#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 backimg = imread("B.png", -1);
    Mat mat(img.rows, img.cols, CV_8UC4);
    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)*backimg.at<Vec4b>(i, j)[0] + temp*img.at<Vec4b>(i, j)[0];
            mat.at<Vec4b>(i, j)[1] = (1 - temp)*backimg.at<Vec4b>(i, j)[1] + temp*img.at<Vec4b>(i, j)[1];
            mat.at<Vec4b>(i, j)[2] = (1 - temp)*backimg.at<Vec4b>(i, j)[2] + temp*img.at<Vec4b>(i, j)[2];
            mat.at<Vec4b>(i, j)[3] = (1 - temp)*backimg.at<Vec4b>(i, j)[3] + temp*img.at<Vec4b>(i, j)[3];
        }
    }
    namedWindow("alpha合成");
    imshow("alpha合成", mat);
    waitKey();
}

所选背景B.png如下图:

背景

合成后的图像如下:

锯齿

我们会发现合成后的图像锯齿现象严重,这是我们将代码中的double temp = img.at<Vec4b>(i, j)[3] / 255改为double temp = img.at<Vec4b>(i, j)[3] / 255.00这样就可以消除锯齿了,效果图如下:

这里写图片描述

锯齿神奇的消失了!这就是数据类型选取的重要性,以后的实验中还会遇到类似的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值