在simulink中实现图像的读取和缩放操作

目录

一、理论基础

1.1 simulink中实现图像的读取和缩放概述

1.2 Simulink实现

二、核心程序

三、仿真测试结果


一、理论基础

1.1 simulink中实现图像的读取和缩放概述

        Simulink是MathWorks公司出品的一款基于MATLAB的图形化仿真工具,可以用于建模、仿真和分析动态系统。Simulink中提供了许多库,包括信号处理、图像处理等。

        在Simulink中实现图像的读取和缩放操作,主要需要用到Simulink的Image Processing Blockset库。

  1. 读取图像:你可以使用"Image File Reader"块来读取图像文件。这个块可以读取多种格式的图像,包括jpg、png、bmp、gif等。只需将图像文件路径作为字符串输入到"Image File Reader"块中,就可以输出图像的矩阵。
  2. 缩放图像:你可以使用"Resize"块来对图像进行缩放。这个块需要两个输入,一个是输入的图像矩阵,另一个是缩放因子。缩放因子可以是小于1的数,此时图像会缩小;也可以是大于1的数,此时图像会放大。这个块的输出是缩放后的图像矩阵。

原理和数学公式:

  1. 读取图像:在图像处理中,读取图像的原理就是将图像文件中的数据读取出来,存储到矩阵中。对于不同的图像格式,存储方式可能会有所不同,但都可以通过相应的函数或块进行读取。
  2. 缩放图像:缩放图像的原理是通过插值算法对图像的像素点进行重新计算,以达到改变图像大小的目的。插值算法有很多种,如最近邻插值、双线性插值、双三次插值等。"Resize"块中默认的插值方法是双线性插值。

双线性插值的数学公式如下:

        假设我们想得到位置(x,y)的像素值,已知其四个相邻像素的值分别为Q11、Q12、Q21、Q22,那么位置(x,y)的像素值P可以通过以下公式计算:

P = (1-x)(1-y)Q11 + x(1-y)Q21 + (1-x)yQ12 + xyQ22

       以上就是在Simulink中实现图像的读取和缩放操作的方法和原理。如果你需要进行更复杂的图像处理操作,Simulink的Image Processing Blockset库还提供了许多其他的块,如滤波、边缘检测、色彩空间转换等。

1.2 Simulink实现

根据MATLAB中的程序可知,图像缩放的核心代码语句如下:

         即,你通过imresize函数,来将图像缩放为所需要大小的新的图像。而Simulink没有这个模块可以直接使用,所以我们将通过simulink中的模块化建模,实现这个函数的基本功能。

        首先是原始图像的读取和显示,具体模块如下所示:

这个部分是实现原始图像的读取和显示的功能。运行后会自动产生如下的原始图像:

二、核心程序

读取Simulink之后,我们需要在simulink中进行图像的缩放功能的实现:

       MATLAB中的IMRESIZE函数,其图像缩放的主要实现原理为:

下面介绍一下SIMULINK的设计步骤:

        这里我之前没注意到,Simulink里面有提供的一个resize模块,但是我们直接使用这个模块,并无法得到比较好的效果。

        因此,我们还是设计了一组自己构建的Simulink模块,但是需要使用Simulink的内嵌MATLAB模块。

整个流程如下所示:

即读入图片,然后获得RGB的三个通道。然后进行如下的处理:

由于读入的图像是UINT8类型的数据,无法直接进行MATLAB的运算,我们需要将数据通过conversion转换为double类型的数据,然后进行处理。

这三个模块分别为放大缩小模块,亮度均衡模块和滤波模块,这样得到放大或者缩小后的模块就比较清晰了。

function J = func_b2cyv_simulink(I);

Parameter_SetUp;
[nrows,ncols,k]=size(I);

width  = W;                              
height = H;

J = zeros(width,height);
 
widthScale = nrows/width;
heightScale = ncols/height;

for x = 3:width-2                            
   for y = 3:height-2
       xx = x * widthScale;                     
       yy = y * heightScale;
       if (xx/double(uint16(xx)) == 1.0) & (yy/double(uint16(yy)) == 1.0)       
           J(x,y) = I(int16(xx),int16(yy));
       else                                    
            a = double(uint16(xx)); % (a,b) is the base-dot 
            b = double(uint16(yy)); 
            x11 = double(I(a,b)); % x11 <- I(a,b) 
            x12 = double(I(a,b+1)); % x12 <- I(a,b+1) 
            x21 = double(I(a+1,b)); % x21 <- I(a+1,b) 
            x22 = double(I(a+1,b+1)); % x22 <- I(a+1,b+1) 
            J(x,y) = sqrt((x11 + x12)^2/4 + (x21+x22)^2/4);
       end
    end
end
  
function J = func_blinear_simulink(I);

Parameter_SetUp;
[nrows,ncols,k]=size(I);

width  = W;                              
height = H;

J = zeros(width,height);
 
widthScale = nrows/width;
heightScale = ncols/height;

for x = 3:width-2                            
   for y = 3:height-2
       xx = x * widthScale;                     
       yy = y * heightScale;
       if (xx/double(uint16(xx)) == 1.0) & (yy/double(uint16(yy)) == 1.0)       
           J(x,y) = I(int16(xx),int16(yy));
       else                                    
            a = double(uint16(xx)); % (a,b) is the base-dot 
            b = double(uint16(yy)); 
            x11 = double(I(a,b)); % x11 <- I(a,b) 
            x12 = double(I(a,b+1)); % x12 <- I(a,b+1) 
            x21 = double(I(a+1,b)); % x21 <- I(a+1,b) 
            x22 = double(I(a+1,b+1)); % x22 <- I(a+1,b+1) 
            J(x,y) = ( (b+1-yy) * ((xx-a)*x21 + (a+1-xx)*x11) + (yy-b) * ((xx-a)*x22 +(a+1-xx) * x12) ); % calculate J(x,y) 
       end
    end
end
  
function J = func_nearest_simulink(I);

Parameter_SetUp;
[nrows,ncols,k]=size(I);

width  = W;                              
height = H;

J = (zeros(width,height));
 
widthScale = nrows/width;
heightScale = ncols/height;

for x = 3:width-2                            
   for y = 3:height-2
       xx = x * widthScale;                     
       yy = y * heightScale;
       if (xx/double(uint16(xx)) == 1.0) & (yy/double(uint16(yy)) == 1.0)       
           J(x,y) = I(int16(xx),int16(yy));
       else                                    
           a = double(round(xx));              
           b = double(round(yy));
           J(x,y) = I(a,b); 
       end
    end
end
 

三、仿真测试结果

仿真结果如下所示:

A23-12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值