在simulink中实现图像的读取和缩放操作
Posted fpga和matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在simulink中实现图像的读取和缩放操作相关的知识,希望对你有一定的参考价值。
目录
作者ID :fpga和matlab
CSDN主页:https://blog.csdn.net/ccsss22?type=blog
擅长技术:
1.无线基带,无线图传,编解码
2.机器视觉,图像处理,三维重建
3.人工智能,深度学习
4.智能控制,智能优化
5.其他
一、理论基础
根据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
以上是关于在simulink中实现图像的读取和缩放操作的主要内容,如果未能解决你的问题,请参考以下文章