概述
亮度及对比度调节
亮度及对比度需要根据数值配合一齐调节,以达到更新的视觉效果。
如果是 RGB 彩色图像,亮度与对比度调节需要在所有颜色通道上进行相同的调节。
设当前像素点位宽为 8,则像素值范围 0~255。
设当前像素点值为 x,调节输出像素点值为 y。
设亮度参数b范围 -1~1,则有亮度调节公式:
y
b
=
x
+
255
×
b
y
=
{
0
y
b
≤
0
255
y
b
≥
255
y
b
0
<
y
b
<
255
yb=x+255times b\ y=begin{cases} 0&ybleq0\ 255&ybgeq255\ yb&0<yb<255 end{cases}
yb=x+255×by=⎩⎪⎨⎪⎧0255ybyb≤0yb≥2550<yb<255
设对比度参数c范围 -1~1,对比度门限 th,则有对比度调节公式:
y
c
=
{
x
≥
t
h
?
255
:
0
c
=
1
x
+
(
x
−
t
h
)
×
(
1
1
−
c
−
1
)
0
≤
c
<
1
x
+
(
x
−
t
h
)
×
c
c
<
0
y
=
{
0
y
c
≤
0
255
y
c
≥
255
y
b
0
<
y
c
<
255
yc=begin{cases} xgeq th? 255:0&c=1\ x+(x-th)times(frac{1}{1-c}-1)&0leq c<1\ x+(x-th)times c&c<0 end{cases}\ y=begin{cases} 0&ycleq0\ 255&ycgeq255\ yb&0<yc<255 end{cases}
yc=⎩⎪⎨⎪⎧x≥th?255:0x+(x−th)×(1−c1−1)x+(x−th)×cc=10≤c<1c<0y=⎩⎪⎨⎪⎧0255ybyc≤0yc≥2550<yc<255
前述公式仅用于亮度或者对比度单独调节的情况,实际情况下需要将亮度对比度一同调节,并且在对比度数值大于 0 的情况下先调节亮度,在对比度数值小于 0 的情况下先调整对比度
在 FPGA 实现中,将亮度参数 b 定义为 16 位有符号整数,用补码表示(整字节数定义,方便外部配置参数值),数值范围 -255 至 255,单独计算亮度的方法:
y
=
x
+
b
y=x+b
y=x+b
计算结果再经过 0 至 255 范围的饱和控制,得到亮度调节的结果。
将对比度参数 c 定义为 16 位有符号整数,用补码表示,范围 -255 至 255,单独计算对比度的方法:
y
=
{
x
≥
128
?
255
:
0
c
=
255
x
+
(
x
−
128
)
×
c
255
−
c
0
≤
c
<
255
x
+
(
x
−
128
)
×
c
255
c
<
0
y=begin{cases} xgeq 128?255:0&c=255\ x+(x-128)timesfrac{c}{255-c}&0leq c<255\ x+(x-128)times frac{c}{255}&c<0 end{cases}
y=⎩⎪⎨⎪⎧x≥128?255:0x+(x−128)×255−ccx+(x−128)×255cc=2550≤c<255c<0
计算结果再经过 0 至 255 范围的饱和控制,得到对比度调节的结果。
由于亮度及对比度调节需要根据对比度参数选择不同的先后顺序,因此 FPGA 计算时分为两条计算流水线,完成计算后再根据对比度参数选择对应的计算流水线的输出。
对比度参数 c 值大于等于 0 的计算流水线:
sysgen 中的实现如下:
注意上图中橙色背景的除法计算,Divide 模块的配置如下:
注意在 Divide 输入数据需要用 Convert 模块先由有符号整数补码转为浮点数,并且需要将 Divide 输出由 Convert 模块将浮点数转为有符号整数补码。
最后输出之前用于饱和控制的 Convert 模块的配置如下,注意 Overflow 配置为 Saturate:
对比度参数 c 值小于 0 的计算流水线:
sysgen 中的实现如下:
注意上图中用截去低 8 位的方法近似实现除以 255 的计算,以节约计算资源。
最终由对比度参数值通过 Mux 模块选择计算流的输出:
仿真结果。
试验图片来源于:https://unsplash.com/
输入原始图像:
输出图像,亮度参数 50,对比度参数 100:
输出图像,亮度参数 -10,对比度参数 -50:
最后
以上就是爱笑高山为你收集整理的FPGA图像处理11_常用算法_亮度及对比度调节的全部内容,希望文章能够帮你解决FPGA图像处理11_常用算法_亮度及对比度调节所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复