通过代码理解伪影模拟的原理

# 假设原始图像是这样的(举例:3行4列的简单图像)
# 数字代表像素值,0为黑色,非0为有效内容
original_image = np.array([
    [10, 20, 30, 40],   # 第0行
    [50, 60, 70, 80],   # 第1行
    [90, 100, 110, 120] # 第2行
])

# 1. 创建和原图一样大的空白图像(全黑)
blurred_image = np.zeros_like(original_image)
# 此时blurred_image是:
# [[0, 0, 0, 0],
#  [0, 0, 0, 0],
#  [0, 0, 0, 0]]

height, width = original_image.shape  # 3行4列
t = np.linspace(0, 2*np.pi, width)    # 生成周期数据

# 2. 遍历每一行(以第1行为例,y=1)
for y in range(height):
    # 假设计算出偏移量为2(向右移2格)
    offset = 2  # 简化示例,实际由sin函数计算
    
    # 3. 从原图取当前行的数据(关键:操作的是原图数据)
    original_row = original_image[y, :]  # 对于y=1,取到[50,60,70,80]
    
    # 4. 对原图的这一行进行平移
    shifted_row = np.roll(original_row, offset)  # 平移后变成[70,80,50,60]
    
    # 5. 处理平移后的空白(右移2格,左边空2格填0)
    if offset > 0:
        shifted_row[:offset] = 0  # 变成[0,0,50,60]
    
    # 6. 把处理后的行放到新图中(新图不再是全黑)
    blurred_image[y, :] = shifted_row  # 第1行变成[0,0,50,60]

# 最终blurred_image不再是全黑,而是包含处理后的原图数据
# 比如3行处理完可能是:
# [[0,0,10,20],
#  [0,0,50,60],
#  [0,0,90,100]]

咱们用 "复印文件" 来打比方,一步一步说清楚这段代码在干嘛:

原始图像就像一张写满数字的纸

第一行:10 20 30 40   第二行:50 60 70 80   第三行:90 100 110 120  

第二行:50 60 70 80   第三行:90 100 110 120  

第三行:90 100 110 120  

步骤 1:准备一张同样大小的白纸

blurred_image = np.zeros_like(original_image)

→ 就像拿了一张和原始纸张一样大的白纸,准备用来画 "模糊版"

步骤 2:逐行处理(以第二行为例)

for y in range(height):  # 一行一行来处理

→ 就像你拿着原始纸,一行一行地复印

步骤 3:确定平移多少格(这里假设向右移 2 格)

offset = 2  # 向右移2格  如果ct 影像,实际过程是sin函数的运算结果决定移动的格子数

→ 比如复印第二行时,故意把纸往右挪了 2 格再印

步骤 4:从原图取数据并平移

original_row = original_image[y, :]  # 取出第二行:[50,60,70,80] shifted_row = np.roll(original_row, offset)  # 平移后变成[70,80,50,60]

shifted_row = np.roll(original_row, offset)  # 平移后变成[70,80,50,60]

→ 原本第二行是 "50 60 70 80",右移 2 格后,变成 "70 80 50 60"(后面的数字跑到前面了)

步骤 5:处理空白(平移后左边空了 2 格)

shifted_row[:offset] = 0  # 变成[0,0,50,60]

→ 右移后左边空了 2 格,用黑色(0)填上,所以变成 "0 0 50 60"

步骤 6:把处理好的行写到白纸上

blurred_image[y, :] = shifted_row  # 第二行变成[0,0,50,60]

→ 把这行处理好的数字写到白纸上对应的位置

最终结果

三行都处理完后,白纸就变成了:

第一行:0 0 10 20 (右移2格后的效果) 第二行:0 0 50 60 (右移2格后的效果) 第三行:0 0 90 100(右移2格后的效果)

第二行:0 0 50 60 (右移2格后的效果) 第三行:0 0 90 100(右移2格后的效果)

第三行:0 0 90 100(右移2格后的效果)

总结

这段代码就是把原始图像的每一行,按照规定的幅度平移后,再写到一张新的白纸上,平移后空出来的地方用黑色填满,这样就做出了 "模糊拖影" 的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值