Matlab算法可以去掉摩尔纹,算法调优记录

1.双线性插值

b1799b6ae363

2.平方插值

if ((sub_a_b>Th_value) && dx <= 0.5)

k1_dx = 2*(dx ^ 2);

elseif ((sub_a_b>Th_value) && dx > 0.5)

k1_dx = -2*((dx-1)^2)+1;

elseif (sub_a_b <= Th_value)

k1_dx = dx;

end

b1799b6ae363

b1799b6ae363

3.分段函数插值法

for k= 2:1:5;

for a= (0.5-(0.5/k)):0.1:0.5;

if ((sub_a_b>Th_value) && dx <= a)

k1_dx = (k-(k/(2*a))+(0.5/a))*dx;

elseif ((sub_a_b>Th_value) && dx > a && dx < 1-a)

k1_dx = k*(dx-0.5)+0.5;

elseif ((sub_a_b>Th_value) && dx >= 1-a)

k1_dx = (k-(0.5*k/a)+(0.5/a))*(dx-1)+1;

elseif (sub_a_b <= Th_value)

k1_dx = dx;

end

end

end

b1799b6ae363

针对上述对应关系,n=6,8,10时,k,a组合方针效果最好

说明对于一个特定的k值而言,a越小越好

k=1 a=0

b1799b6ae363

b1799b6ae363

k=2 a=0.2500

b1799b6ae363

b1799b6ae363

k=3 a=0.3333

b1799b6ae363

b1799b6ae363

k=4 a=0.3750

b1799b6ae363

b1799b6ae363

k=5 a=0.4000

b1799b6ae363

b1799b6ae363

k=6 a=0.4167

b1799b6ae363

b1799b6ae363

k=7 a=0.4286

b1799b6ae363

b1799b6ae363

k=8 a=0.4375

b1799b6ae363

b1799b6ae363

4.PS梯形矫正坐标变化

矫正值

缩放比例

左上角坐标

右上角坐标

2

99

4,2

内容

4

97

15,8

内容

6

96

19,11

内容

8

95

30,16

内容

10

93

41,23

内容

12

92

45,25

内容

14

91

55,31

内容

16

90

60,34

内容

18

88

71,40

内容

5.摩尔纹的根本原因

图像出现摩尔纹的根本原因是单像素直线在发生旋转时,势必会出现像素错位,下图中的黑白条纹图中,以从左边为起点的一条黑条纹为例。它会在中间某个位置渐变为白色,我把它称之为渐变区。从上至下所有的渐变区域连在一起就会形成摩尔纹。单条摩尔纹的宽度由渐变区的宽度决定,摩尔纹的密度由线条倾斜的角度决定。

b1799b6ae363

b1799b6ae363

b1799b6ae363

所以对于单像素线条(极窄线条)而言,摩尔纹是无法避免的,而且线条的倾斜角度也是无法控制的,所以我们能做的就是缩短渐变区的宽度。但是缩短渐变区的宽度会带来图像锯齿化现象的加剧。因为线条没有那么平滑了。所以我们需要分情况考虑。这里我需要提到一点渐变区的宽度还决定于插值区四个点像素值的变化率。如果某个区域像素值的变化率过大,类似于我们这里的黑白条纹区域(像素要么是0要么是255),那么此时容易造成较大的渐变区。这时我们采用权重变化陡峭的插值法来缩短渐变区的宽度。如果某个区域的像素变化率不大,那么我们就采用更平滑的标准双线性插值。来得到较为平滑的图像。

个人认为没有必要过分较真单像素线的摩尔纹现象,更应该关注实际图像的显示效果

投影测试

在投影上做测试,感觉投影仪的显示效果和笔记本电脑不太一样。对于不做gamma处理的图片笔记本电脑上有很明显的摩尔纹,但是在投影仪上打出来的效果看着就没有摩尔纹。所以我得出结论,由于每一块display的性能都有差异。显示效果也会有差。这主要是不同屏幕的gamma值不同导致的。

定点数调试1 (分辨率215*212 shift=50)

fraction_len

坐标2

坐标3

坐标4

golden

214,50

0,161

164,211

5

210,51

4,158

165,209

6

212,52

2,160

163,211

7

214,50

0,160

165,211

8

214,50

0,161

164,211

9

214,50

0,161

164,211

定点数调试2 (分辨率1920*1080 shift=50)

fraction_len

坐标4

golden

1870,1080

8

1913,1074

9

1918.9,1077.2

10

1919.9,1079

11

1919.9,1079

12

1919.9,1079.8

13

1919.9,1079.8

调试日志

当fraction_len=20 , word_len=32时,其他图片都正常,circle_keystone4不正常

num2fixpt函数超过表示范围将变为负数或者0.但是fi函数不一样,fi函数转化定点数,若待转化值小于最小精度,那么转化值截断为最小精度。若待转化值大于最大表示范围,那么转化值将截断为能表示的最大数.

建议不要使用num2fixpt,建议使用fi函数。使用fi函数以后inv_pos可以计算的很精准

fi函数转换checker.jpg生成7张图耗时 10min 43s

num2fixpt函数转换checker.jpg生成7张图耗时 1min43秒

不过当fraction_len小于5时,使用num2fixpt函数来转换checker.jpg,生成的图像会有严重的变形

b1799b6ae363

num2fixpt与fi 误差和比较

fraction_len

num2fixpt

fi

8

1913,1074

9

1918.9,1077.2

10

1919.9,1079

11

1919.9,1079

12

1919.9,1079.8

13

1919.9,1079.8

w值范围

经过统计正确的w值全部落在 1

下图表示

在1<=w<2时有10322848个点

双精度浮点数跑出来的结果(0.9

b1799b6ae363

8/16

在跑keystones2的时候会出现小于1的w

首先介绍双精度

然后介绍定点化

8/27

随机验证k=0:100(base=0.9 incr=0.05)

b1799b6ae363

随机验证k=0:500(base=0.9 incr=0.05)

b1799b6ae363

把范围暂且定为0.875 < w <1.250;

8/28

move_points是以下的点时会有异常情况出现

b1799b6ae363

此时i=1023,j=1920.计算结果如下:w=0.89997767

b1799b6ae363

VCS仿真测试事项:

两个低位宽数做乘法是否需要做位扩展

比如8位数a乘8位数b然后右移8位,结果赋值给一个8位数c。结果是否会被截断为0

结果会被截断,可以使用如下方法;

reg [7:0] a,b,c;

wire [15:0] tmp;

assign tmp = (a*b)>>8;

always @(posedge i_clk)

begin

c <= tmp;

end

有符号数乘法测试

8位有符号数a 乘 8位无符号数b 。如果不对b做有符号转化,结果如何

结论:不能对有符号的负数做>>或者是<

reg signed [7:0] a = -64(0xc0);

a = a>>1;

做了移位操作后,a=96(0x60).

不过可以自行做位操作

reg signed [7:0] a = -64(0xc0);

a = {1'b1,a[7:1]};

此时操作后a=-32

一种合适的有符号数移位方式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值