使用matlab进行简单图像处理

实验资源:

实验要求:

使用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');

figure;命令显示的变换后图片。

这个版本的命令很简洁的样子,查阅一下其中的关键函数

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)图像Ibmp是bitmap,返回扩大图像JSE是由streloffsetstrel函数返回的结构元素对象或结构元素对象的数组 。

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);

支持的输入参数(要转换的图像)

指定为任何类的非稀疏数值数组,除了uint64int64,或逻辑数组。

数据类型:single | doubleint8int16int32uint8uint16uint32|logical

简单而快乐~

发布了46 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36808245/article/details/100916130