7

我正在编写一个代码,其中一部分是读取图像源并将其显示在屏幕上供用户交互。我还需要锐化的图像数据。我使用以下内容读取数据并将其显示在pyGame

def image_and_sharpen_array(file_name):
    #read the image data and return it, with the sharpened image
    image = misc.imread(file_name)

    blurred = ndimage.gaussian_filter(image,3)
    edge = ndimage.gaussian_filter(blurred,1)
    alpha = 20
    out = blurred + alpha*(blurred - edge)
    return image,out

#get image data
scan,sharpen = image_and_sharpen_array('foo.jpg')
w,h,c = scan.shape


#setting up pygame
pygame.init()
screen = pygame.display.set_mode((w,h))

pygame.surfarray.blit_array(screen,scan)
pygame.display.update()

并且图像仅在屏幕上显示旋转和反转。这是由于 和 之间的差异misc.imreadpyGame?还是因为我的代码有问题?

还有其他方法可以做到这一点吗?我阅读的大部分解决方案都涉及保存图形,然后使用“pyGame”读取它。

4

4 回答 4

4

我经常使用 numpyswapaxes()方法:在这种情况下,我们只需要在显示数组之前反转 x 和 y 轴(轴号 0 和 1):

return image.swapaxes(0,1),out
于 2016-11-05T19:11:10.323 回答
2

我认为 technico 提供了一个很好的解决方案 - 只是有点依赖信息。假设 get_arr() 是一个返回像素数组的函数:

pixl_arr = get_arr()
pixl_arr = numpy.swapaxes(pixl_arr, 0, 1)
new_surf = pygame.pixelcopy.make_surface(pixl_arr)
screen.blit(new_surf, (dest_x, dest_y))

或者,如果您知道图像将始终具有相同的尺寸(如遍历视频或 gif 文件的帧),则重用相同的表面会更有效:

pixl_arr = get_arr()
pixl_arr = numpy.swapaxes(pixl_arr, 0, 1)
pygame.pixelcopy.array_to_surface(old_surf, pixl_arr)
screen.blit(old_surf, (dest_x, dest_y))

YMMV,但到目前为止,这对我来说效果很好。

于 2017-03-03T22:29:07.947 回答
1

我的建议是使用该pygame.transform模块。有fliprotate方法,您可以使用它们来进行转换。查找有关此的文档。

我的建议是将输出图像保存到一个新的Surface,然后应用转换,并 blit 到显示。

temp_surf = pygame.Surface((w,h))
pygame.surfarray.blit(temp_surf, scan)

'''transform temp_surf'''

screen.blit(temp_surf, (0,0))

我不知道为什么会这样。这可能与轴从 2d 数组传输到 pygame 的顺序有关Surface

于 2015-06-16T00:07:46.437 回答
1

每个库都有自己的解释图像数组的方式。通过“旋转”,我想您的意思是转置。这就是 PyGame 显示 numpy 数组的方式。有很多方法可以让它看起来“正确”。实际上,甚至有很多方法可以显示数组,这使您可以完全控制通道表示等。在 pygame 版本 1.9.2 中,这是我能达到的最快的数组渲染。(注意早期版本这将不起作用!)。此函数将用数组填充表面:

def put_array(surface, myarr):          # put array into surface
    bv = surface.get_view("0")
    bv.write(myarr.tostring())

如果这不起作用,请使用它,应该在任何地方都可以使用:

# put array data into a pygame surface
def put_arr(surface, myarr):
    bv = surface.get_buffer()
    bv.write(myarr.tostring(), 0)

你可能仍然得不到你想要的,所以它被转置或交换了颜色通道。这个想法是,以适合这个表面缓冲区的形式管理你的数组。要找出正确的通道顺序和轴顺序,请使用openCV库 (cv2.imread(filename))。使用openCV,您可以按照标准以BGR顺序打开图像,并且它具有很多转换功能。如果我没记错的话,直接写入表面缓冲区时,BGR 是 24 位的正确顺序,而 BGRA 是 32 位表面的正确顺序。因此,您可以尝试使用此功能将您从文件中取出的图像数组放到屏幕上。

还有其他绘制数组的方法,例如这里是一整套辅助函数http://www.pygame.org/docs/ref/surfarray.html
但我不建议使用它,因为表面不适用于直接像素操作,你可能会迷失在参考文献中。小提示:要进行“信号测试”,请使用图片,如下所示。因此,您将立即查看是否有问题,只需加载为数组并尝试渲染。

在此处输入图像描述

于 2015-06-21T23:57:58.013 回答