线性代数--图像特效合成

基于matlab的图片特效开发

实验目的:先将一张图片去掉背景颜色,选取其主体部分,再在一张背景图中插入多张照片进行合成

在本实验项目中,选取天空图像和蝴蝶图像,将蝴蝶图像嵌入到天空图像中

1.读取原始图像并初始化Alpha通道

Im_name = 'butterfly.jpg';
[I, ~, originalAlpha] = imread(Im_name);
alpha = ones(size(I, 1), size(I, 2));

(Im_name = ' '中复制自己电脑上的文件地址)

   读取蝴蝶图像。初始化Alpha通道,使所有像素不透明。

2.查找接近白色的像素并将其设为透明

whitePixels = I(:,:,1) > 200 & I(:,:,2) > 200 & I(:,:,3) > 200;
alpha(whitePixels) = 0;

使用逻辑索引查找接近白色的像素,并将这些像素的透明度设置为0。

3.保存带Alpha通道的图像

imwrite(I, 'butterfly.jpg', 'Alpha', alpha);

保存图像,注意JPEG格式不支持Alpha通道,应使用PNG格式

4.读取带透明背景的蝴蝶图像,并缩放 

[B, ~, B_alpha] = imread('butterfly.jpg');
scale = 0.05;
B = imresize(B, scale);
B_alpha = imresize(B_alpha, scale);

读取带透明背景的蝴蝶图像,并缩放

5.读取天空图像 

C = imread('sky.jpg');

 (imread = ' '中复制自己电脑上的文件地址)

6.将蝴蝶随机放置在天空图像上

[C_height, C_width, ~] = size(C);
[B_height, B_width, ~] = size(B);

num_butterflies = 40;
result_image = C; 
for i = 1:num_butterflies
    x_pos = randi([1, C_width - B_width]);
    y_pos = randi([1, C_height - B_height]);
    angle = randi([0, 360]);
    rotated_B = imrotate(B, angle, 'bilinear', 'crop');
    rotated_B_alpha = imrotate(B_alpha, angle, 'bilinear', 'crop');

    for c = 1:3
        insertRegion = result_image(y_pos:(y_pos+B_height-1), x_pos:(x_pos+B_width-1), c);
        butterflyRegion = rotated_B(:,:,c);
        alphaRegion = rotated_B_alpha / 255;

        result_image(y_pos:(y_pos+B_height-1), x_pos:(x_pos+B_width-1), c) = ...
            insertRegion .* (1 - alphaRegion) + butterflyRegion .* alphaRegion;
    end
end

 获取天空和蝴蝶图像的尺寸,随机生成蝴蝶的数量及其位置和角度,将旋转后的蝴蝶按其透明度合成到天空图像中。

7.显示结果图像

imshow(result_image);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值