打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
FPGA数字图像处理实战——中心差分变换(Verilog)

目录/contents

● 中心差分变换概述

● 中心差分变换原理

● 中心差分变换特点

● 中心差分变换应用

● 中心差分变换实现

● 中心差分变换Matlab代码

● 中心差分变换Verilog代码

● 实现效果分析

01

中心差分变换概述

中心差分变换是一种常见的图像处理算法,用于获取图像的边缘和梯度信息,分析像素的灰度变化率或颜色变化率,有利于提取图像的特征信息,从而应用于目标识别、目标跟踪、图像分割等领域。

梯度是变量在相应位置变化率的度量参数,作为离散变量,图像梯度只能以有限差分的形式近似计算图像梯度信息。差分运算通常分为前向差分、后向差分和中心差分,不同的差分运算在不同的应用场景中表现出差异性较强的精确度和计算效率。

1.1 中心差分变换原理

差分变换是一种用于计算数据间差异变化的运算,可以求解数据在相应位置的变化率,通常可以分为前向差分、后向差分和中心差分,不同差分变换的计算公式:

  • 前向差分:

  • 后向差分:

  • 中心差分:

因为中心差分是求前向差分和后向差分的平均值,所以中心差分变换对梯度的求解更加精确。

在数字图像处理中,由于图像数据是离散信号,所以差分图像就是由目标场景在连续相邻时间点的图像相减所构成的。中心差分图像通过计算每个像素点的梯度值,获取图像的边缘信息,用于图像边缘检测、特征提取和目标识别与追踪等方面,其计算公式:

中心差分变换处理前后图像对比:

中心差分变换可以用于图像的水平方向或数值方向,对梯度信息求解较为准确,但计算量较大,仅适用于连续和平滑的图像,对于非连续或非平滑的图像,如纹理丰富的图像或者包含大量细节的图像,中心差分变换可能无法提供良好的梯度信息。

1.2 中心差分变换特点

中心差分变换的特点主要包括:

  • 准确性:中心差分变换可以提供较为准确的梯度和边缘信息,通过考虑相邻数据点的差异,捕捉到图像中的细节和变化,并提供精确的梯度计算;

  • 保留空间信息:中心差分变换在计算导数的同时考虑到目标点的前后两个相邻点,因此能够保留更多的空间信息。对于图像边缘检测和特征提取等任务而言,中心差分变换可以更好地捕捉到图像中的边缘和细节;

  • 平滑性:中心差分变换通过计算邻域内的差异来获得梯度信息,可以视为对图像进行平滑处理的一种方式,这种平滑性可以减少图像中的噪声,有利于后续图像的处理和分析;

  • 灵活性:中心差分变换可以根据需要进行不同级别的差分操作,从而获得不同精度的梯度信息,通过调整差分的步长,可以控制梯度计算的精确度和计算量,从而满足不同应用的需求;

  • 敏感性:中心差分变换计算导数时使用了邻域内的差异,如果图像中存在较多噪声或者细节变化较大的区域,可能会导致梯度计算的不稳定性;

  • 计算量大:中心差分变换需要计算目标点的前后两个邻居点的差异,因此在进行差分计算时需要更多的计算量。对于大尺寸的图像或者实时处理的应用,中心差分变换可能会带来较大的计算负担;

  • 运算局限性:中心差分变换虽然能够提供比较准确的梯度信息,但它只能计算二阶导数,无法获得更高阶导数的信息。在某些情况下,高阶导数的信息对于图像处理任务可能是必要的,而中心差分变换无法提供这些信息。

1.3 中心差分变换应用

中心差分变换广泛应用于图像处理和计算机视觉领域,常见应用场景包括边缘检测、角点检测、图像增强、图像平滑、光流估计和形态学运算等:

  • 边缘检测:中心差分变换可以用于检测图像中的边缘信息,通过计算像素点的梯度大小和方向,找到图像中的边缘区域,用于目标检测和图像分割;

  • 角点检测:中心差分变换可以用于检测图像中的角点信息,通过计算像素点的二阶导数,可以找到图像中的角点信息,用于特征提取和特征匹配;

  • 图像增强:中心差分变换可以用于图像增强处理,通过差分运算突出图像中的边缘和细节,从而改善图像的质量;

  • 图像平滑:中心差分变换可以用于图像平滑处理。通过计算像素点的梯度平均值,可以降低图像中的噪声,使图像更加平滑;

  • 光流估计:中心差分变换可以用于计算图像中的光流,通过计算像素点在两个时间点上的差异,可以估计出图像中的物体运动情况,用于视频分析和目标跟踪。

  • 形态学运算:中心差分变换可以用于形态学运算,例如腐蚀和膨胀。通过计算像素点的邻域差值,可以改变图像中物体的形状和大小,用于形态学图像处理。

02

中心差分变换实现

基于中心差分变换原理,对分辨率为1920×1080的图像进行中心差分运算:

2.1 中心差分变换Matlab代码

基于Matlab实现图像中心差分变换:

Matlab图像中心差分变换代码:

%********************************************************************** 

% -------------------------------------------------------------------

% Company: Cascatrix

% Engineer: Carson

%  

% Create Date: 2023/10/19

% Design Name: central_difference

% Module Name: central_difference

% Tool Versions: v1.0

% Description: Central Difference Processing

%------------------------------------------------------------------- 

%*********************************************************************/

clear;clear all;clc;

% Image resolution

row = 1080;  

col = 1920;  

n   = 3;    

% Create output image

image_in = uint8(zeros(row,col,n));

FileImage = fopen('image_in.txt','r');

for x = 1:row

    for y = 1:col

        RGB = fscanf(FileImage,'%s',1);

        image_in(x,y,1) = uint8(hex2dec(RGB(1:2)));

        image_in(x,y,2) = uint8(hex2dec(RGB(3:4)));

        image_in(x,y,3) = uint8(hex2dec(RGB(5:6)));              

    end 

end

fclose(FileImage);

image_mid_diff = zeros(row,col,n);

for i = 1:3

    image_path=image_in(:,:,i); 

    image_pad = padarray(image_path,[1,1],'symmetric','both');

    image_mid_diff(2:row-1,2:col-1,i)= (image_pad(3:row,3:col)-image_pad(1:row-2,1:col-2))/2;

end

image_mid_diff = image_mid_diff(2:end-1,2:end-1,:);

figure

subplot(121);

imshow(image_in), title('the original image');

subplot(122);

imshow(image_mid_diff), title('the processed image');

Matlab代码运行输出结果:

通过分析处理前后的图像发现,中心差分变换可以有效求出图像梯度信息。

2.2 中心差分变换Verilog代码

基于Matlab与Verilog联合仿真工程,设计中心差分变换模块,对图像RGB通道分别进行中心差分运算,核心模块中心差分变换模块 cx_central_difference.v:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company: Cascatrix

// Engineer: Carson

// 

// Create Date: 2023/10/20

// Design Name: Image_Central_Difference

// Module Name: cx_central_difference

// Tool Versions: v1.0

// Description: Image central difference

//////////////////////////////////////////////////////////////////////////////////

module cx_central_difference

(

input   wireclk,

input   wirerst_n,

inputwirei_en,

inputwirei_hsyn,

inputwirei_vsyn,

inputwire [23:0]i_data,

outputwire o_en,

outputwire o_hsyn,

outputwire o_vsyn,

output  wire [23:0]o_data

);

reg [7:0]       o_r;

reg [7:0]       o_g;

reg [7:0]       o_b;

reg [1:0]i_en_r;

reg [1:0]i_hsyn_r;

reg [1:0]i_vsyn_r;

reg [23:0]      i_data_r;

assign o_en = i_en_r[1];

assign o_hsyn = i_hsyn_r[1];

assign o_vsyn = i_vsyn_r[1];

assign o_data = {o_r, o_g, o_b};

always@(posedge clk or negedge rst_n) 

begin

    if(!rst_n)

    begin

        i_en_r <=2'b0;

        i_hsyn_r <= 2'b0;

        i_vsyn_r <= 2'b0;

    end

    else

    begin

        i_en_r <={i_en_r[0],i_en};

        i_hsyn_r <= {i_hsyn_r[0],i_hsyn};

        i_vsyn_r <= {i_vsyn_r[0],i_vsyn};

    end

end

always@(posedge clk or negedge rst_n) 

begin

    if(!rst_n)

        i_data_r <= 24'b0; 

    else

        i_data_r <= i_data;  

end

always@(posedge clk or negedge rst_n) 

begin

    if(!rst_n)

begin

        o_r <= 8'd0;

        o_g <= 8'd0;

        o_b <= 8'd0;

    end

    else 

begin

        o_r <= (i_data_r[23:16]-i_data[23:16])>>1;

        o_g <= (i_data_r[15:8]-i_data[15:8])>>1;

        o_b <= (i_data_r[7:0]-i_data[7:0])>>1;

    end

end

endmodule

中心差分变换模块分别对R、B、G三个图像通道进行中心差分运算处理,利用处理后的数据生成新的RGB格式图像数据并输出,Verilog仿真生成image_out.txt文件存储中心差分变换后的图像数据:

2.3 实现效果分析

通过Matlab显示中心差分变换后的图像数据image_out.txt文件,算法有效运算出原图像的梯度信息:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SIFT算法详解
python+opencv图像处理(二十七)
磁共振扫描仪-梯度线性误差导致图像失真
磁敏感加权成像(SWI)丨临床应用
几种边缘检测算子的评估
智能分析技术原理及现状分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服