实验资源:
实验要求:
使用matlab 读取Lena.bmp图像,并将其显示为:
1、原始图像
2、左右翻转的图像
3、上下翻转的图像
4、放大一倍的图像
5、显示其直方图
6、图像向右下方平移半个图像长宽的距离
没有以分号结尾的话就会显示出数据内容
lena=imread("e:\lena.bmp");
imshow(lena);
lena2=flip(lena,2);
imshow(lena2);
lena3=flip(lena);
imshow(lena3);
lena4=imresize(lena,2);
imshow(lena4);
h=histogram(lena,255)
不以分号结尾。
这是lena的直方图:
imshow(lena5)显示的是一个比lena要更亮一点的图片(直方图均衡化)
原理版:
% lena=imread("e:\lena.bmp");
[R, C] = size(lena); % 获取图像大小
res = zeros(R, C); % 构造结果矩阵。每个像素点默认初始化为0(黑色)
delX = 128; % 平移量X 原始图像的一半直接256/2指定128了,
% delX = R/2; % 平移量X
% delY = C*0.5; % 平移量Y,这些写法都可以
delY = 128; % 平移量Y
tras = [1 0 delX; 0 1 delY; 0 0 1]; % 平移的变换矩阵
for i = 1 : R
for j = 1 : C
temp = [i; j; 1];
temp = tras * temp; % 矩阵乘法
x = temp(1, 1);
y = temp(2, 1);
% 变换后的位置判断是否越界
if (x <= R) & (y <= C) & (x >= 1) & (y >= 1)
res(x, y) = lena(i, j);
end
end
end;
imshow(uint8(res)); % 显示图像
函数版:
se=translate(strel(1),[128 128]);%构造结构元素
res=imdilate(lena,se);%形态学膨胀
figure;%显示图片框,以下内容都会显示在里面
subplot(1,2,1),subimage(lena);
title('orginal image');
subplot(1,2,2),subimage(res);
title('translate image');
这个版本的命令很简洁的样子,查阅一下其中的关键函数
translate 参考:https://ww2.mathworks.cn/help/matlab/ref/polyshape.translate.html
strel 参考:https://blog.csdn.net/qq_36792959/article/details/98979959
https://blog.csdn.net/qwerasdf_1_2/article/details/54376657
imdilate 参考:http://www.ece.northwestern.edu/support/local-apps/matlabhelp/toolbox/images/imdilate.html
https://www.mathworks.com/help/images/ref/imdilate.html
相关原理:
当我们直接使用translate对lena进行操作时会报错,translate支持的是
输入 polyshape
,指定为标量、向量、矩阵或多维数组。
数据类型: polyshape
strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数。
SE =STREL('arbitrary',NHOOD) 创建一个指定邻域的平面结构化元素。NHOOD是一个包含1/0的矩阵;1的位置定义了邻域的形态学操作。NHOOD的中心就是它的中心元素,位置在FLOOR((SIZE(NHOOD) + 1)/2)。你也可以忽略参数串'arbitrary'而只使用STREL(NHOOD)。
随后实验证明strel(n)(n>1)都是和1一样的邻域大小
J
= imdilate(I
,SE
)
扩大灰度,二进制或打包二进制(packed binary image)图像I
,bmp是bitmap,返回扩大图像J
。SE
是由strel
或offsetstrel
函数返回的结构元素对象或结构元素对象的数组 。
J
= imdilate(I
,nhood
)
扩展图像I
,其中nhood
是多个0
和多个1
的矩阵,指定结构元素邻域。imdilate
确定邻域的中心元素floor((size(nhood)+1)/2)
。
这个语法相当于 imdilate(I,
strel
(nhood))
个人猜想:
以上思路就应当是想要使用translate 但是图像不是polyshape结构,所以先创造一个通用的结构元素(类似于java里的object),进行平移后再使用形态学函数填充结构元素。
在查阅上述原理的时候,由translate想到有没有支持通用图像的平移函数呢?毕竟是强大的matlab
果然找到了!
imtranslate
参考文档:
https://www.mathworks.com/help/images/ref/imtranslate.html
一步到位版:
lena6 = imtranslate(lena,[128, 128],'FillValues',255);%底色填充为白色
lena6 = imtranslate(lena,[128, 128],'FillValues',0);%底色填充为黑色
>> [R, C] = size(lena); % 获取图像大小
>> lena6 = imtranslate(lena,[R*0.5,C*0.5],'FillValues',0);
>> imshow(lena6);
支持的输入参数(要转换的图像)
指定为任何类的非稀疏数值数组,除了uint64
和int64
,或逻辑数组。
数据类型:single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
|logical
简单而快乐~