(1)了解和掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数,并为下一步编程进行图像处理打下基础。
(2)理解色彩的概念,掌握图像代数运算,几何变换方法。
1. 打开一幅彩色图像Image1,使用Matlab图像处理函数,对其进行下列变换:
(1)将Image1色彩通道互换,并显示效果;
(2)将Image1灰度化为gray,并显示灰度化后图像;
(3)采用不同的插值方法实现gray的旋转、放大变换;
(4)打开另一幅彩色图像Image2,和Image1进行代数运算,要求运用拼接、加减乘除等多种技术;
2.拓展内容:完成参考ppt的综合实例
有一幅蝴蝶、一幅风景图片,基于几何、代数和色彩通道运算,编程实现漫天蝴蝶飞舞的合成图像。
设计思路:对蝴蝶图片进行随机变换后叠加到风景图片上,依次进行的随机变换为:三种几何变换、交换两个色彩通道、叠加到风景图片随机位置上。
(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('异或');
结果分析
- 将Image1的红色和绿色通道做了交换,得到了Image2,并将其显示出来;
- 将Image1转为灰度图像,得到gray,并将其显示出来;
- 对gray进行了旋转和放大,分别使用了最近邻插值和双线性插值两种插值方法,并将结果显示出来;
- 对一张图像进行了镜像,并将四张图像拼接成一张新的图像,并将其显示出来;
- 实现了图像加、减、乘、除以及逻辑运算,并将结果显示出来。
2.拓展内容:完成参考ppt的综合实例
有一幅蝴蝶、一幅风景图片,基于几何、代数和色彩通道运算,编程实现漫天蝴蝶飞舞的合成图像。设计思路:对蝴蝶图片进行随机变换后叠加到风景图片上,依次进行的随机变换为:三种几何变换、交换两个色彩通道、叠加到风景图片随机位置上。
设计思路
- 读入两张图像,即原始蝴蝶图像和被叠加图像。
- 设定参数,包括要生成的随机蝴蝶数量、拟进行几何变化的种类数等。
- 循环生成随机蝴蝶:在缩小、旋转、三种镜像五种几何变化中随机选择三种,对每个随机选择的几何变换进行处理,并随机选择叠加位置,保存被覆盖的部分以便后面的还原,随机交换两个通道的颜色,去除背景黑色点。
- 将变换后的蝴蝶图片叠加到被覆盖图像上。
- 增强整张图片的对比度,使得效果更好。
- 显示合成图,保存合成结果。
总的来说,该段代码通过随机选择几何变换和叠加位置,实现了对多个图像的随机组合,从而达到了创造新图片的目的。
通过多次随机重复这一过程,可以得到不同的混合效果。代码最后将混合后的图像保存在本地,同时显示在屏幕上。
代码及注释
% 读入两张图像
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.蝴蝶在合成后没有颜色
解决方案:加深背景颜色,优化饱和度
总结与心得
通过这个实验,我深刻体会到了图像处理的魅力。在这个实验中,我们使用了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');
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/8665.html