2016-06-20 12 views
1

Я использую scipy.fftpack.dct и scipy.fftpack.idct для массива изображений в python. Однако я не хочу применять его ко всему изображению, а к отдельным блокам 8x8 на изображении. Это простой класс, я написал для тестирования этогоPython scipy DCT на меньшем блоке на изображении не работает

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 к 8х8 блоков, то IDCT сразу после этого вся информация теряется и изображение выглядит как беспорядок , Все, что я звоню:

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

Когда я запускаю это изображение, все это просто шум. Однако, если вы видите в apply_dct() и apply_idct(), у меня что-то закомментировано, где я попытался использовать DCT и IDCT для всего изображения вместо блоков 8x8. Когда я это делаю, он работает отлично, он просто не работает, когда я пытаюсь использовать блоки 8x8, и мне нужно применить его к блокам 8x8, а не ко всему изображению.

Дополнительная информация при необходимости, изображения в сером цвете, так что есть только 1 канал.

ответ

1

Проверьте тип данных вашего массива изображений (self.image.dtype). Это, вероятно, 8-разрядные целые числа без знака. DCT будет значением с плавающей запятой, но когда вы назначаете результат DCT блоку 8x8 на месте, значения с плавающей запятой преобразуются в 8-битные целые числа. То же самое происходит, когда вы применяете IDCT.

Одним из способов избежать ошибки является преобразование изображения в 64-битную с плавающей запятой в __init__(), например im = np.asarray(Image.open(image_name), dtype=np.float64). Независимо от того, имеет ли это значение, зависит от того, что еще вы собираетесь делать с массивом.