在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]) ); endendgenerate
也是考虑block_num来选择写入到哪一个ram里面。
通过i和j来控制最后的block_num,其中i表示列方向的分块索引,j表示行方向的分块索引,因为我们每一列都是分为了8块,所以i的索引需要乘以8,这个通过后面补3个0来实现。
最后通过一系列选择来控制ram的读写信号。
这样就能完成clahe中分块进行直方图均衡化的操作。这个主要难点是分块,直方图均衡化网上教程很多就不再赘述了。
谁掌握人工智能谁就掌握市场 华为和腾讯争夺的是更遥远的未来
基于嵌入式操作系统的机器人驱动控制模型算法设计
harmonyos官网内测报名
三星、台积电将于2013年实现20纳米工艺量产
华硕推出 RTX 3070 Turbo 显卡:双槽厚,适合小机箱或多显卡安装
FPGA图像处理之CLAHE算法
京东方面板厂崛起,群创和友达该如何应对?
行易道科技获得《知识产权管理体系认证证书》
汇付天下携数字化创新成果亮相世界人工智能大会
黑芝麻智能与均联智行联手,亮相智能汽车跨域计算芯片与软件
数控等离子切割机 数控相贯线切割设备
特斯拉 | 国内使用“自动辅助导航驾驶”是什么体验?
多模万兆光纤跳线的标准怎么界定的
图像处理基本思想和算法研究
区块链如何改善工作环境
立功科技嵌入式平台“软”实力——二维码算法篇
基于DSP的LED大屏幕显示系统
南京大学鞠熀先教授:我国生命分析化学正待“整体跨越”
领普K9BB蓝牙无线遥控开关:支持蓝牙、断网也能工作
OPPO Find X可折叠手机将是OPPO的下一代新机