前面的博客中我們分別用兩種方法實現了彩色圖像轉灰度的算法,本篇博客則整理一下灰度圖像反轉和彩色圖像反轉的實現。
一、反轉像介紹
"用攝影設備制成的人或物的形象,也包括光線經反射、折射而形成的與原物相似的圖景,圖像的色調或明暗的處理呈反轉效果的圖像。"
——百度百科《反轉像》
反轉像在很多場合都有運用,例如在一些質量很差的照片,比如從視頻里裁取的照片,一定要先插值放大,然后進行反轉像處理,銳度和對比度要調高一些,打印時和數碼相機照的相反,要稍微調暗一些,這樣打印出的照片效果更好。在沖洗之初顯示為負像,經中途曝光后再次顯影時轉為正像。它能把底片上的負像印為正像,使影像的明暗或色彩與被攝體相同。
二、灰度圖像反轉
之前我們實現了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開源工作室(公眾號)
