山东大学 计算机视觉 实验
实验1-1:图像显示
实验要求:
1)利用图像库的功能,实现从文件加载图像,并在窗口中进行显示的功能;
2)利用常见的图像文件格式(.jpg; .png; .bmp; .gif)进行测试。
实验1-2:图像合成
实验要求:
1)现有一张4通道透明图像a.png:
2)从其中提取出alpha通道并显示;
3)用alpha混合,为a.png替换一张新的背景(bg.png)。
实验要求
实验核心内容不允许使用库函数。
额外说明:仅提供 OpenCV C++ 实现
1、从文件加载图像,并在窗口中进行显示
除 GIF 外的打开方式:
Mat src = imread(YOUR_PATH + "1.png");
namedWindow("w");
imshow("w", src);
waitkey(0);
GIF 的打开方式参见 OpenCV打开GIF
2、图像合成
#define winname1_1 "Experiment 1-1"
#define winname1_2 "Experiment 1-2"
#define winname2_1 "Experiment 2-1"
#define winname2_2 "Experiment 2-2"
const String IMG_DIR = "你的路径";
void show_alpha_and_merge() {
Mat alpha_img = imread(IMG_DIR + "a.png", IMREAD_UNCHANGED);
// 注意! a.png 是四通道图片!
assert(alpha_img.channels() == 4);
vector<Mat> mask_channels;
// 分离通道
split(alpha_img, mask_channels);
// 取出 alpha 通道
Mat mask = mask_channels[3];
// 显示。3 秒看看
namedWindow(winname1_2);
imshow(winname1_2, mask);
waitKey(3000);
// 读取背景
Mat bg = imread(IMG_DIR + "bg.png");
Vec4b t;
// 使用库函数 copyTo(bg, mask) 直接可以完成下面的内容,但是不可以用库函数
// 思路:如果某点,mask 的 alpha 不为空,则用 alpha_img 的该点去代替
// 注意 图像通道数不同
for (int i = 0; i < bg.rows; i++) {
for (int j = 0; j < bg.cols; j++) {
if (mask.at<uchar>(i, j)) {
t = alpha_img.at<Vec4b>(i, j);
bg.at<Vec3b>(i, j) = Vec3b(t[0], t[1], t[2]);;
}
}
}
imshow(winname1_2, bg);
waitKey(0);
}