FPGA图像处理之CLAHE算法的线性差值

时间:2025-11-01  作者:Diven  阅读:0

CLAHE算法的线性差值。

FPGA图像处理之CLAHE算法的线性差值

我们先来看一下没有经过线性差值的CLAHE算法是什么样子的效果。

可以看到很明显的图片中都是一块一块的,这是因为在每一个块里面都统计了相应的直方图数据,这样就导致不同块里面直方图统计的映射表不一样,所以就出现了一块块的斑点。

解决这个问题的方法就是线性插值。

可以将整幅图像分为以下几个部分:

整个8*8一共64个block,然后对于四个红色的角点不进行线性插值,对于蓝色的四条边进行线性插值,对于中间的白色部分进行双线性插值。

其中红色正方形的边长是block边长的二分。

来放大一个局部看一下是怎样进行计算的,比如将左上角放大得到一个3*3的block,以黑色实线来表示每一个block。然后用蓝色虚线将每一个block的二分处进行连接,这样将每一个block都分成了4*4的小块。

最左上角的小块不进行线性插值,相应的代码如下,判断是不是在四个角点,如果是角点就直接进行直方图均衡化。

if i <= bh // 2 and j <= bw // 2: he[i][j] = sk_list[0][img[i][j]]elif i <= bh // 2 and j >= w - bw // 2: he[i][j] = sk_list[block - 1][img[i][j]]elif i >= h - bh // 2 and j <= bw // 2:    he[i][j] = sk_list[block * block - block][img[i][j]]elif i >= h - bh // 2 and j >= w - bw // 2: he[i][j] = sk_list[block * block - 1][img[i][j]]

第一个位于蓝色区域内的点,需要进行线性插值才能得到最终的结果。

可以看到这个点位于第一个block中,假定距离第一个block中线的距离是P,那么第一个block占的权重就是1-P/block_width,在第二个block中占的权重就是P/block_width。假如这个点正好在第一个和第二个block的交界处,那么两个block占的权重都是0.5。所以这个点的计算方法就是在第一个block中进行直方图均衡化得到的结果乘以第一个block的权重,加上在第二个block中进行直方图均衡化得到的结果乘以第二个block的权重。

比如下面的参考代码,先计算这个点位于哪一个block,然后计算相应的权重,最后分别进行直方图均衡化后把结果相加。

num_j = (j - bw // 2) // bwp = (j - num_j * bw - bw // 2) / bwq = 1 - phe[i][j] = sk_list[num_j][img[i][j]] * q + sk_list[num_j + 1][img[i][j]] * p

 

 

对于最后情况,也就是位于中间白色区域的点,需要进行双线性插值。可以看到整个点位于第四个block,所以需要在第一个,第二个,第四个和第五个block上分别计算直方图均衡化的结果,和相应的权重,参考代码如下:

num_i = (i - bh // 2) // bhnum_j = (j - bw // 2) // bwm = (i - num_i * bh - bh // 2) / bhv = 1 - mp = (j - num_j * bw - bw // 2) / bwq = 1 - phe[i][j] = sk_list[num_i * block + num_j][img[i][j]] * q * v + sk_list[(num_i * block) + block + num_j][ img[i][j]] * q * m + sk_list[num_i * block + num_j + 1][img[i][j]] * p * v + sk_list[(num_i * block) + block + num_j + 1][img[i][j]] * p * m

对于verilog来说计算方法也是一样的,通过不同的点来分别计算结果。

case (switch_ff[23])

 4'd0, 4'd1, 4'd2, 4'd3: begin cand_tx_pipe_1[0] <= cand_rd_data_1_ff[21]; cand_tx_pipe_2[0] <= 28'd0; cand_tx_pipe_3[0] <= 28'd0; cand_tx_pipe_4[0] <= 28'd0; end 4'd4, 4'd5: begin cand_tx_pipe_1[0] <= cand_rd_data_1_ff[21] * q_ff[2]; cand_tx_pipe_2[0] <= cand_rd_data_2_ff[21] * p_ff[2]; cand_tx_pipe_3[0] <= 28'd0; cand_tx_pipe_4[0] <= 28'd0; end 4'd6, 4'd7: begin cand_tx_pipe_1[0] <= cand_rd_data_1_ff[21] * v_ff[2]; cand_tx_pipe_2[0] <= cand_rd_data_2_ff[21] * m_ff[2]; cand_tx_pipe_3[0] <= 28'd0; cand_tx_pipe_4[0] <= 28'd0; end 4'd8: begin cand_tx_pipe_1[0] <= cand_rd_data_1_ff[21] * q_ff[2]; cand_tx_pipe_2[0] <= cand_rd_data_2_ff[21] * q_ff[2]; cand_tx_pipe_3[0] <= cand_rd_data_3_ff[21] * p_ff[2]; cand_tx_pipe_4[0] <= cand_rd_data_4_ff[21] * p_ff[2]; end default: begin cand_tx_pipe_1[0] <= 28'd0; cand_tx_pipe_2[0] <= 28'd0; cand_tx_pipe_3[0] <= 28'd0; cand_tx_pipe_4[0] <= 28'd0; endendcase

这里使用了DSP自动推断的方法,这些乘法都会被自动推断为DSP。

在计算之前对数据进行了打拍的操作,一部分寄存器会被DSP单元所吸收,所以不用担心这个乘法的时序问题。

always @(posedge clk ) begin cand_rd_data_1_ff[0] <= cand_rd_data_1; cand_rd_data_2_ff[0] <= cand_rd_data_2; cand_rd_data_3_ff[0] <= cand_rd_data_3; cand_rd_data_4_ff[0] <= cand_rd_data_4;endgenvar b;generate for (b = 1; b <= 22; b = b + 1) begin always @(posedge clk ) begin cand_rd_data_1_ff[b] <= cand_rd_data_1_ff[b - 1]; cand_rd_data_2_ff[b] <= cand_rd_data_2_ff[b - 1]; cand_rd_data_3_ff[b] <= cand_rd_data_3_ff[b - 1]; cand_rd_data_4_ff[b] <= cand_rd_data_4_ff[b - 1]; end endendgenerate

来看一下最后结果,没有一块一块的斑点了。

CLAHE算法就是这些,一共分为下面几步:

对整幅图像进行分块,然后在每一块上面分别进行直方图均衡化操作

在进行直方图均衡化的时候进行CLIP操作

进行线性插值

审核编辑:黄飞

 

猜您喜欢

精密电阻作为电子元器件中的关键部件,是非常重要的配件。宇阳(EYANG)作为国内知名的精密电阻品牌,很好的性能和的应用领域赢得了市场的高度认可。本文将详细介绍宇...
2024-09-07 06:30:13

电流检测电阻是非常重要的配件,不仅帮助监控电路中的电流流动,还直接关系到系统的安全与效率。在众多品牌中,台康(TAICON)很好的性能和可靠的质量赢得了认可。本...
2012-06-19 02:51:30

隔离开关是重要的电气设备,其主要作用是切断电路中的电流,以确保设备的安全维护和检修。通常用于高压和低压配电系统中,能够有效地隔离电源,从而防止意外触电和设备损坏...
2021-02-17 00:00:00

轻触开关是应用于电子设备中的开关元件,其规格尺寸因型号和用途而异。轻触开关的外形尺寸通常在6mm到12mm之间,常见的高度为3mm到5mm。不同的产品设计可能会...
2011-03-16 00:00:00

贴片电容是电子元件中常见的元件。在电路中起着重要的作用。今天我们来讨论,2个贴片电容串联有什么作用。增加电容值当两个电容器串联时,电容值会减少。这个是个常见的误...
2025-04-13 15:31:41

EEPROM(电可擦可编程只读存储器)是非易失性存储器,应用于电子设备中。主要作用是存储数据,即使在断电情况下,数据也能保持不变。EEPROM的特点是可以进行多...
2010-02-18 00:00:00

电流采样电阻作为关键元件,是监测电流、保护电路和提升系统性能的重要配件。富之光(FUJICON)作为知名的电子元器件制造商,其电流采样电阻系列凭借高精度、高可靠...
2016-05-14 02:35:30

GJJ是一款功能强大的6脚开关电源管理芯片,专为简化电源设计并提升效率而打造。体积小巧,却蕴含着丰富的功能,能够满足各种应用场景的需求,是工程师和电子爱好者的理...
2024-06-18 00:00:00

保险丝作为重要的安全防护元件,有着着不可替代的作用。伊莱科(ELECALL)作为知名的电子元器件品牌,其一次性保险丝以高品质和可靠性能受到认可。本文将详细介绍伊...
2024-10-15 05:49:30

TT Electronics作为一家源自英国的知名制造商,很好的品质和的产品线赢得了全球客户的信赖。特别是其插件电阻系列,不仅种类丰富,而且涵盖了多个知名品牌,...
2017-11-08 11:38:30