差分圖像就是目標場景在連續時間點圖像相減所構成的圖像,廣義的差分圖像定義為目標場景在時間點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開源工作室(公眾號)
