在FPGA圖像處理--CLAHE算法(一)中介紹了為啥要用CLAHE算法來做圖像增強。
在這一篇里面就介紹一下CLAHE的第一步處理:分塊。
通常來說會將圖片分為8*8的64塊,然后分別對這64塊進行直方圖均衡化。
如下所示(手畫的不均勻)。分為8*8這也是對常見的視頻分辨率可以被8整除,這樣也不用考慮邊界不均勻了。
因為我們要對這64塊都做直方圖均衡化,所以先定義一個直方圖均衡化的計算函數。
def hist(img): h, w = img.shape n = np.zeros(256, np.uint32) for i in range(h): for j in range(w): n[img[i][j]] = n[img[i][j]] + 1 pk = n sk = np.zeros(256, np.float32) sk[0] = pk[0] for i in range(1, 256): sk[i] = sk[i - 1] + pk[i] sk = sk / (h * w) sk = sk * 255 sk = np.around(sk) return sk
之后分塊調用這個直方圖均衡化的代碼。
def calc_ahe(img, block): h, w = img.shape he = np.zeros((h, w), np.uint8) for i in range(block): for j in range(block): sk = hist(img[i * (h // block): (i + 1) * (h // block), j * (w // block):(j + 1) * (w // block)]) he[i * (h // block): (i + 1) * (h // block), j * (w // block):(j + 1) * (w // block)] = remap( img[i * (h // block): (i + 1) * (h // block), j * (w // block):(j + 1) * (w // block)], sk) return he
得到的效果如下:
可以看到每一塊都是被分割了出來。
在RTL實現的時候也是要對這些分塊進行存儲,定義下面的存儲器:
genvar i; generate for(i = 0; i < BLOCK_NUM_POW2; i = i + 1) begin : LOOP_MEM tpram #( .DP (256), .WD (16 ) ) tpram_inst( .clk (clk ), .wdata (wdata[i]), .wen (wen[i] ), .waddr (waddr[i]), .ren (ren[i] ), .raddr (raddr[i]), .rdata (rdata[i]) ); end endgenerate
也是考慮block_num來選擇寫入到哪一個ram里面。
通過i和j來控制最后的block_num,其中i表示列方向的分塊索引,j表示行方向的分塊索引,因為我們每一列都是分為了8塊,所以i的索引需要乘以8,這個通過后面補3個0來實現。
最后通過一系列選擇來控制RAM的讀寫信號。
這樣就能完成CLAHE中分塊進行直方圖均衡化的操作。這個主要難點是分塊,直方圖均衡化網上教程很多就不再贅述了。
審核編輯:湯梓紅
-
FPGA
+關注
關注
1626文章
21665瀏覽量
601814 -
圖像處理
+關注
關注
27文章
1281瀏覽量
56638 -
算法
+關注
關注
23文章
4599瀏覽量
92641
原文標題:FPGA圖像處理--CLAHE算法(二)
文章出處:【微信號:FPGA開源工坊,微信公眾號:FPGA開源工坊】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論