FPGA實現灰度圖像反轉和彩色圖像反轉


  前面的博客中我們分別用兩種方法實現了彩色圖像轉灰度的算法,本篇博客則整理一下灰度圖像反轉和彩色圖像反轉的實現。

一、反轉像介紹

  "用攝影設備制成的人或物的形象,也包括光線經反射、折射而形成的與原物相似的圖景,圖像的色調或明暗的處理呈反轉效果的圖像。"

——百度百科《反轉像》

  反轉像在很多場合都有運用,例如在一些質量很差的照片,比如從視頻里裁取的照片,一定要先插值放大,然后進行反轉像處理,銳度和對比度要調高一些,打印時和數碼相機照的相反,要稍微調暗一些,這樣打印出的照片效果更好。在沖洗之初顯示為負像,經中途曝光后再次顯影時轉為正像。它能把底片上的負像印為正像,使影像的明暗或色彩與被攝體相同。

 

二、灰度圖像反轉

  之前我們實現了RGB轉YCbCr的算法,並且將 Y 分量取出作為灰度數據,而反轉也正是對灰度數據進行操作,其原理也很簡單,如果一幅灰度圖像的灰度級是[0,L-1],那反轉圖像為:s = L-1-r = L - (1+r) = L - r[r:0],r 為原圖像灰度級。由此也可以知道,圖像反轉實際上是屬於圖像增強中的線性變換的特殊情況。

1、MATLAB實現

 1 %--------------------------------------------------------------------------
 2 %                       灰度圖像反轉
 3 %--------------------------------------------------------------------------
 4 clc;
 5 clear all;
 6 RGB = imread('Lenna.jpg');  %讀取圖像
 7 
 8 gray = rgb2gray(RGB);       %灰度圖
 9 
10 inve1 = imcomplement(gray); %函數法圖像反轉
11 inve2 = 255 - gray;         %公式法圖像反轉
12 
13 subplot(3,1,1);imshow(gray); title('灰度圖像');
14 subplot(3,1,2);imshow(inve1);title('函數法圖像反轉');
15 subplot(3,1,3);imshow(inve2);title('公式法圖像反轉');

  這里我分別采用了函數法和公式法實現灰度圖像反轉,以驗證我們的公式是否正確,255是因為Y分量是8位的,灰度級是8‘b1111_1111=255,點擊運行得到如下結果:

  從結果看出,兩種方式得到的反轉圖像一樣,證明我們的公式是沒錯的。

2、FPGA實現

  FPGA的實現也很簡單,只需要在原來的灰度圖像的基礎上,對 YCbCr 的 Y 分量進行公式法處理即可,關鍵代碼如下所示:

//==========================================================================
//==    灰度反轉,復制給RGB通道
//==========================================================================
assign inve_Y    = 8'd255 - Y2; //灰度反轉
assign inve_data = {inve_Y[7:3],inve_Y[7:2],inve_Y[7:3]};

  其中 Y2 即原先RGB轉YCbCr后的Y分量,我們對其進公式法處理,最終的值再賦值給RGB通道即可。

3、上板驗證

  灰度圖:

  灰度反轉圖:

 

三、彩色圖像反轉

  灰度圖像反轉很簡單,那彩色圖像反轉呢?  

  一開始我以為是將 YCbCr 的三個分量分別進行類似處理,然后賦值給RGB通道,最后實驗失敗,因為TFT(VGA)是只支持RGB格式的,直接賦值YCbCr數據肯定會導致圖像錯誤。后來我又想那就再進行YCbCr轉RGB565的處理總可以了吧,可以是可以,但有點太麻煩了,彩色圖像哪有那么復雜!

  最后在 Lee 神的指點下,我明白了其實只要對RGB分量進行類似的公式法處理即可,甚至比灰度圖像反轉的處理更簡單!

1、MATLAB實現

 1 %--------------------------------------------------------------------------
 2 %                       彩色圖像反轉
 3 %--------------------------------------------------------------------------
 4 clc;
 5 clear all;
 6 RGB = imread('Lenna.jpg');  %讀取圖像
 7 
 8 inve1 = imcomplement(RGB);  %函數法圖像反轉
 9 
10 inve2 =  255 - RGB;         %公式法圖像反轉
11 
12 subplot(3,1,1);imshow(RGB);  title('原圖');
13 subplot(3,1,2);imshow(inve1);title('函數法圖像反轉');
14 subplot(3,1,3);imshow(inve2);title('公式法圖像反轉');

  代碼第10行我采用了偷懶的寫法,實際上RGB是3維數據,255會分別對RGB通道做三次減法。同樣的,采用了兩種方式實現,以驗證公式法的正確性,點擊運行得到如下結果:

  從結果看出,兩種方式得到的反轉圖像一樣,證明我們的公式是沒錯的。

2、FPGA實現

  彩色圖像的反轉比灰度圖像反轉更簡單,直接對RGB通道進行公式法處理即可,關鍵代碼如下所示:

assign inve_R = 5'b11111  - RGB_data[15:11];
assign inve_G = 6'b111111 - RGB_data[10:5];
assign inve_B = 5'b11111  - RGB_data[4:0];

assign inve_data  = {inve_R,inve_G,inve_B};

  RGB_data即圖像的原始數據,inve_data即反轉后的圖像數據,甚至連時鍾、復位信號都沒有用到,非常簡單!

3、上板驗證

  原圖:

  彩色反轉圖:

  可以看出,本次實驗設計成功。

 

 

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

 


免責聲明!

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



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