如何创建随机点立体图(RDS)?

时间:2017-04-11 10:33:26

标签: python

我正在尝试理解并编写一个python脚本,该脚本从深度图和随机点生成的模式创建随机点立体图(RDS)。根据我的理解,为了创造深度的幻觉,像素被移动,所以当我们通过改变焦点使它们合并时,移位的差异会产生错觉。

我用此深度图

将其付诸实践

depth map star

以下是结果:

enter image description here

但是我不明白为什么我能在结果上看到2个物体,1个星星“靠近”我和另一个“远离我”的星星。根据我的注意力,有不同的可能结果。

我已经阅读了很多关于这个主题的内容,但我没有得到它。也许问题是我的英语不好或对我读过的内容的理解,但我会感谢一些详细的解释,因为网上没有那么多关于如何从头开始编码的技术解释。

注意:我在班次和模式上尝试了不同的尺寸,似乎没有改变任何东西

代码:(如果您需要代码的其他部分或有关其工作原理的评论,请告诉我。我还没有清理它)

import os, sys
import pygame

def get_linked_point(depthmap, d_width, d_height, sep):
    """
    In this function we link each pixel in white in the depth map with the 
    coordinate of the shifted pixel we will need to create the illusion
    ex: [[x,y],[x_shifted,y]]

    :param sep: is the shift value in pixels
    """
    deptharray = pygame.PixelArray(depthmap)
    list_linked_point = []
    for x in range(d_width):
        for y in range(d_height):
            if deptharray[x][y] != 0x000000:
                list_linked_point.append([[x, y], [x+sep, y]])
    del deptharray
    return list_linked_point


def display_stereogram(screen, s_width, pattern, p_width, linked_points):
    """
    Here we fill the window with the pattern. Then for each linked couple of 
    point we make the shifted pixel [x_shifted,y] equal to the other one 
    [x,y]
    """
    x = 0
    while x < s_width:
        screen.blit(pattern, [x, 0])
        x += p_width
    pixAr = pygame.PixelArray(screen)
    for pair in linked_points:
        pixAr[pair[0][0], pair[0][1]] = pixAr[pair[1][0], pair[1][1]]
    del pixAr

1 个答案:

答案 0 :(得分:4)

问题&#34;我可以在结果上看到2个对象,1个星级&#34;关闭&#34;对我和另一个明星&#34;远&#34;来自我&#34; 是因为当我尝试将使用重复图案将2张图像制成的立体图的理解概括为立体图时,我得到了错误的方法。

要创建2个图像立体图,您需要移动一个图像的像素以使深度错觉。

我的approch出了什么问题,我只移动应该创建星星的像素。我没有得到的是因为RDS是由重复的模式构成的,移动这些像素也会产生相反的移动与下一个模式创建另一个相反深度的星。

为了纠正这个问题,我将深度图的每个点(不仅是白色的点)配对,以便在恒星结束后返回到基本移位量。

结果如下: correct result

代码:(此代码是在Neil Slater帮助下快速修改的代码,所以它还不干净。我会尝试改进这个代码)

def get_linked_point(depthmap, d_width, d_height, p_width, sep):
    """
    In this function we link each pixel in white in the depth map with the 
    coordinate of the shifted pixel we will need to create the illusion
    ex: [[x,y],[x_shifted,y]]

    :param sep: is the shift value in pixels
    """
    deptharray = pygame.PixelArray(depthmap)
    list_linked_point = []
    for x in range(d_width):
        for y in range(d_height):
            if deptharray[x][y] == 0x000000:
                list_linked_point.append([[x, y], [x+p_width, y]])
            else:
                list_linked_point.append([[x, y], [x-sep+p_width, y]])
    del deptharray
    return list_linked_point


def display_stereogram(screen, s_width, pattern, p_width, linked_points):
    """
    Here we fill the window with the pattern. Then for each linked couple of 
    point we make the shifted pixel [x_shifted,y] equal to the other one 
    [x,y]
    """
    x = 0
    while x < s_width:
        screen.blit(pattern, [x, 0])
        x += p_width
    pixAr = pygame.PixelArray(screen)
    for pair in linked_points:
        pixAr[pair[1][0], pair[1][1]] = pixAr[pair[0][0], pair[0][1]]
    del pixAr