Я использую 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 канал.