Распределение коэффициентов дискретного косинусного преобразования (DCT) - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть два изображения:

Исходное изображение

enter image description here

Бинаризованное изображение

enter image description here

Я применил дискретное косинусное преобразование к двум изображениям, разделив изображение 256x256 на блоки 8x8. После я хочу сравнить их распределения коэффициентов DCT.

import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import numpy as np
import os.path
import scipy
import statistics

from numpy import pi
from numpy import sin
from numpy import zeros
from numpy import r_
from PIL import Image
from scipy.fftpack import fft, dct
from scipy import signal
from scipy import misc


if __name__ == '__main__':
    image_counter = 1

    #Opens the noisy image.
    noise_image_path = 'noise_images/' + str(image_counter) + '.png'
    noise_image = Image.open(noise_image_path)

    # Opens the binarize image
    ground_truth_image_path = 'ground_truth_noise_patches/' + str(image_counter) + '.png'
    ground_truth_image = Image.open( ground_truth_image_path)

    #Converts the images into Ndarray
    noise_image = np.array(noise_image)
    ground_truth_image = np.array(ground_truth_image)

    #Create variables `noise_dct_data` and `ground_truth_dct_data` where the DCT coefficients of the two images will be stored.
    noise_image_size = noise_image.shape
    noise_dct_data = np.zeros(noise_image_size)      
    ground_truth_image_size = ground_truth_image.shape
    ground_truth_dct_data = np.zeros(ground_truth_image_size)

    for i in r_[:noise_image_size[0]:8]:
        for j in r_[:noise_image_size[1]:8]:   
            # Apply DCT to the two images every 8x8 block of it.             
            noise_dct_data[i:(i+8),j:(j+8)] = dct(noise_image[i:(i+8),j:(j+8)])
            # Apply DCT to the binarize image every 8x8 block of it.   
            ground_truth_dct_data[i:(i+8),j:(j+8)] = dct(ground_truth_image[i:(i+8),j:(j+8)])

Приведенный выше код получает DCT двух изображений. Я хочу создать их распределение коэффициентов DCT, как на картинке ниже:

enter image description here

Дело в том, что я не знаю, как это построить. Вот что я сделал:

    #Convert 2D array to 1D array        
    noise_dct_data = noise_dct_data.ravel()   
    ground_truth_dct_data = ground_truth_dct_data.ravel()       

    #I just used a Histogram!
    n, bins, patches = plt.hist(ground_truth_dct_data, 2000, facecolor='blue', alpha=0.5)
    plt.show()

    n, bins, patches = plt.hist(noise_dct_data, 2000, facecolor='blue', alpha=0.5)
    plt.show()

    image_counter = image_counter + 1

Мои вопросы:

  1. Что означают X и Y-axis на рисунке?
  2. значение сохраняется в noise_dct_data и ground_truth_dct_data, коэффициенты DCT?
  3. Представляет ли Y-axis частоту своих соответствующих коэффициентов DCT?
  4. Является ли гистограмма подходящей для представления распределения коэффициентов DCT.
  5. Коэффициенты DCT обычно классифицируются на три поддиапазона на основе их частот, а именно низких, средних и высоких частотных диапазонов. Какое пороговое значение мы можем использовать для классификации коэффициента DCT в диапазоне низких, средних или высоких частот? Другими словами, как мы можем классифицировать полосы частот коэффициента DCT радиально? Ниже приведен пример радиальной классификации полос частот коэффициента DCT.

enter image description here

Идея основана на статье: Характеристика шума в древних изображениях документов на основе распределения коэффициентов DCT

1 Ответ

3 голосов
/ 12 февраля 2020

Пример графика, которым вы поделились, для меня выглядит как график плотности ядра. График плотности «вариация гистограммы, в которой для построения значений используется сглаживание ядра, что обеспечивает более плавное распределение за счет сглаживания шума». (См. https://datavizcatalogue.com/methods/density_plot.html)

Библиотека seaborn, которая построена поверх matplotlib, имеет функцию kdeplot и может обрабатывать два набора данных. Вот игрушечный пример:

import numpy as np 
from scipy.fftpack import dct
import seaborn 

sample1 = dct(np.random.rand(100))
sample2 = dct(np.random.rand(30))
seaborn.kdeplot(sample1, color="r")
seaborn.kdeplot(sample2, color="b")

kdeplot example

Обратите внимание, что при повторном запуске этого кода будет получено немного другое изображение, так как я использую случайно сгенерированные данные.

Чтобы ответить на ваши пронумерованные вопросы напрямую:

1. Что обозначают оси X и Y на рисунке?

В kdeplot, ось X представляет плотность, а ось y представляет количество наблюдений с этими значениями. В отличие от гистограммы, он применяет метод сглаживания, чтобы попытаться оценить «истинное» распределение данных за шумными наблюдаемыми данными.

2. Сохраняются ли значения в noise_dct_data и ground_truth_dct_data, коэффициентах DCT?

На основании того, как вы настроили свой код, да, эти переменные сохраняли результат преобразований DCT, которые вы делаете.

3. Ось Y представляет частоту соответствующих ей коэффициентов DCT?

Да, но со сглаживанием. Аналог гистограммы, но не совсем то же самое.

4. Подходит ли гистограмма для представления распределения коэффициентов DCT?

Это зависит от количества наблюдений, но если у вас достаточно данных, гистограмма должна давать очень похожие результаты.

5. Коэффициенты DCT обычно классифицируются на три поддиапазона на основе их частот, а именно: низких, средних и высоких частотных диапазонов. Какое пороговое значение мы можем использовать для классификации коэффициента DCT в диапазоне низких, средних или высоких частот? Другими словами, как мы можем классифицировать радиальные полосы частот коэффициента DCT?

Я думаю, что этот вопрос, возможно, слишком сложен, чтобы отвечать на него в стеке, но мой совет здесь заключается в том, чтобы попытаться выяснить, как Авторы статьи сделали эту задачу. В цитируемой статье «Оценка качества слепого изображения: естественный статистический подход к сцене в области DCT», по-видимому, говорится о функции радиального базиса (RBF), но это похоже на способ обучения контролируемой модели на данных частоты для прогнозирования. общее качество сканирования.

Что касается разделов данных, они заявляют: «Для сбора информации о направлении из локальных исправлений изображения блок DCT разделен по направлению. ... Верхний, средний и нижний разделы соответствуют низкочастотным , среднечастотные и высокочастотные поддиапазоны DCT соответственно. "

Я полагаю, что, по крайней мере, в одном из их сценариев ios разделы определяются DCT поддиапазона. (См. https://ieeexplore.ieee.org/document/499836) Похоже, существует много литературы по этим типам подходов.

...