Matlab实现均值滤波与FPGA进行对比,并采用modelsim波形仿真

article/2025/11/7 11:18:04

文章目录

  • 一、实验目标
  • 二、实验中遇到的问题
    • 1、如何实现均值滤波
    • 2、modelsim仿真的时候涉及到IP核不存在怎么办?
  • 三、具体实现
    • 3.1 均值滤波的实现
      • 3.1.1 调用shift_ram ip核:
      • 3.1.2 均值滤波的流水并行处理
    • 3.2 整体模块设计
      • 3.2.1 图像生成模块
      • 3.2.2 Ycbcr灰度化
      • 3.2.3 3*3窗口生成
      • 3.2.4 均值滤波模块
    • 3.3 波形仿真验证
  • matlab实现均值滤波

本文的方法和 联合仿真实现Ycbcr的方法相同。不再重复叙述。

一、实验目标

在Ycbcr灰度化基础上进行均值滤波。

二、实验中遇到的问题

1、如何实现均值滤波

2、modelsim仿真的时候涉及到IP核不存在怎么办?

如下图,我们调用了shift_ram ip核,不添加库文件的话,独立仿真时报错

在这里插入图片描述
解决方法:
将器件库添加上即可。
选择simulation —— start simulation——Libraries——Add,添加库文件
在这里插入图片描述

库文件所在位置:modelsim安装位置,modelsim-ase——aletra——Verilog——altera_mf || cyclonev(根据所用开发板型号选择)

在这里插入图片描述

三、具体实现

3.1 均值滤波的实现

1、这部分包含两个模块:3*3窗口生成模块以及均值滤波算法实现模块。(参考其他博文,理论部分不在讲解)
2、33窗口生成模块:filter_33;——调用了shift_ram ip核
3、均值滤波模块 :mean_filter;——采用三级流水线的方式进行处理。流水线技术是FPGA常用的思想。


3.1.1 调用shift_ram ip核:

在这里插入图片描述


3.1.2 均值滤波的流水并行处理

如下我们可得到均值滤波的公式:mean_data = P11 + P12 + P13 + P21 + P23 + P31 +P32 + P33 / 8;将其拆成三级流水线并行处理的形式:

第一级流水线并行处理:
P1 = P11 + P12 + P13 ;P2 = P21 + P23 ;P3 = P31 +P32 + P33;
.
第二级流水线处理:
P = P1 + P2 + P3;
.
第三级流水线处理:
P >> 3 或者取高位

在这里插入图片描述

3.2 整体模块设计

图像生成模块(VGA模块+数据的获取);
Ycbcr灰度化模块;
3*3窗口生成模块;
均值滤波模块:
在这里插入图片描述

3.2.1 图像生成模块

module img_gen (
//系统全局信号
input	wire			       	clk			,	
input	wire				     rst_n		,	  
//原图输出 ----------------------------------------
output	wire				   img_hsync	,	//原图行同步信号
output	wire				   img_vsync	,	//场同步信号
output	reg  	[23:0]		   img_data		,	//原图像数据信号
output	reg					   img_de			//数据有效指示信号
);
endmodule 

该模块数据的获取如下:
当quartus查看RTL图的时候,由于不可综合,将其引去即可。

initial begin$readmemh("pre_img.txt", ram);
end

3.2.2 Ycbcr灰度化

该模块不变。

module RGB_Gray
//========================< 端口 >==========================================
(
input   wire				clk		,	//时钟
input   wire				rst_n	,	//复位
//原图 ----------------------------------------------
input   wire				RGB_hsync,
input   wire				RGB_vsync,
input   wire    [23:0]      RGB_data,
input   wire				RGB_de ,
//灰度转换图 ---------------------------------------------- 
//这里的行场有效信号和数据信号根据消耗时钟打三拍,作为下一模块输入
output  wire			gray_hsync, 
output  wire			gray_vsync, 
output  wire			gray_de,
output  wire	[7:0]	gray_data);

3.2.3 3*3窗口生成

module filter_3x3(input clk,input rst_n,
//灰度化打拍后的行场有效以及数据有效信号input  gray_hsync, input  gray_vsync,input  gray_de   ,input [7:0] iData,
//根据3*3窗口生成模块实际消耗时钟进行延迟output  filter_hsync, output  filter_vsync				, output  filter_de,
//生成的3*3窗口数据	 output reg [7:0] oData_11, oData_12, oData_13,output reg [7:0] oData_21, oData_22, oData_23,output reg [7:0] oData_31, oData_32, oData_33
);

3.2.4 均值滤波模块

module mean_filter(input clk,input rst_n,//来自3*3窗口生成模块 input   wire				filter_hsync				, input   wire				filter_vsync				,input   wire				filter_de					,
//生成的3*3窗口数据input   [7:0]     filter_11,filter_12,filter_13, input   [7:0]     filter_21,filter_22,filter_23,input   [7:0]     filter_31,filter_32,filter_33,
//均值处理后行场、数据有效信号根据消耗时钟打拍	 output  			  mean_hsync			  	, output  			  mean_vsync				, output  			  mean_de    ,output   [7:0]     mean_data  // 最终均值,3x3模板总和/8);

3.3 波形仿真验证

1、tb测试文件不变。
仍然处理后的640*480个数据写入到txt文档中。


//打开post_img.txt文件
//---------------------------------------------------
integer post_img_txt;initial beginpost_img_txt = $fopen("post_img.txt");
end//像素写入到txt中
//---------------------------------------------------
reg [20:0] pixel_cnt; //640*480 = 307200 ,对这些像素逐个写入always @(posedge clk) beginif(!rst_n) beginpixel_cnt <= 0;endelse if(VGA_de) beginpixel_cnt = pixel_cnt + 1;$fdisplay(post_img_txt,"%h",VGA_data);if(pixel_cnt == IMG_H*IMG_W)$stop;end
end

2、波形分析

以第一行数据为例
img_de : 原图数据有效信号
img_data:原图数据
gray_de:灰度化数据有效信号
gray_data:灰度化的图像数据 = iData
在这里插入图片描述
filter_de : 33窗口生成数据有效信号
oData11 - 33 :3
3窗口的数据
mean_de : 均值滤波数据有效信号
mean_data : 3*3窗口数据的均值
VGA_de : VGA有效数据信号 = mean_de

第一个均值:164 / 8 = 20
第二个均值:(164 + 1580) / 8 = 40
第三个均值:(164 + 158 + 153 ) / 8= 59 ……

matlab实现均值滤波

matlab均值滤波:

x=imread('pre_img.jpg');%需要过滤的图像
n=3;    %模板大小
[height, width]=size(x);   %获取图像的尺寸(n小于图片的宽高)
gdata = rgb2gray(x);
imshow(gdata),title('原图灰度化'); 
for i=1:height-n+1  for j=1:width-n+1  c=x(i:i+(n-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c  e=c(1,:);      %e中存放是c矩阵的第一行  for u=2:n  %将c中的其他行元素取出来接在e后使e为一个行矩阵 e=[e,c(u,:)];          end  s=sum(e);      %取一行的和  x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n);   %将模板各元素的均值赋给模板中心位置的元素  end  
end    
d=uint8(x);  %未被赋值的元素取原值 
C=rgb2gray(x);  %灰度处理,灰度处理后的图像是二维矩阵
A=fspecial('average',[n,n]);  %matlab中自带值滤波函数
b=imfilter(C,A);
figure;
imshow(b),title('均值滤波'); %显示过滤后的灰度图片
imwrite(b,'matlab均值滤波.jpg');

结果:

在这里插入图片描述
在这里插入图片描述

由于灰度化处理以及均值滤波求解的时候均存在精度问题,可能导致与matllab处理后的像素值存在微小差异。不是重点,观察均值滤波的效果,可看到二者均值滤波处理后的图像均变模糊。


更简化的均值滤波工程,读入图像的方式不同,着重看均值滤波算法实现部分即可。


http://chatgpt.dhexx.cn/article/D22qZMhF.shtml

相关文章

图像处理中调用matlab自带均值滤波、高斯滤波和中值滤波函数的案例以及自编均值滤波的案例。

[TOC](利用matlab自带均值滤波器的代码&#xff0c;分别对一幅图像实现3*3&#xff0c;5*5&#xff0c;7*7&#xff0c;9*9的均值滤波&#xff0c;并对实验结果进行分析。) [TOC](分别给干净图像添加高斯和椒盐噪声&#xff0c;然后进行均值滤波、高斯滤波和中值滤波&#xff…

MATLAB几何均值滤波

% 几何均值滤波 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 im imread(brain.bmp); % 原图像 im imnoise(im,gaussian,0,1e-3); % 原图像 白噪声im1 geometry_fspecial(…

Matlab 均值滤波与中值滤波

%%以下是本人在学习中的个人理解&#xff0c;如有错误请指出 所谓的滤波就是一个系数矩阵&#xff08;也称为模板&#xff0c;滤波器&#xff0c;滤波模板&#xff0c;核&#xff0c;掩模或者窗口&#xff09;&#xff0c;然后用这个模板对应图像矩阵&#xff08;填充0后的图像…

matlab均值滤波,中值滤波

滤波核33的均值滤波。 Fimread(D:\Desktop\66.png); Frgb2gray(F); fdouble(F); [row,col]size(f); f1zeros(row,col);for i2:row-1for j2:col-1fx[f(i-1,j-1),f(i-1,j),f(i-1,j1),f(i,j-1),f(i,j),f(i,j1),f(i1,j-1),f(i1,j),f(i1,j1)];f1(i,j)sum(fx,all)/9/256; end end fi…

matlab均值滤波实现

一、噪声添加 椒盐噪声&#xff1a; I_noisedouble(imnoise(I,salt & pepper,0.02));%后面0.02为参数高斯噪声&#xff1a; I_noisedouble(imnoise(I,gaussian,0.02));二、均值滤波原理 主要思想为邻域平均法&#xff0c;即用几个像素灰度的平均值来代替每个像素的灰度。…

MATLAB均值滤波

% 中值滤波 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 [filename ,pathname]… uigetfile({‘.bmp’;.jpg’;},‘选择图片’); % 选择图片路径 str [pathname filename]; % 合成路径文件名 im imr…

MATLAB--数字图像处理 均值滤波

均值滤波 代码&#xff1a; timread(a1.jpg); [m,n,z]size(t); t1imnoise(t,gaussian,0,0.02); imshow(t1),title(加入高斯噪声后) t2t; for i1:m-2 for j1:n-2 t2(i1,j1,:)round(t2(i,j,:)/9t2(i,j1,:)/9t2(i,j2,:)/9t2(i1,j,:)/9t2(i1,j1,:)/9t2(i1,j2,:)/9t2(i2,j,:)/9t2(i2…

均值滤波原理及matlab实现代码

一、基本原理 噪声点像素的灰度与其邻域内像素的灰度显著不同,根据噪声点的这一特性,可以使用邻域均值滤波来降低噪声。   利用一个大小为mn的模板对一幅大小为MN的图像进行均值滤波可以表示为如下公式,其中m=2a+1,n=2b+1:   在实际应用中,可以根据不同需要选择不同…

matlab 均值滤波实现

均值滤波是指用当前像素点周围 N个像素值的均值来代替当前像素值&#xff0c;本质对领域内的矩阵求均值。它通常用于去除图像中高斯噪声。原理示意下图所示: matlab代码实现: clc; clear all; close all;RGB_data imread(G:\picture_deal\matlab_code\mangguo.bmp);%图像读入…

均值滤波(matlab)

**均值滤波&#xff1a;**在图像上对目标像素给一个模板&#xff0c;该模板包括了其周围的临近像素&#xff0c;再用模板中的全体像素的平均值来代替原来像素值。 缺点&#xff1a;均值滤波本身存在着固有的缺陷&#xff0c;即它不能很好地保护图像细节&#xff0c;在图像去噪的…

保护版权,用 Python 为图片添加盲水印

如果你想保护自己的原创图片&#xff0c;那最好的方式就是为图片添加盲水印&#xff0c;盲水印就是图片有水印但人眼看不出来&#xff0c;需要通过程序才能提取水印&#xff0c;相当于隐形“盖章”&#xff0c;可以用在数据泄露溯源、版权保护等场景。今天分享如何用 Python 为…

opencv实现盲水印

主要用于图片版权追溯&#xff0c;用户指纹识别等场景&#xff0c;保证用户版权以及作为防盗反爬关键性法律证据。 opencv环境 windows 解压opencv-3.4.2.tar.gz&#xff0c;项目运行是在VM options中加入库环境-Djava.library.pathD:\opencv3.4.2\opencv\build\java\x64;D:…

盲水印添加,获取接口

添加水印&#xff0c;水印生成&#xff0c;获取水印 一、接口介绍 通过上传原始图片和水印图,生成带有隐性水印图的图片。既保持图片的美观性&#xff0c;又能保证图片的版权防护与追踪。这样便于在不破坏原有图片的情况下&#xff0c;实现版权保护。 二、功能体验 三、特色优…

java 添加盲水印_图片加数字盲水印

本文通过一个的实验&#xff0c;简要介绍频域手段添加数字盲水印的方法&#xff0c;并进一步验证其抗攻击性。在上述实验的基础上&#xff0c;总结躲避数字盲水印的方法。(多图预警) 本文分为五个部分&#xff0c;第一部分综述&#xff1b;第二部分频域数字盲水印制作原理介绍&…

使用 Python 给图片添加水印,其中一种还是隐形的盲水印呢!

文章目录 使用 Pillow 库为图片添加半透明水印使用 blind_watermark 库为图片添加盲水印安装嵌入水印提取水印 如何给图片添加水印呢&#xff1f;在 Python 的世界里&#xff0c;有多种方法可以为图片添加水印。 其中一种方法&#xff0c;可以使用大名鼎鼎 Pillow 库&#xff…

python 3.6 盲水印脚本安装说明

python 3.6 盲水印脚本安装说明 安装盲水印踩了不少坑&#xff0c;所以记录一下。 本机环境&#xff1a; windows10 python3.6 脚本安装地址&#xff1a; BlindWaterMark 下载解压即可 安装脚本的依赖库 opencv-python 4.2.0.34 matplotlib 2.1.1 安装命令&#xff1a; …

信息隐藏-图像盲水印实现

相关知识 目前水印大抵可分为两种&#xff0c;可见和不可见&#xff0c;可见水印大多用来标记或声明版权&#xff0c;或防盗用冒用&#xff0c;但在影院、绘画等场景下&#xff0c;可见性水印会极大影响用户体验&#xff0c;所以产生了盲水印的概念。 盲水印即看不见的水印&am…

Python给图片添加盲水印

文章目录 简介安装初试遇到的坑参考文献 简介 盲水印就是图片有水印但人眼看不出来&#xff0c;需要通过程序才能提取水印&#xff0c;相当于隐形“盖章”&#xff0c;可以用在数据泄露溯源、版权保护等场景。 该库出自阿里巴巴安全团队&#xff0c;强大之处&#xff1a; 解…

Opencv实现盲水印技术(三)——傅里叶变换算法及盲水印实现

前言 之前的文章中&#xff0c;介绍了如何构建Java工程和Java Web工程&#xff0c;本文将简单介绍对傅里叶变换的理解&#xff0c;以及使用opencv实现盲水印。关于傅里叶变换&#xff0c;有篇博文介绍的很详细&#xff0c;链接地址为&#xff1a;看了此文你还不了解傅里叶变换&…

双图+盲水印

1.双图 打开压缩包&#xff0c;发现有两张图片 first1和second.png&#xff0c;使用Stegsolve打开first1.png进行一次异或处理 然后分析选择结合second.png得到 用stegslove对二维码进行运算得到三张二维码 扫描结果是DES 6XaMMbM7 和一长串字符&#xff0c;很显然是des加密&a…