图像上较小的块上的python scipy dct无法正常工作



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

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块时,然后立即IDCT丢失了所有信息,并且图像看起来像是一团糟。我所说的只是

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

当我运行此功能时,图像都是噪音。但是,如果您在apply_dct()和apply_idct()中看到了我在整个图像上尝试了dct和idct的内容,而不是在8x8块上尝试过的。当我这样做时,它可以很好地工作,当我尝试8x8块时它不起作用,并且我需要将其应用于8x8块而不是整个图像。

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

检查图像数组的数据类型(self.image.dtype)。它可能是8位未签名的整数。DCT将是浮点值,但是当您将DCT的结果分配给8x8块 时,浮点值将施加到8位整数。然后,当您应用IDCT时也会发生同样的事情。

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

相关内容

  • 没有找到相关文章

最新更新