FPGA图像处理之边缘检测,中值滤波,图像均衡1。
本来相对较简单,而且网络上能找到的,我都不是很想写,必定我也忙,而且那些基础的东西还比较多,我也不可能全写出来,这样耗用的时间太多。但是关于图像处理这一块,有人跟我说,把简单的这些也写一写吧,网络资源比较少。我接受朋友的建议,简单的写了一些。
边缘检测:原理和算法结构,数字图像处理的书上都有写。这里看来没办法上传文件。我就这里来一个百度网盘链接。http://pan.baidu.com/s/1bnB0aeV(冈萨雷斯的书)。这边书,描述的边缘检测的方法,原理写的都很明白。不多说。但是要注意几点:边缘检测对噪声敏感。所以需要先进行滤波处理。边缘检测是求微分或者说求导数的过程。
matlab函数:image_edge = edge(f,'sobel',0.05);%边缘检测函数。看不懂就要自己去百度查了。
这个非封装的sobel算法。
clc
clear
f=imread('Fig8.02(a).jpg');
if ndims(f) == 3
f=rgb2gray(f);
end
f1 = imresize(f, [256,300]);
IMG_Gray = double(f1);
imshow(f1)
[h w]=size(f1);
% IMG_Sobel = true(h,w); %新建一个数据为1的二值矩阵
THRESHOLD =240;
Sobel_X = [-1, 0, 1, -2, 0, 2, -1, 0, 1];
Sobel_Y = [1, 2, 1, 0, 0, 0, -1, -2, -1]; % sobel_y = sobel_x';取逆也可以完成
for i = 2 : h-1 %舍弃了边缘信息
for j = 2 : w-1
temp1 = Sobel_X(1) * IMG_Gray(i-1,j-1) + Sobel_X(2) * IMG_Gray(i-1,j) + Sobel_X(3) * IMG_Gray(i-1,j+1) +...
Sobel_X(4) * IMG_Gray(i,j-1) + Sobel_X(5) * IMG_Gray(i,j) + Sobel_X(6) * IMG_Gray(i,j+1) +...
Sobel_X(7) * IMG_Gray(i+1,j-1) + Sobel_X(8) * IMG_Gray(i+1,j) + Sobel_X(9) * IMG_Gray(i+1,j+1);
temp2 = Sobel_Y(1) * IMG_Gray(i-1,j-1) + Sobel_Y(2) * IMG_Gray(i-1,j) + Sobel_Y(3) * IMG_Gray(i-1,j+1) +...
Sobel_Y(4) * IMG_Gray(i,j-1) + Sobel_Y(5) * IMG_Gray(i,j) + Sobel_Y(6) * IMG_Gray(i,j+1) +...
Sobel_Y(7) * IMG_Gray(i+1,j-1) + Sobel_Y(8) * IMG_Gray(i+1,j) + Sobel_Y(9) * IMG_Gray(i+1,j+1);
% temp3 = sqrt(temp1^2 + temp2^2);
temp3 = abs(temp1) + abs(temp2); %just for speed
if(temp3 > THRESHOLD)
IMG_Sobel(i,j) = 0; %Black
else
IMG_Sobel(i,j) = 255; %White
end
% IMG_Sobel(i,j)=temp3/8;
end
end
figure ,imshow(IMG_Sobel)
这个也是可以百度的到的
下面是FPGA完成。
// synopsys translate_off
`timescale 1ns/1ns
// synopsys translate_on
module compute(
CLK,
RSTn,
DATA_in,//数据总线
SHIFT_en,//移位寄存器使能信号
Prev_row_load,//加载前一行数据到寄存器
Curr_row_load,//加载当前行数据到寄存器
Next_row_load,//加载下一行数据到寄存器
RESULT_row //运算结果输出
);
input CLK;
input RSTn;
input[7:0] DATA_in;
input SHIFT_en;
input Prev_row_load;
input Curr_row_load;
input Next_row_load;
output[7:0] RESULT_row ;
//--------------------- 计算数据通路信号 -----------------------//
//wire signed [10:0] D;
reg[7:0] abs_D;
reg[7:0] RESULT_row;
//---------------------Assignment-----------------------//
//----------------- module ------------//
//---------------- always ------------//
//the four cycle have one result.
reg[7:0] Prev_row, Curr_row, Next_row;
always@(posedge CLK or negedge RSTn) //上一行寄存器
begin
if (!RSTn)
Prev_row <= 8'd0;
else
if(Prev_row_load)
Prev_row<= DATA_in;
end
always@(posedge CLK or negedge RSTn) //当前行寄存器
begin
if (!RSTn)
Curr_row <= 8'd0;
else
if(Curr_row_load)
Curr_row<= DATA_in;
end
always@(posedge CLK or negedge RSTn) //下一行寄存器
begin
if (!RSTn)
Next_row <= 8'd0;
else
if(Next_row_load)
Next_row<=DATA_in;
end
//---------------- 计算绝对值函数 -----------------//
function [10:0]abs ( input signed [10:0] x);
abs = x >=0 ? x : -x ;
endfunction
//---------------- 计算流水线 -----------------//
reg[7:0] O[-1:1][-1:1]; // reg signed [7:0] O[-1:1][-1:1];
reg signed [10:0]Dx, Dy;
//assign D = abs(Dx) + abs(Dy);
always @(posedge CLK or negedge RSTn)
begin
if (!RSTn)
begin
abs_D<=8'd0; Dx<=8'd0;Dy<=8'd0;O[-1][-1]<=8'd0;O[-1][ 0]<=8'd0;O[-1][+1]<=8'd0;
O[ 0][-1]<=8'd0; O[ 0][ 0]<=8'd0; O[ 0][+1]<=8'd0; O[+1][-1]<=8'd0; O[+1][ 0]<=8'd0; O[+1][+1]<=8'd0;
end
else
if ( SHIFT_en )
begin
//D = abs(Dx) + abs(Dy);
abs_D <= (abs(Dx) + abs(Dy))>>3 ; // add 3bit is the bast. abs_D <=(abs(Dx) + abs(Dy)) 1....
Dx<= -$signed({3'b000, O[-1][-1]})//-1* O[-1][-1]
+$signed({3'b000, O[-1][+1]})//+1* O[-1][+1]
-($signed({3'b000, O[ 0][-1]})<<1)//-2* O[ 0][-1]
+($signed({3'b000, O[ 0][+1]})<<1)//+2* O[ 0][+1]
-$signed({3'b000, O[+1][-1]})//-1* O[+1][-1]
+$signed({3'b000, O[+1][+1]});//+1* O[+1][+1]
Dy<= $signed({3'b000, O[-1][-1]})//+1* O[-1][-1]
+($signed({3'b000, O[-1][ 0]}) <<1)//+2* O[-1][0]
+$signed({3'b000, O[-1][+1]})//+1* O[-1][+1]
-$signed({3'b000, O[+1][-1]})//-1* O[+1][-1]
-($signed({3'b000, O[+1][ 0]}) <<1)//-2* O[+1][ 0]
-$signed({3'b000, O[+1][+1]});//-1* O[+1][+1]
O[-1][-1] <=O[-1][0]; O[-1][ 0]<=O[-1][+1];O[-1][+1]<=Prev_row;
O[ 0][-1] <=O[0][0]; O[ 0][ 0]<= O[0][+1];O[ 0][+1]<=Curr_row;
O[+1][-1] <=O[+1][0]; O[+1][ 0]<= O[+1][+1];O[+1][+1]<=Next_row;
end
end
//---------------- 结果行寄存器 -----------------//
always@(posedge CLK or negedge RSTn)
begin
if (!RSTn)
RESULT_row <=8'd0;
else
if(SHIFT_en)
begin
if (abs_D>8'd40) //阈值分割,也就是matlab里面的THRESHOLD
RESULT_row <= 8'd0; // RESULT_row<= abs_D[11:2] ; 1....
else
RESULT_row<= 8'd255;
end
end
endmodule
FPGA程序和MATLAB程序的对于关系应该很明显了。
最后我还是把全套的资料和程序发上来了。又给各位偷懒的机会了。(我刚才去百度了一下Verilog 中值滤波。还是能找到相关程序的,所以决定中值滤波和图像均衡等,不在发表)
我能力有限,但是我愿意分享的技术,希望各位快速成长。
如果有图像处理,模式识别,数据挖掘的问题,可以直接留言。如果我有兴趣,我会努力帮忙。
转载于:https://www.cnblogs.com/maohuawang/p/3807224.html
FPGA图像处理之边缘检测,中值滤波,图像均衡1。相关推荐
- FPGA图像处理仿真实验——中值滤波
1.中值滤波原理 中值滤波属于统计排序滤波,对窗口内的像素值进行排序并通过多路选择器选择使用排序后的值,可以是最大值.最小值.中值等.排序滤波用接近中间位置的排序值作为输出,进行图像的平滑滤波,能得到 ...
- FPGA verilog HDL实现中值滤波
FPGA verilog HDL实现中值滤波 今天给大侠简单带来FPGA verilog HDL实现中值滤波,话不多说,上货. 一.实现步骤: 1.查看了中值滤波实现相关的网站和paper: 2.按照 ...
- 数字图像处理,自适应中值滤波的C++实现
自适应中值滤波的原理 自适应中值滤波的思想是根据噪声密度改变滤波窗口的大小,同时对噪声点和信号点采取不同的处理方法.对噪声点进行中值滤波,对信号点保持其灰度值不变. 设为fij为点(i,j)的灰度值, ...
- 图像处理实验,中值滤波处理椒盐噪声
一.实验目的 图像变换是数字图像处理中的一种综合变换,如直方图变换.几何变换等.通过本实验,掌握中值滤波处理. 二.实验任务 设计程序,用中值滤波法(模板的大小为3×3).进行去噪处理. 得出实验结果 ...
- 数字图像处理实验(三)|图像增强{归一化直方图imhist(f)/numel(f)、直方图均衡化histeq、生成线性空间滤波fspecial、中值滤波medfilt2}(附matlab实验代码截图)
文章目录 一.实验目的 二.实验原理 1. 基本亮度变换函数 2.直方图均衡化 3.空间域滤波 三.预备知识: 四.实验内容 1.灰度修正 2.直方图均衡化: 3.空间域滤波 4. 频域率滤波 五.思 ...
- 图像处理之平滑滤波、高斯滤波和中值滤波
图像的滤波 图像的滤波概念 平滑滤波 高斯滤波 中值滤波 图像的滤波概念 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到 ...
- FPGA中值滤波实现并Modelsim仿真,与MATLAB中值滤波进行对比
文章目录 一.中值滤波算法 二.FPGA实现中值滤波 2.1 3*3窗口的生成 2.2 排序模块 2.3中值滤波模块 2.4 整体RTL图 三.modeslim仿真 四.matlab中值滤波 五.效果 ...
- C语言实现图像中值滤波与均值滤波
中值滤波 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波容易去除孤立点,线的噪声同时保持图象的边缘,对椒盐噪声有较好的滤波效果:它能很好 ...
- 实时高速实现改进型中值滤波算法_爱学术_免费下载
[摘要]在图像采集和处理过程中会引入噪声,必须先对图像进行预处理.本文介绍一种快速中值滤波算法,该算法在硬件平台上实现实时处理功能.综合考虑,选择现场可编程门阵列(FPGA)作为硬件平台,采用硬件描述 ...
- C++手敲灰度图均值滤波中值滤波高斯滤波
一.均值滤波(Meaning Filtering)概念 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板 ...
最新文章
- ISME: 北大吴晓磊课题组揭示合作演化新机制:“自私”驱动合作关系的建立?...
- 【tensorflow】OP_REQUIRES failed at variable_ops.cc:104 Already exists: Resource
- MySQL流程控制函数
- 异源遥感图像匹配的一种思路——智箭火眼2020科目三赛题总结
- python pytest
- 分布式服务-DUBBOX(五):集成服务生产者
- 谈一下ACM的入门书籍及方法
- 软件测试工程师经典面试题
- 弹性均质圆环法计算过程_盾构隧道衬砌管片计算方法的比较
- win10u盘被写保护怎么解除_win10系统磁盘被写保护如何解除 磁盘被写保护解除方法...
- 似幻亦真 教你踏足网络仿真的云外之境
- Unity鼠标事件详解
- 实操:WDS安装win系统
- noip2018翻车记
- 案牍写作中要留意的问题
- WebRtc以Trickle ICE形式去进行pair
- Linux下重要日志及查看方式
- DMZ 主机的 Windows 共享文件夹
- Python一键生成纯色图片
- Gradle如何排除依赖项目的某些包