实验二: 图像的基本运算和几何变换(数字图像处理)

实验二  图像的基本运算和几何变换

一、实验意义及目的

(1)了解和掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数,并为下一步编程进行图像处理打下基础。

(2)理解色彩的概念,掌握图像代数运算,几何变换方法。

二、实验内容

1.  打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换:

(1)将Image1色彩通道互换,并显示效果;

(2)将Image1灰度化为gray,并显示灰度化后图像;

(3)采用不同的插值方法实现gray的旋转、放大变换;

(4)打开另一幅彩色图像Image2,和Image1进行代数运算,要求运用拼接、加减乘除等多种技术;

2.拓展内容:完成参考ppt的综合实例

有一幅蝴蝶、一幅风景图片,基于几何、代数和色彩通道运算,编程实现漫天蝴蝶飞舞的合成图像。

设计思路:对蝴蝶图片进行随机变换后叠加到风景图片上,依次进行的随机变换为:三种几何变换、交换两个色彩通道、叠加到风景图片随机位置上。

三、Matlab相关函数介绍

(1)imread函数

功能:实现多种类型图像文件的读取,如:BMP、GIF、JPEG、PNG、RAS等。

调用格式:A = imread(filename, fmt)。filename为图像文件名,可以是灰度图像,也可以是彩色图像,如果文件不在当前目录或不在Matlab目录下,则需要列全文件路径。fmt为文件的扩展名,指定文件类型。A为图像数据矩阵。

(2)imshow函数

功能:显示图像。

调用格式:

imshow(I,n):显示灰度图像I,n为要显示图像的灰度等级,整数,默认为256。

Imshow(I,[LOW HIGH]):以规定的灰度级范围[LOW HIGH]来显示灰度图像I,低于LOW值的显示为黑,高于HIGH值的显示为白,默认按256个灰度级显示。

imshow(RGB):显示真彩色图像RGB。

imshow(BW):显示二值图像BW。

imshow(X,map):显示索引图像,X为索引图像的数据矩阵,map为其颜色映射表。

imshow filename:显示filename指定的图像,若文件包括多帧图像,则显示第一幅,且文件必须在MATLAB的当前目录下。

(3)imwrite函数

功能:实现图像文件的保存。

调用格式:

imwrite(A,’filename’,fmt):A是要保存的图像数据矩阵,filename是文件名,fmt是文件格式。

imwrite(X,map,’filename’,fmt):X为索引图像的数据矩阵,map为其颜色映射表。

(4)rgb2hsv函数

功能:实现RGB数据图像向HSV数据图像的转换。

调用格式:

HSV = rgb2hsv(RGB)。RGB为RGB彩色图像,为3维矩阵;HSV为3维HSV图像矩阵,3维依次为H、S、V,取值均在[0,1]范围内。

(5)rgb2ycbcr函数

YCBCR = rgb2ycbcr(RGB) :实现RGB数据图像向YCbCr数据图像的转换。

(6)rgb2gray函数

功能:彩色图像灰度化。

调用格式:

I = rgb2gray(RGB):真彩色RGB图像变换为灰度图像I。

NEWMAP = rgb2gray(MAP):变换索引图像的调色板为灰度调色板。

(7)imrotate函数

功能:实现图像旋转。

调用格式:

B = imrotate(A,ANGLE,METHOD,BBOX):A为要进行旋转的图像;ANGLE为要旋转的角度(°)逆时针为正,顺时针为负;METHOD为图像旋转插值方法,可取“'nearest', 'bilinear', 'bicubic'”,默认为nearest;BBOX指定返回图像大小,可取“crop”,输出图像B与输入图像A具有相同的大小,对旋转图像进行剪切以满足要求;可取“loose”,默认是,B包含整个旋转后的图像。

(8)imresize函数

功能:实现图像缩放。

调用格式:

B = imresize(A, SCALE,METHOD)):返回原图A的SCALE倍大小图像B;

B = imresize(A, [NUMROWS NUMCOLS], METHOD)):对原图A进行比例缩放,返回图像B的行数NUMROWS和列数NUMCOLS,如果二者为NaN,表明Matlab自动调整了图像的缩放比例;

[Y, NEWMAP] = imresize(X, MAP, SCALE, METHOD)):对索引图像进行成比例缩放。

(9)imtransform函数

功能:实现图像几何变换。

调用格式:

B = imtransform(A,TFORM,INTERP,param1,val1,param2,val2,…) :对图像A实现空间变换,TFORM为maketform函数或cp2tform函数产生的结构;INTERP为插值方法,可取“'nearest', 'bilinear', 'bicubic'”。

T = maketform(TRANSFORMTYPE,...):产生转换结构;TRANSFORMTYPE为变换类型,可以为“'affine', 'projective', 'custom', 'box', 'composite'”。

(10)fliplr函数

B=fliplr(X):实现二维矩阵X沿垂直轴的左右翻转。

(11)flipud函数

B= flipud(X):实现二维矩阵X上下翻转。

(12)flipdim函数

B=flipdim(X,DIM):使矩阵X按特定轴翻转,dim指定翻转方式:为1表示按行翻转;为2表示按列翻转。

(13)permute函数

B = permute(A,ORDER):按照向量ORDER指定的顺序重排A的各维,B中元素和A中元素完全相同,但在A、B访问同一个元素使用的下标不一样。order中的元素必须各不相同。

(14)imadd函数

C=imadd(A,B) :实现两幅图像相加。

1)A、B均为图像,则要求B和A的尺寸相等;若B是一个标量,则C表示对图像A整体加上某个值(对小数部分取整)。

2)假如A和B对应运算和大于255,C仍取255,即截断处理;为避免截断,可以将C存储为uint16,即C=imadd(A,B,’uint16’)。

(15)imsubtract函数

功能:实现两幅图像相减。

调用格式:

C=imsubtract(A,B):差值结果小于0的赋值为0,对A、B的要求同imadd相同。

C=imabsdiff(A,B):差值结果取绝对值。

(16)immultiply 函数

C=immultiply(A,B):实现两幅图像相乘。

(17)imdivide函数

C=imdivide(A,B) :实现两幅图像相除。

四、参考代码

参考代码中实现了彩色图像的灰度化、旋转、缩放两种几何变换以及镜像及拼接。

clc; clear all;

Image1=imread('peppers.jpg');

%% 红绿通道互换

Image2=Image1;

Image2(:,:,1)=Image1(:,:,2);

Image2(:,:,2)=Image1(:,:,1);

imshow(Image2);

imwrite(Image2,'changecolor.jpg');

%% 灰度化

gray=rgb2gray(Image1);

figure;

subplot(121),imshow(Image1),title('Original Image');

subplot(122),imshow(gray),title('Gray Image');

imwrite(gray,'grayimage.jpg');

 %% 图像旋转

Newgray1=imrotate(gray,15);

Newgray2=imrotate(gray,15,'bilinear');    

figure;

subplot(121),imshow(Newgray1),title('旋转15°(最邻近插值)');

subplot(122),imshow(Newgray2),title('旋转15°(双线性插值)');

imwrite(Newgray1,'rotate1.jpg');

imwrite(Newgray2,'rotate2.jpg');

 %% 图像缩放

Newgray3=imresize(gray,2.5,'nearest');

Newgray4=imresize(gray,2.5,'bilinear');

Figure;

subplot(121),imshow(Newgray3),title('放大2.5倍(最邻近插值)');

subplot(122),imshow(Newgray4),title('放大2.5倍(双线性插值)');

imwrite(Newgray3,'scale1.jpg');

imwrite(Newgray4,'scale2.jpg');

 %% 图像镜像与拼接

Image2=imread('lotus.bmp');

HImage=flipdim(Image2,2);

VImage=flipdim(Image2,1);

CImage=flipdim(HImage,1);

[h w]=size(Image2);

NewImage=zeros(h*2,w*2,3);

NewImage=[Image2 HImage;VImage CImage];

figure,imshow(NewImage);

imwrite(NewImage,'newlotus.jpg');

五、实验要求

1.熟悉Matlab函数,读懂参考代码;(课前预习完成)

2.修改对应的参数和图像,展示不同结果,完成实验内容1.

3.完成拓展内容

实验目的

1)了解和掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数,并为下一步编程进行图像处理打下基础。

2)理解色彩的概念,掌握图像代数运算,几何变换方法。

实验内容

1.  打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换:

(1)将Image1色彩通道互换,并显示效果;

(2)将Image1灰度化为gray,并显示灰度化后图像;

(3)采用不同的插值方法实现gray的旋转、放大变换;

(4)打开另一幅彩色图像Image2,和Image1进行代数运算,要求运用拼接、加减乘除等多种技术;

设计思路

首先,使用imread函数读入两张不同的图像,并对其中一张图像进行色彩通道互换操作。然后,将另一张图像转换为灰度图像,并对其进行图像处理操作,包括旋转和缩放,并采用不同的插值方法实现不同的效果。接着,使用flip函数实现图像的水平和垂直镜像,并将它们拼接到原始图像的四个角上,形成一个新的图像。

接下来,通过使用imadd、imabsdiff、immultiply和bitwise函数对图像进行加减乘除和图像逻辑操作,生成不同的图像结果。最后,通过subplot和imshow等函数将所有处理结果显示在一个窗口中,方便用户对比不同的图像处理效果。在图像加减乘除和图像逻辑操作中,对原始图像进行了不同的处理,利用MATLAB提供的函数进行图像操作,生成新的结果图像,并保存成文件。最后,使用subplot和imshow等函数将所有处理结果显示在一个窗口中,方便用户对比不同的图像处理效果。

代码及注释

% 代码清空及图像读入

clc; clear all;

Image1=imread('desert.jpg');

%% (1)将Image1色彩通道互换,并显示效果

% 复制一份 Image1 作为 Image2

Image2=Image1;

% 将 Image2 中的红色通道和蓝色通道互换,实现色彩通道互换

Image2(:,:,1)=Image1(:,:,2);

Image2(:,:,2)=Image1(:,:,1);

% 显示 Image2

imshow(Image2);

% 保存 Image2

imwrite(Image2,'颜色互换.jpg');

%% (2)将Image1灰度化为gray,并显示灰度化后图像

% 使用 rgb2gray 函数将 Image1 转换为灰度图像

gray=rgb2gray(Image1);

% 创建绘图窗口,分别显示原始图像和灰度图像

figure;

subplot(121),imshow(Image1),title('原始图像');

subplot(122),imshow(gray),title('灰度图像');

% 保存灰度图像

imwrite(gray,'灰度图像.jpg');

%% (3)采用不同的插值方法实现gray的旋转、放大变换

% 图像旋转

% 使用 imrotate 函数对 gray 进行旋转,采用最近邻插值方法

Newgray1=imrotate(gray,15);

% 使用 imrotate 函数对 gray 进行旋转,采用双线性插值方法

Newgray2=imrotate(gray,15,'bilinear');

% 创建绘图窗口,分别显示旋转后的灰度图像

figure;

subplot(121),imshow(Newgray1),title('旋转15度(最近邻插值)');

subplot(122),imshow(Newgray2),title('旋转15度(双线性插值)');

% 保存旋转后的灰度图像

imwrite(Newgray1,'旋转1.jpg');

imwrite(Newgray2,'旋转2.jpg');

% 图像缩放

% 使用 imresize 函数对 gray 进行放大,采用最近邻插值方法,放大倍数为 2.5 倍

Newgray3=imresize(gray,2.5,'nearest');

% 使用 imresize 函数对 gray 进行放大,采用双线性插值方法,放大倍数为 2.5 倍

Newgray4=imresize(gray,2.5,'bilinear');

% 创建绘图窗口,分别显示缩放后的灰度图像

figure;

subplot(121),imshow(Newgray3),title('放大2.5倍(最近邻插值)');

subplot(122),imshow(Newgray4),title('放大2.5倍(双线性插值)');

% 保存缩放后的灰度图像

imwrite(Newgray3,'缩放1.jpg');

imwrite(Newgray4,'缩放2.jpg');

%% 图像镜像与拼接

% 读入新图像 Image2

Image2 = imread('lotus.JPG');

% 将 Image2 水平镜像得到 HImage

HImage = flip(Image2, 2);

% 将 Image2 垂直镜像得到 VImage

VImage = flip(Image2, 1);

% 将 HImage 再次垂直镜像得到 CImage

CImage = flip(HImage, 1);

% 获取 Image2 的高度、宽度

[h, w, ~] = size(Image2);

% 拼接后图像的高度为原图的两倍,宽度为原图的两倍

h2 = 2 * h;

w2 = 2 * w;

% 创建新图像 newImage,大小为 (h2, w2, 3),数据类型为 uint8

newImage = zeros(h2, w2, 3, 'uint8');

% 将 Image2 复制到 newImage 的左上角

newImage(1:h, 1:w, :) = Image2;

% 将 HImage 复制到 newImage 的右上角

newImage(1:h, w+1:end, :) = HImage;

% 将 VImage 复制到 newImage 的左下角

newImage(h+1:end, 1:w, :) = VImage;

% 将 CImage 复制到 newImage 的右下角

newImage(h+1:end, w+1:end, :) = CImage;

% 显示拼接后的图像 newImage

imshow(newImage);

% 保存拼接后的图像 newImage

imwrite(newImage, '新莲花.jpg');

%% 加减乘除

% 图像加法

% 读入背景图 Back 和目标图 Foreground

Back=imread('desert.jpg');

Foreground=imread('car.jpg');

% 对目标图 Foreground 进行亮度调整,将亮度减少 100

result1=imadd(Foreground,-100);

% 将背景图 Back 和目标图 Foreground 进行相加得到 result2

result2=imadd(Back,Foreground);

% 将 result1 和背景图 Back 进行相加得到 result3

result3=imadd(Back,result1);

% 创建绘图窗口,分别显示原目标图、原目标图加标量、原目标图加背景、加标量图叠加背景

subplot(221),imshow(Foreground),title('原目标图');

subplot(222),imshow(result1),title('原目标图加标量');

subplot(223),imshow(result2),title('原目标图加背景');

subplot(224),imshow(result3),title('加标量图叠加背景');

% 图像减法

% 读入背景图 Back 和前景图 Foreground

Back=imread('hallback.bmp');

Foreground=imread('hallforeground.bmp');

% 对背景图 Back 和前景图 Foreground 进行相减得到 result1

result1=imabsdiff(Back,Foreground);

% 创建绘图窗口,分别显示背景图、前景图、图像相减结果

subplot(131),imshow(Back),title('背景图');

subplot(132),imshow(Foreground),title('前景图');

subplot(133),imshow(result1),title('图像相减');

% 图像乘法

% 读入背景图 Back 和模板图 Templet

Back=im2double(imread('bird.jpg'));

Templet=im2double(imread('birdtemplet.bmp'));

% 对背景图 Back 和模板图 Templet 进行相乘得到 result1

result1=immultiply(Templet,Back);

% 创建绘图窗口,分别显示背景图、模板图、图像相乘结果

subplot(131),imshow(Back),title('背景');

subplot(132),imshow(Templet),title('模板');

subplot(133),imshow(result1),title('图像相乘');

% 图像逻辑

% 读入背景图 Back 和模板图 Templet

Back=imread('bird.jpg');

Templet=imread('birdtemplet.bmp');

% 对背景图 Back 求反得到 result1

result1=bitcmp(Back);

% 对模板图 Templet 和背景图 Back 进行按位与得到 result2

result2=bitand(Templet,Back);

% 对模板图 Templet 和背景图 Back 进行按位或得到 result3

result3=bitor(Templet,Back);

% 对模板图 Templet 和背景图 Back 进行按位异或得到 result4

result4=bitxor(Templet,Back);

% 创建绘图窗口,分别显示图像求反、图像相与、图像相或、图像异或的结果

subplot(221),imshow(result1),title('求反');

subplot(222),imshow(result2),title('相与');

subplot(223),imshow(result3),title('相或');

subplot(224),imshow(result4),title('异或');

结果分析

  1. 将Image1的红色和绿色通道做了交换,得到了Image2,并将其显示出来;
  2. 将Image1转为灰度图像,得到gray,并将其显示出来;
  3. 对gray进行了旋转和放大,分别使用了最近邻插值和双线性插值两种插值方法,并将结果显示出来;
  4. 对一张图像进行了镜像,并将四张图像拼接成一张新的图像,并将其显示出来;
  5. 实现了图像加、减、乘、除以及逻辑运算,并将结果显示出来。

2.拓展内容:完成参考ppt的综合实例

有一幅蝴蝶、一幅风景图片,基于几何、代数和色彩通道运算,编程实现漫天蝴蝶飞舞的合成图像。设计思路:对蝴蝶图片进行随机变换后叠加到风景图片上,依次进行的随机变换为:三种几何变换、交换两个色彩通道、叠加到风景图片随机位置上。

设计思路

  1. 读入两张图像,即原始蝴蝶图像和被叠加图像。
  2. 设定参数,包括要生成的随机蝴蝶数量、拟进行几何变化的种类数等。
  3. 循环生成随机蝴蝶:在缩小、旋转、三种镜像五种几何变化中随机选择三种,对每个随机选择的几何变换进行处理,并随机选择叠加位置,保存被覆盖的部分以便后面的还原,随机交换两个通道的颜色,去除背景黑色点。
  4. 将变换后的蝴蝶图片叠加到被覆盖图像上。
  5. 增强整张图片的对比度,使得效果更好。
  6. 显示合成图,保存合成结果。

总的来说,该段代码通过随机选择几何变换和叠加位置,实现了对多个图像的随机组合,从而达到了创造新图片的目的。

通过多次随机重复这一过程,可以得到不同的混合效果。代码最后将混合后的图像保存在本地,同时显示在屏幕上。

代码及注释

% 读入两张图像

Image = imread('butterfly.bmp'); % 原始蝴蝶图像

Res = imread('IMG3_13.jpg'); % 被叠加图像

% 获取被叠加图像的尺寸信息

[h, w, ~] = size(Res);

% 设定参数

num1 = 20; % 随机产生 20 只蝴蝶

num = 3; % 拟进行几何变化的种类数

for k = 1:num1 % 循环生成随机蝴蝶

    % 在缩小、旋转、三种镜像5种几何变化中随机选择三种

    type = randi(5, 1, num);

    NewImage = Image;

    for n = 1:num % 对每个随机选择的几何变换进行处理

        switch type(n)

            case 1 % scale   缩放变换

                scale = rand(); % 随机生成缩小比例

                NewImage = imresize(NewImage, scale, 'bilinear'); % 缩小图片

            case 2 % rotate   旋转变换

                angle = round(rand() * 100); % 随机生成旋转角度

                NewImage = imrotate(NewImage, angle, 'bilinear'); % 旋转图片

            case 3 % mirroring H  水平镜像

                NewImage = flip(NewImage, 2); % 对图片进行水平镜像

            case 4 % mirroring  V  垂直镜像

                NewImage = flip(NewImage, 1); % 对图片进行垂直镜像

            case 5 % mirroring C   对角镜像

                NewImage = flip(flip(NewImage, 2), 1); % 对图片进行对角镜像

        end

    end

   

    % 获取变换后的蝴蝶图片的尺寸信息

    [newh, neww, ~] = size(NewImage);

   

    % 随机选择叠加位置

    positionx = randi(w - 2 * neww, 1, 1);

    positiony = randi(h - 2 * newh, 1, 1);

   

    % 保存被覆盖的部分,以便后面的还原

    temp = Res(positiony:positiony + newh - 1, positionx:positionx + neww - 1, :);

   

    % 随机交换两个通道的颜色

    colorchange = randperm(3, 2);

    if colorchange(1) ~= colorchange(2)

        color = NewImage(:, :, colorchange(1));

        NewImage(:, :, colorchange(1)) = NewImage(:, :, colorchange(2));

        NewImage(:, :, colorchange(2)) = color;

    end

   

    % 去除背景黑色点,防止在叠加时出现不必要的缺陷

    c = NewImage(:, :, 1) & NewImage(:, :, 2) & NewImage(:, :, 3);

    pos = find(c(:) == 0);

    NewImage(pos) = temp(pos);

    NewImage(pos + newh * neww) = temp(pos + newh * neww);

    NewImage(pos + 2 * newh * neww) = temp(pos + 2 * newh * neww);

   

    % 将变换后的蝴蝶图片叠加到被覆盖图像上

    temp = NewImage;

    Res(positiony:positiony + newh - 1, positionx:positionx + neww - 1, :) = temp;

end

% 增强整张图片的对比度,使得效果更好

Res = imadjust(Res, [], [], 1.5);

% 显示合成图,保存合成结果

imshow(Res), title('合成效果图');

imwrite(Res, 'res.jpg');

显示结果

结果分析

结果是将蝴蝶图片嵌入到风景图片中,并进行了多次随机变换和颜色通道交换。从混合后的图像来看,实现效果相当不错,蝴蝶与风景相融合,形成一幅美丽的画面。具体结果如下:

  1. 通过随机变换(旋转、缩放、平移)可以使蝴蝶图片在空间上得到不同角度和尺寸的展示,增强了图像的多样性和趣味性。
  2. 随机交换蝴蝶图片中的两个色彩通道,可以改变图片的颜色分布,使得混合后的图像更加鲜艳。
  3. 在随机位置将蝴蝶图片叠加到风景图片上,可以使混合后的图像更加自然,同时也增强了视觉冲击力。
  4. 多次重复以上操作,可以得到多组不同的混合效果,使得蝴蝶与风景的关系更加复杂、多样。

问题及解决方案

1.图像太大,无法在屏幕上显示;

解决方案:将图片保存下来,使用别的工具查看图片

2.蝴蝶在合成后没有颜色

解决方案:加深背景颜色,优化饱和度

总结与心得

通过这个实验,我深刻体会到了图像处理的魅力。在这个实验中,我们使用了MATLAB编写代码,通过随机选择几何变换和颜色通道交换等方式,生成了多张随机蝴蝶图片,并将它们叠加到一张被覆盖图像上,形成了一张合成效果图。这个实验让我深刻认识到图像处理对于现代科技和生活的重要性。同时,这个实验也让我认识到了编程的乐趣,通过自己的努力和思考,完成了一个有趣的项目。这也使我更加坚定了学好计算机和编程的决心。总之,这个实验既是对计算机视觉和图像处理基础知识的探索,也是对自身能力的挑战和提升,希望今后还能继续深入学习和应用相关领域的知识。

附录

1.第一题代码:

clc; clear all;

%% 读入图像Image1

Image1=imread('desert.jpg');

%% (1)将Image1色彩通道互换,并显示效果

Image2=Image1;

Image2(:,:,1)=Image1(:,:,2);

Image2(:,:,2)=Image1(:,:,1);

imshow(Image2);

imwrite(Image2,'颜色互换.jpg');

%% (2)将Image1灰度化为gray,并显示灰度化后图像

gray=rgb2gray(Image1);

figure;

subplot(121),imshow(Image1),title('原始图像');

subplot(122),imshow(gray),title('灰度图像');

imwrite(gray,'灰度图像.jpg');

%% (3)采用不同的插值方法实现gray的旋转、放大变换

% 图像旋转

Newgray1=imrotate(gray,15);

Newgray2=imrotate(gray,15,'bilinear');

figure;

subplot(121),imshow(Newgray1),title('旋转15度(最近邻插值)');

subplot(122),imshow(Newgray2),title('旋转15度(双线性插值)');

imwrite(Newgray1,'旋转1.jpg');

imwrite(Newgray2,'旋转2.jpg');

% 图像缩放

Newgray3=imresize(gray,2.5,'nearest');

Newgray4=imresize(gray,2.5,'bilinear');

figure;

subplot(121),imshow(Newgray3),title('放大2.5倍(最近邻插值)');

subplot(122),imshow(Newgray4),title('放大2.5倍(双线性插值)');

imwrite(Newgray3,'缩放1.jpg');

imwrite(Newgray4,'缩放2.jpg');

%% 图像镜像与拼接

Image2 = imread('lotus.JPG');

HImage = flip(Image2, 2);

VImage = flip(Image2, 1);

CImage = flip(HImage, 1);

[h, w, ~] = size(Image2);

h2 = 2 * h;

w2 = 2 * w;

newImage = zeros(h2, w2, 3, 'uint8');

newImage(1:h, 1:w, :) = Image2;

newImage(1:h, w+1:end, :) = HImage;

newImage(h+1:end, 1:w, :) = VImage;

newImage(h+1:end, w+1:end, :) = CImage;

imshow(newImage);

imwrite(newImage, '新莲花.jpg');

%% 加减乘除

% 图像加法

Back=imread('desert.jpg');

Foreground=imread('car.jpg');

result1=imadd(Foreground,-100);

result2=imadd(Back,Foreground);

result3=imadd(Back,result1);

subplot(221),imshow(Foreground),title('原目标图');

subplot(222),imshow(result1),title('原目标图加标量');

subplot(223),imshow(result2),title('原目标图加背景');

subplot(224),imshow(result3),title('加标量图叠加背景');

%图像减法

Back=imread('hallback.bmp');

Foreground=imread('hallforeground.bmp');

result1=imabsdiff(Back,Foreground);

subplot(131),imshow(Back),title('背景图');

subplot(132),imshow(Foreground),title('前景图');

subplot(133),imshow(result1),title('图像相减');

%图像乘法

Back=im2double(imread('bird.jpg'));

Templet=im2double(imread('birdtemplet.bmp'));

result1=immultiply(Templet,Back);

subplot(131),imshow(Back),title('背景');

subplot(132),imshow(Templet),title('模板');

subplot(133),imshow(result1),title('图像相乘');

%图像逻辑

Back=imread('bird.jpg');

Templet=imread('birdtemplet.bmp');

result1=bitcmp(Back);

result2=bitand(Templet,Back);

result3=bitor(Templet,Back);

result4=bitxor(Templet,Back);

subplot(221),imshow(result1),title('求反');

subplot(222),imshow(result2),title('相与');

subplot(223),imshow(result3),title('相或');

subplot(224),imshow(result4),title('异或');

2.蝴蝶飞舞部分代码:

Image = imread('butterfly.bmp');

Res = imread('IMG3_13.jpg');

[h, w, ~] = size(Res);

num1 = 20; % 随机产生 20 只蝴蝶

num = 3; % 拟进行几何变化的种类数

for k = 1:num1

    type = randi(5, 1, num); % 在缩小、旋转、三种镜像5种几何变化中随机选择三种

    NewImage = Image;

    for n = 1:num

        switch type(n)

            case 1 % scale   比例变化

                scale = rand(); % 缩小比例随机生成

                NewImage = imresize(NewImage, scale, 'bilinear'); % 缩小变化,双线性插值

            case 2 % rotate   旋转变换

                angle = round(rand() * 100); % 逆时针旋转角度随机生成

                NewImage = imrotate(NewImage, angle, 'bilinear'); % 旋转变换,双线性插值

            case 3 % mirroring H  水平镜像

                NewImage = flip(NewImage, 2);

            case 4 % mirroring  V  垂直镜像

                NewImage = flip(NewImage, 1);

            case 5 % mirroring C   对角镜像

                NewImage = flip(flip(NewImage, 2), 1);

        end

    end

    [newh, neww, ~] = size(NewImage);

    positionx = randi(w - 2 * neww, 1, 1); % randi 生成均匀分布的伪随机整数

    positiony = randi(h - 2 * newh, 1, 1); % 叠加位置

    temp = Res(positiony:positiony + newh - 1, positionx:positionx + neww - 1, :);

    colorchange = randperm(3, 2);

    if colorchange(1) ~= colorchange(2) % 颜色变化

        color = NewImage(:, :, colorchange(1));

        NewImage(:, :, colorchange(1)) = NewImage(:, :, colorchange(2));

        NewImage(:, :, colorchange(2)) = color;

    end % 色彩通道交换

    c = NewImage(:, :, 1) & NewImage(:, :, 2) & NewImage(:, :, 3);

    pos = find(c(:) == 0); % 找 c 中值为 0 的元素位置

    NewImage(pos) = temp(pos);

    NewImage(pos + newh * neww) = temp(pos + newh * neww);

    NewImage(pos + 2 * newh * neww) = temp(pos + 2 * newh * neww); % 去除几何变换中产生的背景黑色点

    temp = NewImage;

    Res(positiony:positiony + newh - 1, positionx:positionx + neww - 1, :) = temp; % 叠加

end

Res = imadjust(Res, [], [], 1.5);

imshow(Res), title('合成效果图');

imwrite(Res, 'res.jpg');

猜你喜欢

转载自blog.csdn.net/m0_63975371/article/details/131419115
今日推荐