FPGA實現圖像中心差分變換


  差分圖像就是目標場景在連續時間點圖像相減所構成的圖像,廣義的差分圖像定義為目標場景在時間點tk和tk+L所成圖像的差別。差分圖像是由目標場景在相鄰時間點的圖像相減得到的,從而能夠得到目標場景隨時間的變換。

  差分圖像在許多領域得到了廣泛的應用,比如:視頻壓縮,生物醫學診斷,天文學,遙感,人臉識別等。

 

——FPGA開源工作室

一、MATLAB實現

 1、主文件 img_diff.m

%--------------------------------------------------------------------------
%                       中心差分變換
%--------------------------------------------------------------------------
clc;
clear all;
RGB  = imread('flower.bmp');        %讀取圖像
Gray = rgb2gray(RGB);
Diff = mipcentraldiff(Gray,'dx');

subplot(2,2,1);imshow(RGB); title('原圖');
subplot(2,2,3);imshow(Gray);title('灰度圖');
subplot(2,2,4);imshow(Diff);title('中心差分變換');

2、子文件 mip1centraldiff.m

%--------------------------------------------------------------------------
%     img:          input image
%     direction:    'dx' or 'dy'
%     dimg:         resultant image
%--------------------------------------------------------------------------
function dimg = mipcentraldiff(img,direction)
img = padarray(img,[1,1],'symmetric','both');
[row,col] = size(img);
dimg = zeros(row,col);
switch(direction)
    case'dx',
        dimg(:,2:col-1)= (img(:,3:col)-img(:,1:col-2))/2;
    case'dy',
        dimg(2:row-1,:)= (img(3:row,:)-img(1:row-2,:))/2;
    otherwise
        disp('Direction is unknown');
end
dimg = dimg(2:end-1,2:end-1);

3、運行結果

  在主文件 img_diff.m 中點擊運行,得到如下結果:

 

二、FPGA實現

  FPGA中同樣采用灰度分量 Y 來實現中心差分變換,對於如何實現灰度分量Y,可以查看前面的博客介紹。我們可以將公式變一下形,如下所示:

  Ix = [I(x+2h) - I(x)] / 2h

  取 h 的值為1,則公式變成 Ix = [I(x+2) - I(x)] / 2 

1、打拍

  和前面 FPGA 實現浮雕效果一樣,通過打拍實現像素值的延遲,代碼如下所示:

//==========================================================================
//==                        打拍
//==========================================================================
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        {Y_de_r2,   Y_de_r1   } <= {1'b0,1'b0};
        {Y_hsync_r2,Y_hsync_r1} <= {1'b0,1'b0};
        {Y_vsync_r2,Y_vsync_r1} <= {1'b0,1'b0};
        {Y_data_r2, Y_data_r1 } <= {8'b0,8'b0};
    end
    else begin
        {Y_de_r2,   Y_de_r1   } <= {Y_de_r1,   Y_de   };
        {Y_hsync_r2,Y_hsync_r1} <= {Y_hsync_r1,Y_hsync};
        {Y_vsync_r2,Y_vsync_r1} <= {Y_vsync_r1,Y_vsync};
        {Y_data_r2, Y_data_r1 } <= {Y_data_r1, Y_data };
    end
end

2、中心差分變換

  對着公式寫代碼即可,除以 2 的操作我們采用右移 1 位來實現。

//==========================================================================
//==                        中心差分變換
//==========================================================================
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        diff_data <= 8'd0;
    end
    else begin
        diff_data <= (Y_data_r2 - Y_data) >> 1;
    end
end

3、信號同步

  這個說了很多遍了,直接將打拍后的信號賦值出去即可。

//==========================================================================
//==                        信號同步
//==========================================================================
assign diff_de = Y_de_r2;
assign diff_hsync = Y_hsync_r2;
assign diff_vsync = Y_vsync_r2;

 

三、上板驗證

  最后在 FPGA 開發板的 TFT 屏中,我們得到如下的實驗結果:

  從結果可以看出,大體和 MATLAB 中的效果一樣,但是有細微的差別,這是因為 (Y_data_r2 - Y_data) 的計算結果可能為負數或奇數,如果要達到完美,公式還得繼續改造,這個圖像變換比較簡單,不想廢心思了,有興趣的同學可以自己嘗試看看。

  此外也可以將中心差分變換的算法移植到 RGB 三通道,實現彩色輸出的中心差分變換。

 

參考資料:[1] OpenS Lee:FPGA開源工作室(公眾號)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM