2015-06-25 2 views
5

После прореживания простых изображений с использованием: img_decim_arr = img_arr[::2,::2], я получил гистограмму, очень похожую на исходную гистограмму изображения: enter image description here
Прореживание с помощью: skimage.measure.block_reduce(img_arr, block_size = (2,2), func=np.mean) (2x2 блока усреднения), который рекомендуется методом субдискретизации (находятся на StackOverflow в некоторое обсуждение) дает очень характерную гистограмму: enter image description here
Каждый второй бит больше. Я не уверен, возможно, это связано с некоторым эффектом сглаживания. Может ли кто-нибудь объяснить и дать некоторые теоретические намеки о том, как downsampling влияет на гистограмму изображения (2D-сигнал)?Необычные гистограммы после прореживания изображения

+1

ли построено дискретные данные? Вы можете получить неприятные визуальные эффекты при выборе слишком маленьких бункеров для дискретных данных. Я попробую изменить количество ящиков и посмотреть, удалит ли этот эффект. – cel

+0

Да, цветное пространство изображения 8-бит в оттенках серого, таким образом, количество ящиков 256, по одному для каждой интенсивности. – MarcinBurz

ответ

1

Проблема заключается в функции np.mean, потому что она не округляет до целых чисел и возвращает float.

import numpy as np 
import skimage.measure 

a = (10 * np.random.randn(10,10) + 127).astype(np.uint8) 
a 
Out[4]: 
array([[121, 124, 139, 129, 130, 114, 127, 96, 114, 135], 
     [127, 132, 102, 142, 119, 107, 138, 130, 141, 132], 
     [113, 132, 132, 118, 121, 120, 142, 115, 124, 128], 
     [127, 121, 129, 129, 121, 119, 126, 113, 128, 116], 
     [144, 131, 123, 131, 130, 137, 140, 142, 127, 128], 
     [127, 126, 124, 115, 127, 125, 122, 126, 147, 132], 
     [118, 119, 117, 117, 133, 149, 122, 120, 116, 138], 
     [147, 147, 127, 117, 123, 123, 136, 121, 139, 129], 
     [142, 129, 113, 111, 130, 116, 137, 127, 106, 148], 
     [132, 141, 141, 142, 119, 132, 126, 115, 131, 122]], dtype=uint8) 

b = skimage.measure.block_reduce(a, block_size = (2,2), func=np.mean) 
b 
Out[6]: 
array([[ 126. , 128. , 117.5 , 122.75, 130.5 ], 
     [ 123.25, 127. , 120.25, 124. , 124. ], 
     [ 132. , 123.25, 129.75, 132.5 , 133.5 ], 
     [ 132.75, 119.5 , 132. , 124.75, 130.5 ], 
     [ 136. , 126.75, 124.25, 126.25, 126.75]]) 

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

Проверьте это:

a = (10 * np.random.randn(200,200) + 127).astype(np.uint8) 
b = skimage.measure.block_reduce(a, block_size = (2,2), func=np.mean) 
hist(b.ravel(), bins=255) 

enter image description here

белые биты фактически ноль в массиве, что hist функция возвращает. Это становится еще хуже, если вы заставляете округление в моем игрушечном например:

hist(b.ravel().astype(np.uint8), bins=255) 

Ugly histogram

Придав ему бункера и диапазон решает эту проблему. Даже если вы увеличите близко

hist(b.ravel().astype(np.uint8), bins=255, range=(0,255)) 

Good histogram

Zoomed good histogram