gpt4 book ai didi

图像上较小块上的 Python scipy DCT 不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:35 25 4
gpt4 key购买 nike

我正在使用 scipy.fftpack.dct 和 scipy.fftpack.idct 来处理 python 中的图像数组。然而,我不想将其应用到整个图像,而是应用到图像中的各个 8x8 block 。这是我编写的用于测试的简单类

from PIL import Image
import numpy as np
from scipy.fftpack import dct, idct

class ImageController():
def __init__(self, image_name):
im = np.asarray(Image.open(image_name))
self.origional_size = im.shape
im_x_dim, im_y_dim = self.origional_size
self.image = im
if not self.image.flags.writeable:
self.image.flags.writeable = True

def get(self):
return self.image

def display(self):
Image.fromarray(self.image).show()
return self

def apply_dct(self):
# self.image = dct(self.image, norm='ortho')
self.loop_through_8_x_8(dct)
return self

def apply_idct(self):
# self.image = idct(self.image, norm='ortho')
self.loop_through_8_x_8(idct)
return self

def loop_through_8_x_8(self, appyFunc):
print appyFunc
row = 0
while row < len(self.image):
col = 0
while col < len(self.image[row]):
self.image[row:row+8, self.get_list(col)] = appyFunc(self.image[row:row+8, self.get_list(col)] , norm='ortho')
col += 8
row += 8
print row, col
return self;

def get_list(self, index):
x = []
for i in range(index, index + 8):
x.append(i)
return x

我遇到的问题是,当我将 DCT 应用于 8x8 block 时,然后立即进行 IDCT,所有信息都会丢失,图像看起来一团糟。我所打电话的只是

ImageController('lena.jpg').apply_dct().apply_idct().display()

当我运行这个时,图像只是噪音。然而,如果你在 apply_dct() 和 apply_idct() 中看到我有一些注释掉了,那就是我在整个图像上而不是在 8x8 block 上尝试了 DCT 和 IDCT。当我这样做时,它工作得很好,只是当我尝试 8x8 block 时它不起作用,我需要将它应用到 8x8 block 而不是整个图像。

如果需要额外信息,图像是灰度的,因此只有 1 个 channel 。

最佳答案

检查图像数组的数据类型 ( self.image.dtype )。它可能是 8 位无符号整数。 DCT 将是浮点值,但是当您将 DCT 结果分配到 8x8 block 就位时,浮点值将转换为 8 位整数。然后,当您应用 IDCT 时,会发生同样的事情。

避免该问题的一个选项是将图像转换为 __init__() 中的 64 位浮点型,例如im = np.asarray(Image.open(image_name), dtype=np.float64) 。这是否有意义取决于您要对数组执行其他操作。

关于图像上较小块上的 Python scipy DCT 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com